|
терморегулятор, помогите |
|
|
|
Jul 30 2008, 12:01
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091

|
Собираю терморегулятор. Готова динамическая индикация (спасибо форумчанам). Теперь проблема с АЦП. Цитата /***************************************************** Chip type : ATmega16 Clock frequency : 1,000000 MHz *****************************************************/ #include <mega16.h> char Dig[10]; // Массив, с кодами чисел для индикатора с общим анодом char i=0; // счетчик для переключения анодов char e=0; // единицы установленной температуры char d=0; // десятки char s=0; // сотни char s2=0; // единицы измеренной температуры char e2=0; // десятки char d2=0; // сотни char res=0; // в эту переменную поочереди записываются e,d,s или e2,d2,s2 char keys_prev=0; // две переменной для правильной работы кнопок char keys_now=0; // unsigned int current_temp=0; // измеренная температура short temp2=0; // временная переменная short set_temp=0; // установленная температура
char num (void) { // функция, для опроса клавиатуры, и вывода на катоды кода текущего разряда if (PINB.4!=0){ // если кнопка "нагрев" не нажата, то if ((keys_prev!=keys_now)&(PINB.0==0)) e++; // если нажата кнопка "единицы", то прибавить 1 к нулевому разряду (единицы) if (e==10) e=0; // если результат прибавления перевалил за 9, то сбросить его в нуль if ((keys_prev!=keys_now)&(PINB.1==0)) d++; // если нажата кнопка "десятки", то прибавить 1 к первому разряду (десятки) if (d==10) d=0; // если результат прибавления перевалил за 9, то сбросить его в нуль if ((keys_prev!=keys_now)&(PINB.2==0)) s++; // если нажата кнопка "сотни", то прибавить 1 к второму разряду (сотни) if (s==3) s=0; // если результат прибавления перевалил за 9, то сбросить его в нуль if (PINB.3==0) { // если нажата кнопка "сброс", то сбросить все разряды в нуль e=0; d=0; s=0;} switch (i) { // в зависимости от переменной i выбираем что показываем в текущий момент: единицы, десятки, или сотни case 0: res=e; break; case 1: res=d; break; case 2: res=s; break; } return res;} else { // если нажата кнопка "нагрев", то
current_temp=ADCL; // в переменную записываем значение из регистра ADCL current_temp+=((int)ADCH << 8); // прибавляем к переменной значение из регистра ADCH со сдвигом влево на 8 разрядов current_temp=current_temp/2.5; // преобразовываем (ADCH ADCL) в температуру. Т.к. используется внутренний ИОН 2560 мВ, то 2560/1024=2.5 e2=current_temp%10; // получаем единицы измеренной температуры temp2=current_temp/10; // промежуточная операция, для понижения степени d2=temp2%10; // получаем десятки измеренной температуры s2=temp2/10; // получаем сотни измеренной температуры // в зависимости от переменной i выбираем что показываем в текущий момент времени switch (i) { case 0: res=e2; break; case 1: res=d2; break; case 2: res=s2; break; } return res;
;}} // Timer 0 output compare interrupt service routine interrupt [TIM0_COMP] void timer0_comp_isr(void) //обработка прерывания таймера по совпадению с OCR0 { keys_prev=keys_now; //для клавиш keys_now=PINB; //читаем что нажато if (i==3) i=0; //если показатель текущего разряда перевалил за 2, то зажигаем нулевой разряд PORTC=Dig[num()]; //выставляем на катодах число, которое получаем из функции num() switch (i) { //в зависимости от переменной i поочередно подаем питание на аноды case 0: //если i=0, то включаем разряд для единиц PORTD.1=1; //гасим ненужные разряды PORTD.2=1; PORTD.0=0; //включаем нулевой разряд, активный уровень - 0,т.к. используются p-n-p break; case 1: // и т.д. PORTD.0=1; PORTD.2=1; PORTD.1=0; break; case 2: PORTD.0=1; PORTD.1=1; PORTD.2=0; break;} i++; }
// Declare your global variables here
void main(void) { PORTA=0x00; DDRA=0x00; PORTB=0xFF; DDRB=0x00; PORTC=0x00; DDRC=0xFF; PORTD=0x00; DDRD=0xFF;
// Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 0,977 kHz // Mode: Normal top=FFh // OC0 output: Disconnected TCCR0=0x0D; TCNT0=0x00; OCR0=0x03; //задаем частоту развертки. подбирал наглаз.
// Timer/Counter 1 initialization TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00;
// Timer/Counter 2 initialization ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00;
// External Interrupt(s) initialization MCUCR=0x00; MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x02;
// Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // free running режим АЦП ADMUX=0xC0; // Внутренний источник опорного напряжения 2.56В REFS1..0=1; правое выравнивание ADLAR=0,вход ADC0 ADCSRA=0xE4; //ADEN=1(включили АЦП),ADSC=1(начали преобразование),ADATE:1(авто триггер включен),ADIE=0(прерывания от АЦП нам не нужны), делитель на 16
// заполняем массив комбинациями нулей/единиц для катодов Dig[0] = 0xC0; Dig[1] = 0xF9; Dig[2] = 0xA4; Dig[3] = 0xB0; Dig[4] = 0x99; Dig[5] = 0x92; Dig[6] = 0x82; Dig[7] = 0xF8; Dig[8] = 0x80; Dig[9] = 0x90;
#asm("sei") // включаем прерывания while (1) { if (PINB.4==0) { // если нажата кнопка "нагрев", то set_temp=e+d*10+s*100; // вычисляем установленную температуру, исходя из того, что в переменных e,d,s if (current_temp<(set_temp-1)) {PORTD.3=1;}; //если текущая температура ниже установленной на 1 градус, то включаем релюшку if (current_temp>=set_temp) {PORTD.3=0;};} //если текущая температура больше или равна установленной, то выключаем релюшку else {PORTD.3=0;}; }; //если кнопка "нагрев" не нажата, то реле должно быть выключенным. } // game over почему-то в Proteus переменные e2,s2,d2 неправильно считаются. Залил в мегу - на индикаторе 409. Когда использовал прерывание АЦП, то у меня все работало. Но хочется упростить немного код (пусть хоть потребляет больше) Схемку прилагаю. Подскажите что не так, я уже не знаю чего делать.
Эскизы прикрепленных изображений
|
|
|
|
|
 |
Ответов
|
Aug 5 2008, 21:55
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(domowoj @ Aug 5 2008, 20:41)  Усреднение не всегда есть хорошо. Если есть время( а оно у автора есть) лучше применить вероятностный метод (не знаю как он называтся по научному)
мз массива оцифрованных значенний выбрать наиболее часто встречающееся. Вы предлагаете построить гистограмму выборки? Могу предположить, что закон распределения для выборки, не очень искаженной какими-либо неприличными факторами, будет близок к нормальному, и, соответственно, максимум распределения совпадет со средним значением выборки. Если же закон распределения будет даже несимметричен, то имеет смысл сначала проверить смехотехнику и программу, а потом уж пускаться во всякие тяжкие. Если выборка содержит выбросы (ну, н-р, АЦП не вовремя прочитали), то их, как уже отметил ув. rezident, можно попробовать отрезать медианным фильтром. Но: 1) нужны ли такие навороты в придумываемой коробочке? 2) готов ли автор (которого пугают греческие буквы  ) лезть в теорию измерений? Там этих буковок...
|
|
|
|
Сообщений в этой теме
Lost_Viking терморегулятор Jul 30 2008, 12:01 AHTOXA Цитата(Lost_Viking @ Jul 30 2008, 18:01) ... Jul 30 2008, 12:31 MrYuran Кодcurrent_temp=current_temp/2.5; // преобразовыва... Jul 30 2008, 12:40 domowoj Протеус 7.2 .2 с авр работает глючно!!... Jul 30 2008, 15:26 =GM= Цитата(Lost_Viking @ Jul 30 2008, 11:01) ... Jul 30 2008, 15:50 Lost_Viking Цитата(=GM= @ Jul 30 2008, 19:50) У вас н... Jul 30 2008, 17:04  AHTOXA Цитата(Lost_Viking @ Jul 30 2008, 23:04) ... Jul 30 2008, 17:31   Lost_Viking Цитата(AHTOXA @ Jul 30 2008, 21:31) А как... Jul 30 2008, 18:56    AVRdeveloper Цитата(Lost_Viking @ Jul 30 2008, 21:56) ... Jul 31 2008, 06:26     Lost_Viking Цитата(AVRdeveloper @ Jul 31 2008, 10:26)... Jul 31 2008, 10:08      AHTOXA Цитата(Lost_Viking @ Jul 31 2008, 16:08) ... Jul 31 2008, 10:53       Lost_Viking Цитата(AHTOXA @ Jul 31 2008, 14:53) А в и... Jul 31 2008, 11:19    MrYuran Цитата(Lost_Viking @ Jul 30 2008, 22:56) ... Jul 31 2008, 06:42     Lost_Viking Цитата(MrYuran @ Jul 31 2008, 10:42) Я чт... Jul 31 2008, 10:55      MrYuran Цитата(Lost_Viking @ Jul 31 2008, 14:55) ... Jul 31 2008, 11:05  defunct Цитата(Lost_Viking @ Jul 30 2008, 20:04) ... Jul 30 2008, 17:45 GDI ЦитатаВ левой схеме тоже получается делитель, но е... Jul 31 2008, 11:11 defunct Цитата(GDI @ Jul 31 2008, 14:11) Отнють н... Jul 31 2008, 11:55  xemul Цитата(defunct @ Jul 31 2008, 15:55) Посм... Jul 31 2008, 13:01 AHTOXA Цитата(GDI @ Jul 31 2008, 17:11) Отнють н... Jul 31 2008, 11:37 GDI Хочу уточнить чтобы не было иллюзий. В левой схеме... Jul 31 2008, 11:56 defunct Цитата(GDI @ Jul 31 2008, 14:56) P.S. Вхо... Jul 31 2008, 12:04  MrYuran Цитата(defunct @ Jul 31 2008, 16:04) Для ... Jul 31 2008, 12:09   defunct Цитата(MrYuran @ Jul 31 2008, 15:09) Даже... Jul 31 2008, 12:10 _Pasha Цитата(Lost_Viking @ Jul 31 2008, 14:19) ... Jul 31 2008, 11:57 Lost_Viking Цитата(_Pasha @ Jul 31 2008, 15:57) 1. TL... Jul 31 2008, 14:47  xemul Цитата(Lost_Viking @ Jul 31 2008, 18:47) ... Jul 31 2008, 14:54   Lost_Viking Цитата(xemul @ Jul 31 2008, 18:54) Это бу... Jul 31 2008, 15:29    xemul Цитата(Lost_Viking @ Jul 31 2008, 19:29) ... Jul 31 2008, 17:17     Lost_Viking Цитата(xemul @ Jul 31 2008, 21:17) Метод ... Jul 31 2008, 21:10      xemul Цитата(Lost_Viking @ Aug 1 2008, 01:10) ч... Jul 31 2008, 21:29       Lost_Viking Цитата(xemul @ Aug 1 2008, 01:29) Попробу... Aug 4 2008, 18:56        Огурцов Цитата(Lost_Viking @ Aug 4 2008, 18:56) В... Aug 4 2008, 20:57         Lost_Viking Цитата(Огурцов @ Aug 5 2008, 00:57) Бугаг... Aug 5 2008, 07:05          xemul Цитата(Lost_Viking @ Aug 5 2008, 11:05) В... Aug 5 2008, 09:04           Lost_Viking Цитата(xemul @ Aug 5 2008, 13:04) ЗЫЖ я к... Aug 5 2008, 14:50            rezident Цитата(Lost_Viking @ Aug 5 2008, 20:50) К... Aug 5 2008, 15:00             Lost_Viking Цитата(rezident @ Aug 5 2008, 19:00) Кста... Aug 5 2008, 17:14         Tanya Цитата(Огурцов @ Aug 5 2008, 00:57) Бугаг... Aug 5 2008, 16:00  sKWO Цитата(Lost_Viking @ Jul 31 2008, 17:47) ... Jul 31 2008, 17:05   Lost_Viking Цитата(sKWO @ Jul 31 2008, 21:05) очень п... Jul 31 2008, 17:38    xemul Цитата(Lost_Viking @ Jul 31 2008, 21:38) ... Jul 31 2008, 18:10     Lost_Viking Цитата(xemul @ Jul 31 2008, 22:10) Операц... Jul 31 2008, 18:50      Stanislav_S Цитата(Lost_Viking @ Jul 31 2008, 23:50) ... Jul 31 2008, 20:24      xemul Цитата(Lost_Viking @ Jul 31 2008, 22:50) ... Jul 31 2008, 20:48       rezident Цитата(xemul @ Aug 1 2008, 02:48) Да тупо... Jul 31 2008, 22:17 domowoj Цитата(_Pasha @ Jul 31 2008, 18:57) 1. TL... Aug 3 2008, 06:25  Lost_Viking Цитата(domowoj @ Aug 3 2008, 10:25) 1.ТЛк... Aug 3 2008, 14:01 GDI Заглянул в даташит на atmega48_68_168, там указано... Jul 31 2008, 12:37 GDI У атмела есть апликэйшены на темы:
AVR222: 8-Point... Aug 1 2008, 06:54 Lost_Viking Такс, собираю ИОН на TL431OEB. Насколько хорош это... Aug 1 2008, 10:43 MrYuran А может даласовские датчики поставить и не мучитьс... Aug 1 2008, 10:50 Lost_Viking Цитата(MrYuran @ Aug 1 2008, 14:50) А мож... Aug 1 2008, 13:46  xemul Цитата(Lost_Viking @ Aug 1 2008, 17:46) К... Aug 1 2008, 14:54  rezident Цитата(Lost_Viking @ Aug 1 2008, 19:46) К... Aug 1 2008, 15:52  _Pasha Цитата(Lost_Viking @ Aug 1 2008, 17:46) З... Aug 1 2008, 17:30   xemul Цитата(_Pasha @ Aug 1 2008, 21:30) Какая ... Aug 1 2008, 18:01    _Pasha Цитата(xemul @ Aug 1 2008, 22:01) ADLAR=1... Aug 1 2008, 18:19    Lost_Viking Цитата(xemul @ Aug 1 2008, 22:01) ADLAR=1... Aug 1 2008, 21:47 domowoj Lost_Viking
А мож Вам лучше DS18x20 применить, ник... Aug 2 2008, 11:26 Lost_Viking Цитата(domowoj @ Aug 2 2008, 15:26) Lost_... Aug 2 2008, 15:27  Огурцов Цитата(Lost_Viking @ Aug 2 2008, 15:27) М... Aug 3 2008, 12:32 domowoj Хотя бы REF02.
Я бы вообще выключил все генератор... Aug 3 2008, 15:05 Lost_Viking Цитата(domowoj @ Aug 3 2008, 19:05) а 102... Aug 3 2008, 15:18 domowoj Lost_Viking
Может лучше применить ЖК индикатор. Aug 3 2008, 15:31 Lost_Viking Цитата(domowoj @ Aug 3 2008, 19:31) Lost_... Aug 3 2008, 15:46  rezident Цитата(Lost_Viking @ Aug 3 2008, 21:46) P... Aug 3 2008, 17:34 domowoj EXCEL не знаю.
А ЖК от чего? Aug 3 2008, 17:17 Lost_Viking Цитата(domowoj @ Aug 3 2008, 21:17) А ЖК ... Aug 3 2008, 19:56  rezident Цитата(Lost_Viking @ Aug 4 2008, 01:56) с... Aug 3 2008, 20:38 domowoj ADC=1023*Vin/Vref
так будет понятней. Aug 3 2008, 17:43 Lost_Viking вопрос остается открытым: почему в Даташите в этой... Aug 3 2008, 22:34 rezident Цитата(Lost_Viking @ Aug 4 2008, 04:34) в... Aug 4 2008, 16:01 domowoj Если в даташите написано - верь,
но тогда диапазон... Aug 4 2008, 00:13 Dopler Цитатаwhere VIN is the voltage on the selected inp... Aug 4 2008, 08:13 Lost_Viking Цитата(Dopler @ Aug 4 2008, 12:13) Вот чт... Aug 4 2008, 14:39  _Pasha Цитата(Lost_Viking @ Aug 4 2008, 17:39) П... Aug 5 2008, 23:40 Lost_Viking Так, все сделал. Сглаживает здорово!
Огурцов,... Aug 5 2008, 08:16 Огурцов Цитата(Lost_Viking @ Aug 5 2008, 08:16) О... Aug 5 2008, 14:41 rezident Цитата(domowoj @ Aug 5 2008, 22:41) мз ма... Aug 5 2008, 17:00  domowoj Цитата(xemul @ Aug 6 2008, 04:55) Вы пред... Aug 6 2008, 00:54 domowoj Да нет, похоже не медианная. Aug 5 2008, 17:25 rezident Цитата(domowoj @ Aug 5 2008, 23:25) Да не... Aug 5 2008, 17:49 xemul Цитата(_Pasha @ Aug 6 2008, 03:40) Блин, ... Aug 6 2008, 07:54 domowoj Цитата(xemul @ Aug 6 2008, 14:54) А зачем... Aug 6 2008, 15:22 Lost_Viking Сейчас с макетки на плату переведу, и займусь повы... Aug 6 2008, 15:05 loskun Lost_Viking как устройство, получилось?
Вот _http:... Sep 27 2008, 17:38 Twin_by Всем привет. Не стал создавать новую тему. У меня ... Oct 13 2016, 12:09 Dog Pawlowa Скорее всего отладчик неправильно отображает локал... Oct 14 2016, 15:05 Aldec Цитата(Lost_Viking @ Jul 30 2008, 12:01) ... Oct 21 2016, 07:27
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|