Szerző: Fizikus, idő: Feb 5, 2010, Olvasva: 39978, Oldal olvasási idő: kb. 5 perc
Az AVR belső, beépített analóg-digitális átalakítójának használata
Most hogy röviden tárgyaltuk az ADC alapjait, nézzük meg, hogyan kell használni az AVR mikrokontroller beépített analóg-digitális átalakítóját.
Ahhoz, hogy az ADC működjön, szükséges az alábbi lábak bekötése:
AREF = erre a lábra kell kötni a külső referencia feszültséget az ADC átalakító számára, ez az a feszültség, ami az ADC konverzió legmagasabb digitális értékhez fog tartozni (10 bites ADC esetén 210 = 1024). Az AREF maximális értéke 5V lehet. A legtöbb chip tartalmaz belső referenciafeszültséget is (2.56V), így ezt is használhatjuk.
AGND = föld (0V) az AVR analóg részei számára
AVcc = tápfeszültség (5V) az AVR analóg részei számára
Kezdetnek elég, ha a referencia feszültségszintnek a stabilizált 5V-ot használjuk, ekkor az AVcc és az AREF lábakat a stabil 5V-ra (Vcc) kötjük, az AGND lábat pedig a földre (GND). Az AREF lábon stabil feszültségnek kell lennie, különben a mérés pontatlan, megbízhatatlan lesz, ezért zavarszűrés céljából az AREF és GND lábak közé egy 0,1 µF-os (100nF) szűrőkondenzátort kell kötni.
Én is a stabilizált 5V-ot fogom használni referencia feszültségszintnek az elkövetkező példákban, mert a robot vezérlőpanelja korábban úgy lett kialakítva, hogy az AREF lábra a Vcc lett kötve.
ADC csatornák
Az Atmega8-ba beépített ADC-nek 8 csatornája van, tehát 8 különböző lábról tud jelet venni. Ezáltal akár 8 különböző analóg érzékelőt is ráköthetünk a mikrokontrollerre, és külön-külön leolvashatjuk az értékeiket.
Az AVR-nek valójában csak egyetlen belső ADC átalakítója van. Amint az az alábbi ábrán látható, az ADC csatornák meg vannak osztva PORTC-vel (közösek), és egy analóg multiplexer (csatornaválasztó kapcsoló) vezérli, hogy PORTC melyik lábain történjen a mintavátelezés (ezt az ADMUX regiszterben adhatjuk meg). A mintavételezés megkezdése előtt az ADMUX értékét meg kell adni.
ADC regiszterek
Amint tudjuk, az adott belső modulhoz (perifériához) tartozó regiszterek (pl ADC, Timer, USART…) a CPU és a periféria közötti kommunikációt biztosítják. Az ADC is az I/O lábakon keresztül érhető el. Az ADC-t a hozzá kapcsolódó regiszterekkel állíthatjuk be a megkívánt működési módra, és az átalakítás eredményét is egy megfelelő regiszter használatával kapjuk meg. Az ADC-hez csak 4 regiszter tartozik:
ADC Multiplexer kiválasztó regiszter – ADMUX : a referenciafeszültség és a bemeneti csatorna kiválasztására szolgál.
ADC kontrol és státusz regiszter A – ADCSRA : amint a neve is mutatja, az ADC állapotát jelzi és az ADC vezérlésére szolgál
ADC adat regiszter – ADCL és ADCH : az analóg-digitális átalakítás eredménye van ebben a két regiszterben
ADC beállítás / inicializálás
A különböző ADC működési módokat az ADMUX és ADCSRA regiszterekkel tudjuk beállítani.
Az ADMUX regiszter az alábbi biteket tartalmazza :
REFS1, REFS0 – ezek a bitek állítják be a referencia feszültségszintet az alábbi táblázatnak megfelelően:
A későbbiekben én a második opciót fogom használni, a referenciaszintünk a Vcc (5V) lesz. Ezért a regiszteren belül ezt a bitet így állítjuk be: ADMUX=(1<<REFS0) ;
ADLAR – Az ADC eredménye alapértelmezettként jobbra rendezett, de az ADLAR bit értékének megváltoztatásával balra rendezettre is átállítható.
MUX3-MUX0 – ADC port kiválasztás binárisan megadva Kezdetben 0000 értéket adunk meg, mert majd csak később, közvetlenül az ADC mérés előtt állítjuk be a csatornát.
Az ADCSRA regiszter az alábbi biteket tartalmazza :
ADEN – Mielőtt a konverziót végrehajtanánk az ADC-t engedélyezni kell. Az ADC engedélyezve ha értéke 1, kikapcsolva ha 0
ADFR – Az ADC működhet egyszeri mérés (Single Conversion) és folyamatos mérés (Free-running) módban. Egyszeri mérés módban az ADC az átalakítás után leáll, míg folyamatos mérés esetén egyfolytában konvertál (elvégez egy átalakítást, majd utána azonnal elkezdi a következő átalakítást). Ha 1, akkor folyamatos mérés fut, ha 0, akkor egyszeri.
ADSC – Folyamatos működési módban (ha 1-re állítjuk) elindul a mérés, az ADC beállítása új konverzióra azonnal megtörténik, miután az előző mérés befejeződött és utána folyamatosan fut tovább. Egyszeri működési módban a mérést magunknak kell indítani. Az ADSC bit-et 1-nek kell beállítani ahhoz, hogy az ADC elvégezzen egy konverziót. A bit értéke mindvégig 1 marad, amíg a mérés folyamatban van, értéke automatikusan 0-ra vált amikor a mérés elkészült. Ezen bit értékének a vizsgálatával tudjuk megnézni, hogy a konverzió megtörtént-e, és várhatunk addig, amíg az ADC átalakítás véget nem ér. Például az alabbi while ciklus folyamatosan ismétlődik, amíg ADSC értéke 1 és közben semmit sem csinál, de azonnal továbbmegy amint ADIF értéke 0 lesz (kész a konverzió): //várakozás amíg az ADC átalakítás befejeződik
while (ADCSRA & (1<<ADSC));
ADIF – ez az ADC megszakításjelző bit (Interrupt Flag), értékét a hardver 1-nek állítja be ha az ADC átalakítás befejeződött.
ADIE – ez az ADC megszakításengedélyező bit (Interrupt Enable), Ha 1 akkor a mérés végén megszakítás jön létre. Ha 0, akkor a megszakítás kikapcsolva.
ADPS2-ADPS0 – az ADC előosztását választják meg ezek a bitek. Az ADC-nek is szüksége van egy órajelre az átalakítások elvégzéséhez. Az előosztóval tudunk az AVR órajeléből az ADC számára is megfelelő frekvenciát előállítani. Az előosztó értéke 2, 4, 16, 32, 64 és 128 lehet. Az AVR órajelét egy választott értékkel elosztjuk, hogy egy kisebb mintavételi frekvenciát állítsunk elő. Az ADC megfelelő működéséhez egy 50KHz és 200KHz közötti frekvencia kell. A magasabb frekvenciákon az átalakítás gyorsabb, alacsonyabb frekvanciákon viszont sokkal pontosabb.
Olyan értéket kell választanunk, hogy az 1MHz-es (1 000 000 Hz) órajelből az ADC-nek megfelelő frekvenciát állítsunk elő, ezért a 8-as értéket fogjuk használni. Ekkor az ADC frekvenciája =1 000 000 / 8 = 125 000 Hz = 125 KHz, ami 50KHz és 200KHz közé esik. // ADC engedélyezése, Előosztó = Fcpu/8
ADCSRA=(1<<ADEN)|(1<<(ADPS1)|(ADPS0);
ADC konverzió
Na most már minden szükséges beállítást ismerünk. Most írunk egy utasítást, ami konfigurálja az ADC-t, hogy milyen módban működjön, és írunk egy másik utasítást is, ami egy analóg feszültségjelet átalakít digitális jellé. Ezt az utasítást bármikor meghívhatjuk a programunkban, csak a beolvasandó csatorna számát (0-7) kell megadnunk.
A BeolvasADC(csatorna) utasítás az ADC konverzió alapvető sorrendjét mutatja:
ADC eszköz (hardver) engedélyezése (Ez legtöbbször már az ADC inicializásakor megtörténik)
ADC csatorna beállítása (Analóg portok melyik lábát akarjuk mérni)
ADC konverzió kérése (a megfelelő jelzőbit beállítása az ADCSRA regiszterben)
Várakozás amíg az ADCSRA regiszteren belüli ADSC jelzőbit nem mutatja hogy a mérés kész.
Eredmény beolvasása (ADCL olvasása először, utána ADCH)
ADC eszköz (hardver) letiltása/kikapcsolása
Legtöbbször az engedélyezés utáni első ADC konverzió eredménye elég zajos, ezért érdemes lefuttatni egy átalakítást és csak a második konverzió eredményét használni/tárolni.
Beolvas8bitADC() , 8 bites, balra rendezett ADC utasítás kódja:
while(ADCSRA & (1<<ADSC)); // varas az atalakitasra
ADCSRA |= (1<<ADSC); // konverzió elindítás
while(ADCSRA & (1<<ADSC)); // varas az atalakitasra
return(ADCH); // ADC ertek visszaadasa (csak a felso 8 bit (ADCH), az also 2 zajos bit elhagyasa)
}
A főprogramban kiadott Konfig8bitADC(); utasítással állíthatjuk be az ADC-t, hogy 8 bites, balra rendezett 125KHz-es módban működjön.
Az ezután kiadott ADCmeres = Beolvas8bitADC(5); utasítás pl. a PC5-ös lábon lévő bemeneti feszültségjelet alakítja át egy 0-255 közötti 8 bites digitális számmá, és ezt az értéket az ADCmeres nevű változóba írja.
Beolvas10bitADC() , 10 bites, jobbra rendezett ADC utasítás kódja:
ADMUX = (ADMUX & 0b11110000) | csatorna; //ADC csatorna kivalasztasa
ADCSRA |= (1<<ADSC); // ADC konverzio elinditasa
while(ADCSRA & (1<<ADSC)); // varas az atalakitasra
ADCSRA |= (1<<ADSC); // konverzió elindítás
while(ADCSRA & (1<<ADSC)); // varas az atalakitasra
return(ADCL | (ADCH<<8)); // ADC ertek kiolvasasa
}
A fentiekhez hasonlóan a főprogramban kiadott Konfig10bitADC(); utasítással állíthatjuk be az ADC-t, hogy 10 bites, jobbra rendezett, 125KHz-es módban működjön.
Az ezután kiadott ADCmeres = Beolvas10bitADC(0); utasítás pl. a PC0-ás lábon lévő bemeneti feszültségjelet alakítja át egy 0-1023 közötti, 10 bites digitális számmá, és ezt az értéket az ADCmeres nevű változóba írja.
A cikk még nem ért véget, lapozz!