|
терморегулятор, помогите |
|
|
|
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. Когда использовал прерывание АЦП, то у меня все работало. Но хочется упростить немного код (пусть хоть потребляет больше) Схемку прилагаю. Подскажите что не так, я уже не знаю чего делать.
Эскизы прикрепленных изображений
|
|
|
|
|
 |
Ответов
|
Jul 31 2008, 11:57
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(Lost_Viking @ Jul 31 2008, 14:19)  Теперь заметил проблему: все время скачет младшая цифра, причем очень быстро. 1. TL431 ему в опору, чтоб не баловался. 2. Noise canceler ему в мозги, иначе у младшего разряда нервный тик не пройдет. 3. Накопление методом скользящего среднего вне зависимости от того, удался ли п.2. Что же Вы, уважаемый, плохо воспитываете свой девайс ?
|
|
|
|
|
Jul 31 2008, 14:47
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091

|
Цитата(_Pasha @ Jul 31 2008, 15:57)  1. TL431 ему в опору, чтоб не баловался. 2. Noise canceler ему в мозги, иначе у младшего разряда нервный тик не пройдет. 3. Накопление методом скользящего среднего вне зависимости от того, удался ли п.2. Что же Вы, уважаемый, плохо воспитываете свой девайс ?  1. насчет TL431 мне тоже пришла идея. А 78L05 пойдет? Только я не помню: 78 - это для плюса, а 79 - это для минуса? Или наоборот? 2. шозах?  что-то слышал об этом, вроде даже в даташите. 3. По-подробнее плиз. Сдается мне, что в этом пункте я еще больше внесу погрешность измерения. Просто я пока еще молодой папа  Цитата(defunct @ Jul 31 2008, 16:04)  Иными словами в левой схеме положение переменного резистора может управлять только лаем собак на луну. подтверждаю  Хотя немножко напряжение на входе АЦП регулировалось. Совсем чуть-чуть. Переменник 2.4кОм. Цитата(xemul @ Jul 31 2008, 17:01)  Типовое значение для входного сопротивление АЦП указано в таблице "ADC Characteristics" как 100 МОм. предлагаю Мегометром брякнуть его  Нашел я инфу про ADC Noise Reduction. Как стремно это дело работает: все выключается на время преобразования. Бррр... Щаззз проверим.
Сообщение отредактировал Lost_Viking - Jul 31 2008, 14:01
Эскизы прикрепленных изображений
|
|
|
|
|
Jul 31 2008, 17:05
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Цитата(Lost_Viking @ Jul 31 2008, 17:47)  78 - это для плюса да Цитата(Lost_Viking @ Jul 31 2008, 17:47)  2. шозах?  что-то слышал об этом, вроде даже в даташите. на время преобразования АЦП ядро МК уходит в спячку и просыпается по прерыванию окончания преобразования АЦП. Цитата(Lost_Viking @ Jul 31 2008, 17:47)  1. насчет TL431 мне тоже пришла идея. А 78L05 пойдет? термостабилизация конечно же лучше у TL431, но на худший случай пойдёт. Цитата(Lost_Viking @ Jul 31 2008, 17:47)  а 79 - это для минуса? Или наоборот? гугле - 79L05 Datasheet pdf - Negative-Voltage Regulators Цитата(Lost_Viking @ Jul 31 2008, 18:29)  можешь хотя бы примерно рассказать про данный метод? или, хотя бы, алгоритм если есть. очень просто скользящее среднее, тоже о скользещем среднем
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
Jul 31 2008, 17:38
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091

