19.7.2008

AVR ADC (АЦП) - это просто

Все никак не мог найти минимальный простой код работы с АЦП в 10-и битном режиме. Пришлось взять максимально близкое и подправить.

Вот оно:


	ADCSRA |=  (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // Set ADC prescalar 
	ADMUX |= (1 << REFS0); // Set ADC reference to AVCC
  	
	// no left ajustment needed in 10 bit mode!
	//ADMUX |= (1 << ADLAR); // Left adjust ADC result to allow easy 8 bit reading
   	// No MUX values needed to be changed to use ADC0
	

   	ADCSRA |= (1 << ADFR);  // Set ADC to Free-Running Mode
   	ADCSRA |= (1 << ADEN);  // Enable ADC
   	ADCSRA |= (1 << ADSC);  // Start A2D Conversions


	for(;;) {
		if (ADCSRA&(1<<ADIF)){
			//conversion is ready
			// reset converstion complete flag
			ADCSRA|=(1<<ADIF);
		
			// read data, ADCL - first
			t=ADCL;
			r=ADCH;
			r=(r<<8)+t;;

			// now we have the result in 16 bit var 'r'

			// output result
			//itoa(r, buf,10);
			//my44780_command_clear(&disp1);
			//my44780_send_string(&disp1,buf);
			
			_delay_ms(200);
		}
   }

Число в переменной r будет равно (или близко к) 1023, если измеряемое напряжением близко к AREF, и будет равно 0 при напряжении GND.

Расчет вольтажа прост. Например, AREF – 5В.

Тогда на единицу замера приходится: 5/1024=0.004883 В

Если мы получили число 512, то значит напряжение = 0,004883*512=2.5В

Например, подключив сенсор температуры и получив значение 95, что означает 0.46В, можно получить температуру по даташиту. Для моего сенсора температуры TMP37FT9 это указывает на температуру в 23 градуса С. Но на самом деле у меня в комнате 25.5 и эта погрешность может связана или с браком самого сенсора, или с тем, что я никак не защитил от помех все компоненты (ни одного конденсатора для защиты от помех) или, потому что я сначала перепутал полюса у сенсора, он разогрелся за далеко за 100 градусов, я обжог палец и возможно, в итоге, теперь он кривой.

Есть еще одна тонкость. На измерение влияет включен или выключен pull-up резистор на ноге! И если пул-ап включен, то возникает дополнительное напряжение, которое подтягивает измеряемое напряжение повыше. У меня пул-ап дает примерно 10 делений.

Комментарии
Pavel (, UA) 2009-04-30 23:00:00 #1 link
А прерывания мы не используем?
Артем Кучин (Москва, Россия) 2009-05-01 22:27:52 #2 link
Используем. Но это - простейший пример. А пример чем проще - тем лучше.
Zaplatin (иваново, россия) 2012-08-25 14:17:09 #3 link
Если хочешь нормальную точность температуры есть смысл не использовать АЦП а смотреть в сторону датчика DS18B20+PAR (200р) подключение 2-х жильным кабелем, правда время опроса большое.
а для АЦП и линейного датчика необходимы коэффициенты типа таких y=kx+b где к тангенс b смещение.
Артем Кучин (Москва, Россия) 2012-08-27 01:00:30 #4 link
да разумеется, сейчас этого чуда с цифровым интерфейсом полно развелось.
Но, иногда и диод - вполне себе датчик!
Константин (Гомель, Беларусь) 2012-09-07 11:49:29 #5 link
ADCSRA|=(1<<ADIF); Извиняйте если не правильно понял, но по мойму надо ADCSRA|=(0<<ADIF);
Константин (Гомель, Беларусь) 2012-09-07 13:51:34 #6 link
Поспешил я и наделал глупости, действительно флаг готовности сбрасывается логической единицей. Впредь мне надо лучше читать даташиты..."Alternatively,
ADIF is cleared by writing a logical one to the flag."
Артем Кучин (Москва, Россия) 2012-09-08 14:29:08 #7 link
Угу. И еще логика просто:

ADCSRA|=(0<<ADIF) не имеет смысла так как

N or 0 = всегда N
Михаил (Пензе, Россия) 2012-11-21 14:15:49 #8 link
нормальный такой пример, просто и понятно
Добавить комментарий
Ваше имя:
город: страна:
Комментарий:

Введите код "10981" -
Сообщения не по теме будут удалены. Вопросы не по теме следует направлять по электронную почту. Ваши данные будут запомнены в cookie для удобства. HTML запрещен.

(C)1999-2021 Артем Кучин
Email: artem@artem.ru
На письма без темы или без имени отправителя не отвечаю

При использовании материалов ссылка на сайта www.artem.ru обязательна! Автор оставляет за собой право отказать в праве использования материалов на безвозмездной основе без объяснения причин. Материалы сайта защищены законом об авторских и смежных правах.

Цена домена: 1 500 000 руб.