реклама на сайте
подробности

 
 
> терморегулятор, помогите
Lost_Viking
сообщение Jul 30 2008, 12:01
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 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. Когда использовал прерывание АЦП, то у меня все работало. Но хочется упростить немного код (пусть хоть потребляет больше)
Схемку прилагаю.

Подскажите что не так, я уже не знаю чего делать.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
domowoj
сообщение Aug 5 2008, 16:41
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486



Усреднение не всегда есть хорошо.
Если есть время( а оно у автора есть) лучше применить вероятностный метод
(не знаю как он называтся по научному)

мз массива оцифрованных значенний выбрать наиболее часто встречающееся.


--------------------
И на камнях растут деревья!
Go to the top of the page
 
+Quote Post
xemul
сообщение Aug 5 2008, 21:55
Сообщение #3



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(domowoj @ Aug 5 2008, 20:41) *
Усреднение не всегда есть хорошо.
Если есть время( а оно у автора есть) лучше применить вероятностный метод
(не знаю как он называтся по научному)

мз массива оцифрованных значенний выбрать наиболее часто встречающееся.

Вы предлагаете построить гистограмму выборки? Могу предположить, что закон распределения для выборки, не очень искаженной какими-либо неприличными факторами, будет близок к нормальному, и, соответственно, максимум распределения совпадет со средним значением выборки. Если же закон распределения будет даже несимметричен, то имеет смысл сначала проверить смехотехнику и программу, а потом уж пускаться во всякие тяжкие.
Если выборка содержит выбросы (ну, н-р, АЦП не вовремя прочитали), то их, как уже отметил ув. rezident, можно попробовать отрезать медианным фильтром.
Но:
1) нужны ли такие навороты в придумываемой коробочке?
2) готов ли автор (которого пугают греческие буквыsmile.gif) лезть в теорию измерений? Там этих буковок...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 4th August 2025 - 23:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01566 секунд с 7
ELECTRONIX ©2004-2016