|
Цитата(sKWO @ Jul 31 2008, 21:05)  как я понял - это просто среднее какое-то значение. блин, и там погрешность, и тут ... Цитата(xemul @ Jul 31 2008, 21:17)  Найдите что-нибудь вроде "Цифровые фильтры" Р. Хемминга - там все доступно.  я умер от этой книги. ничего не понял. мне проще стабилизировать опорное напряжение и питание, чем разобраться в этих греческих символах Нашел вот что.Я смотрю там через операционник подают измеряемое напряжение. Только я не понял зачем там обратная связь в операционнике?
Сообщение отредактировал Lost_Viking - Jul 31 2008, 17:47
|
|
|
|
|
Jul 31 2008, 18:10
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(Lost_Viking @ Jul 31 2008, 21:38)  как я понял - это просто среднее какое-то значение. блин, и там погрешность, и тут ... Вряд ли погрешность обработки превысит погрешность АЦП АВР  . Цитата  я умер от этой книги. ничего не понял. мне проще стабилизировать опорное напряжение и питание, чем разобраться в этих греческих символах Код u16_t Yavg;
for(;;) { Yavg -= Yavg/256; Yavg += ADCH; } Запуск и готовность АЦП за Вами. Утверждается, что в старшем байте Yavg получим фильтр НЧ с частотой среза = частоте запуска АЦП/256 с погрешностью обработки <0.5 LSB, по АФЧХ эквивалентный RC цепочке с такой же частотой среза. Почему? Хемминг уже рассказал, у меня лучше не получится  . Цитата Нашел вот что.Я смотрю там через операционник подают измеряемое напряжение. Только я не понял зачем там обратная связь в операционнике? Операционник включен повторителем и согласует входной делитель со входом АЦП. Использование в нем LM358 и заявление "3. Входное напряжение – 0..100В" оставим на совести автора.
|
|
|
|
|
Jul 31 2008, 18:50
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-04-08
Пользователь №: 37 091

|
Цитата(xemul @ Jul 31 2008, 22:10)  Операционник включен повторителем и согласует входной делитель со входом АЦП. Использование в нем LM358 и заявление "3. Входное напряжение – 0..100В" оставим на совести автора.  там и на 1000 вольт есть, если поищешь. Короче, вот мои соображения: - на вход АЦП повесить ФНЧ из RC цепочки с частотой среза примерно 50Гц.
- использовать внешний ИОН на каком-либо стабилизаторе
- использовать КР514ИД2 по совету kipmaster'а
- наконец перенести все с макетной платы на печатку, предварительно подумав о развязке земли
- если все это не поможет, то использовать опцию "подавитель шумов"
- если и это не поможет, то использовать цифровой фильтр
подскажите пожалуйста как грамотно отделить питание аналоговой части от цифровой?
Сообщение отредактировал Lost_Viking - Jul 31 2008, 19:28
|
|
|
|
|
Jul 31 2008, 20:48
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(Lost_Viking @ Jul 31 2008, 22:50)   там и на 1000 вольт есть, если поищешь. Проблема не верхнем пределе, а в нижнем. LM358 не является ОУ с диапазоном rail-to-rail ни по входу, ни по выходу. Цитата [*]использовать КР514ИД2 по совету kipmaster'а имхо, при разумной смехотехнике и трассировке достаточно отключать индикаторы на время преобразования АЦП. Цитата [*]если все это не поможет, то использовать опцию "подавитель шумов" Вы собираетесь биться за 9 честный бит? А "внешний ИОН на каком-либо стабилизаторе" у Вас какую точность опоры обеспечит? А где брать в розницу резисторы 0.25% Вы уже знаете? Или это задача для души? Тогда все-таки начните с теории. Цитата [*]если и это не поможет, то использовать цифровой фильтр Не поможет от чего? От мельтешения младшего разряда на индикаторе? Да тупо пропустите сигнал с АЦП через цифровой ФНЧ с частотой среза в 0.5 Гц - будет мельтешить не чаще раза в секунду. Только точности это не добавит, хотя и не убавит.
|
|
|
|
Сообщений в этой теме
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  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      Stanislav_S Цитата(Lost_Viking @ Jul 31 2008, 23:50) ... Jul 31 2008, 20:24       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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|