Analoog-digitaalmuundur (inglise keeles analog to digital converter, lühend ADC) muundab analoogpinge väärtuse digitaalseks väärtuseks. AVR-i ADC analoogpinge sisend on lubatud 0-toitepinge V piires. Digitaalne väärtus on 10-bitine, kuid selle täpsus on ±2 ühikut. Viga võib veelgi kasvada, kui kiibi toitepinget häirete eest ei kaitsta. ADC jaoks on AVR-il eraldi toite ja võrdluspinge viik. Eraldi toide on mürakindluse pärast ja see ei tohi kiibi toitepingest erineda rohkem kui 0,3 V. Võrdluspinge määrab maksimaalse digitaalse väärtuse. Ehk kui võrdluspinge on 3 V, siis sama pingega sisend annab väärtuseks 210 - 1 ehk 1023 (xmega kontrolleritel 212 - 1 ehk 4095).
AVR ADC töötab võrdlusmeetodil (inglise keeles successive approximation). Lühidalt öeldes toimub mõõdetava pinge võrdlemine kindlate nivoopingetega ja tulemuste esitamine tõeväärtuste-, ehk bitijadana. See meetod on suhteliselt aeganõudev, sest iga biti leidmine lõppväärtuses toimub eraldi. AVR-il kulub töö ajal 13 takti ühe mõõtmise tegemiseks ja 25 takti kõige esimesel mõõtmisel (käivitusel). Need taktid pole aga kontrolleri töötaktid, vaid spetsiaalselt ADC üksuse jaoks sagedusjaguriga saadud taktid. Maksimaalse täpsuse saamiseks peaks ADC takt olema 50-125 kHz (xmega puhul 2 MHz). Kõrgemal taktil täpsus kaob. Vahel on mõõtmiste suur arv olulisem kui täpsus ja siis on suurema sageduse kasutamine põhjendatud.
Mõõtetulemust saab kasutaja lugeda 8- ja 10(12)-bitisena. Kuna AVR on 8-bitine, siis ADC mõõteväärtuste jaoks on sel kaks 8-bitist registrit. Seadistustes saab määrata, kas 10-bitisest väärtusest 2 esimest või 2 viimast bitti lähevad eraldi registrisse. Kui eraldatakse 2 noorimat ehk tulemust vähem iseloomustavat bitti, saab mõõtetulemuse 8-bitisena lugeda - sellist kombinatsiooni nimetatakse vasak-asetusega mõõtetulemuseks (inglise keeles left align). Teistpidist kombinatsiooni, kus kaht tulemusregistrit lugedes tekib 10-bitine arv, nimetatakse parem-asetusega mõõtetulemuseks (inglise keeles right align).
Mõõdetavaid analoogpinge sisendkanaleid on AVR-idel tavaliselt 8, ATtiny seerial üksikud, mõnel ATmega seeria kiibil 16, kuid muundureid on tavaliselt üks. AVR xmega seeria kontrolleritel võib olla muundureid ka kaks. Erinevate sisendite kasutamiseks on kiibis multiplekser. Multiplekseri sisend on spetsiaalse registriga määratav. ADC üksusel on veel mõned omadused: muundamine protsessori magamisrežiimis müra vähendamiseks ja sisemise fikseeritud võrdluspinge (2,56 V, mõnel ka 1 V) kasutamise võimalus.
Näide
Vaja on mõõta ATmega128 ADC kanali 3 pinget vahemikus 0-5 V 8-bitise täpsusega.
#include <avr/io.h> int main(void) { unsigned char result; // Võrdluspingeks AREF viigu valimine (eeldatavasti on see ühendatud 5 V toiteahelasse) // Multiplekseriga kanali 3 valimine // Tulemus on vasak-asetusega ADMUX = (1 << REFS0) | (1 << ADLAR) | (3); // ADC üksuse käivitamine, // teisendustakti seadmine 16 korda aeglasemaks töötaktist ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADSC); // Mõõtmise lõpetamise ootamine while (ADCSRA & (1 << ADSC)) continue; // 8-bitise tulemuse lugemine result = ADCH; }
Vaja on mõõta ATxmega128A1U ADC viigu 3 pinget kasutades ADCA muunduri kanalit CH0 vahemikus 0-2 V (Vcc/1.6) 8-bitise täpsusega. Märgiga lugemist kasutatakse selleks, et sisendpinge 0 V läheduses tagastaks ka 0 V ADC mõõtetulemusena.
#include <avr/io.h> int main(void) { unsigned char result; // Seadista ADCA lugema märgiga tulemit 8-bitise resolutsiooniga ADCA.CTRLB = (ADC_CONMODE_bm|ADC_RESOLUTION_8BIT_gc); // Seadista ADCA pingevõrdluseks VCC/1.6 pinge ADCA.REFCTRL = (ADC_REFSEL_VCC_gc); // Seadista ADCA taktsagedusega F_CPU/32 ADCA.PRESCALER = (ADC_PRESCALER_DIV32_gc); // Seadista ADCA kanal 0 lugema vaid üht sisendit ADCA.CH0.CTRL = (ADC_CH_INPUTMODE_SINGLEENDED_gc); // Seadista ADCA kanal 0 lugema viiku ADC3 ADCA.CH0.MUXCTRL = (ADC_CH_MUXPOS_PIN3_gc); // Käivita ADCA ADCA.CTRLB |= (ADC_ENABLE_bm); // Alusta lugemit kanalis CH0 ADCA.CH0.CTRL |= (ADC_CH_START_bm); // Oota, kuni CH0 on lõpetanud lugemise while((ADCA.CH0.INTFLAGS & ADC_CH_CHIF_bm) != 0x01); // Loe tulemus result = ADCA.CH0RES; }