|
терморегулятор, помогите |
|
|
|
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. Когда использовал прерывание АЦП, то у меня все работало. Но хочется упростить немного код (пусть хоть потребляет больше) Схемку прилагаю. Подскажите что не так, я уже не знаю чего делать.
Эскизы прикрепленных изображений
|
|
|
|
Сообщений в этой теме
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 domowoj Усреднение не всегда есть хорошо.
Если есть время(... Aug 5 2008, 16:41 rezident Цитата(domowoj @ Aug 5 2008, 22:41) мз ма... Aug 5 2008, 17:00 xemul Цитата(domowoj @ Aug 5 2008, 20:41) Усред... Aug 5 2008, 21:55  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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|