Все никак не мог найти минимальный простой код работы с АЦП в 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 делений.
а для АЦП и линейного датчика необходимы коэффициенты типа таких y=kx+b где к тангенс b смещение.
Но, иногда и диод - вполне себе датчик!
ADIF is cleared by writing a logical one to the flag."
ADCSRA|=(0<<ADIF) не имеет смысла так как
N or 0 = всегда N