ATMEGA16 датчик температуры цифровой или с АЦП

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
AJIEKCEu
Открыл глаза
Сообщения: 44
Зарегистрирован: Вс ноя 26, 2006 18:46:49

Сообщение AJIEKCEu »

Aheir я пробывал, у меня не получалось:(

ARV
ну вот пытался используя порт АDC0,но чета запутался...

Код: Выделить всё

#include <mega16>
void main(void)
{
char x;
char i;
char j;
char d;
ADMUX=96


#asm
	sbi $06, 7	;разрешение АЦП
	sbi $06, 6	;старт АЦП
#endasm
x=ADCH;
for(i=1;i<4;i++)//перебираем десятки температуры
{ 	for(j=0;j<=9;j++)//перебираем единицы температуры
	{ d=(i*10)+j; //температура в одном числе
	  if(term[d]<=x) //для этой температуры сравниваем резултат АЦП с заготовками
		{__show(i,j); while(1) {}; };//показываем результат
	};
}

(i,j)__show(i,j)
{
char i;
char j;
DDRB=15;
DDRD=15;//ориентируем порты на выход
PORTB=indicate[i];
PORTD=indicate[j];//показываем цифры
}
}
//кодируем выводимые цифры:
char indicate[10]={63,6,91,143,85,109,125,9,127,111}
//Здесь то, что должен показать АЦП при температурах 10, 11, ..., 40 градусов
char term[41]={	0,0,0,0,0,0,0,0,0,0,	//первая строчка фиктивная (на 0 - 9 градусов)
		173,170,167,164,162,159,156,153,150,147,
		144,140,137,134,131,128,125,122,119,116,
		112,109,106,103,100, 97, 94, 92, 89, 86,
		83 }

Скажите мне : вот я хочу подключить резистор 200 Ом к входу допустим АDC7 , а первые 4 входа использовать для вывода....
Я перечитал кучу сайтов обучалок, но так и не получилось меня...
ктонибуть пожалуйста помогите мне со схемкой и с кодом программы...
МяУУууУуУу
Реклама
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение Aheir »

В приложении - код для инициализации АЦП, сгенерированный CodeWizard'ом.
В качестве входов АЦП используются линии 0-3 порта А, линии 4-7 порта А настроены на выход.
АЦП в режиме 10 бит, частота преобразования 125 кГц (камень на 1 МГц), опорник внутренний с емкостью на ноге Aref.
Преобразование начинается при вызове процедуры read_adc(char), где char - переменная-номер входа (0..3), возвращает int - результат преобразования.
Остальная периферия контроллера не инициализирована.

P.S. Этот пост я раз в 10 дольше писал, чем код генерил...
Вложения
ADC.rar
(868 байт) 367 скачиваний
Реклама
Аватара пользователя
AJIEKCEu
Открыл глаза
Сообщения: 44
Зарегистрирован: Вс ноя 26, 2006 18:46:49

Сообщение AJIEKCEu »

Я тоже много много раз генерил и инфы разной перечитал, но не получалось...

а вот тоо что вызывать: read_adc(char)
я не знал... сейчас попробую..

а какой номинал емкости на Ареф вешать? 0.1мФ пойдет?

Допустим если я буду подоватьт на порт А0 напряжение питания и уменьшать.. тоо мне на порт С вывести:
PORTC=read_adc(0);

Так можно???
МяУУууУуУу
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение Aheir »

Ну вы, блин, даете... (с)

Ясен пень, что ежели есть процедура АЦП, то для получения результата преобразования надо ее вызвать... В программе есть комментарии, надо их читать.
0.1 мкФ пойдет, можно до 0.33, хуже не будет.
Если просто вывести в порт С в том виде, какой я дал, то из-за того, что результат преобразования 10-битный, может компилятор ругнуться на несоответствие типов или просто выведутся только младшие 8 бит.
Пробуй.

Если несоответствие типов, можно попробовать
PORTC = (unsigned char)read_ADC(0);
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
AJIEKCEu
Открыл глаза
Сообщения: 44
Зарегистрирован: Вс ноя 26, 2006 18:46:49

Сообщение AJIEKCEu »

Эх....
компилятор пишет неизвестный символ read_ADC
.. млин может я че с прооцелурой... хотя вроде все как надо сгенерировал...
может там библиотека какая нужна.. или ченить с процедуркой?
МяУУууУуУу
Реклама
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение Aheir »

Процедуру сам генерил?
Ну не бывает так, чтоб были ошибки в автокоде...
Корректно процедуру вызываешь? В каком месте проги?
Реклама
Аватара пользователя
AJIEKCEu
Открыл глаза
Сообщения: 44
Зарегистрирован: Вс ноя 26, 2006 18:46:49

Сообщение AJIEKCEu »

Ну вот... код...
вызываю в низу... , может этой процедуры не хвотает?.. я проосто не знаю..:(

Код: Выделить всё

#include <mega16>

#define ADC_VREF_TYPE 0xC0

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In 
// State7=0 State6=0 State5=0 State4=0 State3=T State2=T State1=T State0=T 
PORTA=0x00;
DDRA=0xF0;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 125,000 kHz
// ADC Voltage Reference: Int., cap. on AREF
// ADC Auto Trigger Source: None
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x83;
       PORTC = (unsigned char)read_ADC(0); // ТУт вызываю!!!!! иди в бескон цткле...
while (1)
      {
      // Place your code here
    
      };
}

хелп
МяУУууУуУу
Аватара пользователя
moLCHec
Мявтор!
Сообщения: 825
Зарегистрирован: Вс дек 18, 2005 20:04:42
Откуда: Свердловская обл.
Контактная информация:

Сообщение moLCHec »

При чтении результата преобразования надо соблюдать следую последовательность : сначало нодо прочитать ADCL, затем ADCH. Это требование связано с тем, что после обращения к регистру ADCL процессор блокирует доступ к регистрам данных со стороны АЦП до тех пор. пока не будет прочитан ADCH, это сделано для того чтоб не получилось так чо ты прочитаешь младшие байты одного а старшие другого преобразования.
т.е. твой код должен выглядеть так
unsigned int read_adc(unsigned char adc_input)
{
unsigned int ADC=0;
ADMUX=adc_input|ADC_VREF_TYPE;
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
ADC=ADCL;
ADC|=(int)ADCH << 8;
return ADC;

}
Настоящий кот всегда либо голоден,
либо невыспался ...
azat.hairullin
Родился
Сообщения: 1
Зарегистрирован: Чт сен 08, 2011 06:58:27

Re: ATMEGA16 датчик температуры цифровой или с АЦП

Сообщение azat.hairullin »

Товарищи Нужна помощь!!
необходимо поддерживать оптимальную температуру воды
 на выходе из двигателя с учетом режима работы. Имеется график оптимальной температуры (при этой температуре минимальный расход топлива) в зависимости от нагрузки на двигатель и частоты вращения коленчатого вала (3-х мерный).
Коэффициенты регулирования в контроллер подбираются постоянные в зависимости от режима они должны меняться или постоянны для всех режимов работы двигателя.
В письмо вложил автореферат по подбору используя термостат регулируемый, мне же надо регулировать температуру регулируя частоту вращения насоса.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Re: ATMEGA16 датчик температуры цифровой или с АЦП

Сообщение GP1 »

а где график-то? :shock:
Чем дальше, тем больше становлюсь занудой...
Изображение
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»