Fórum témák

» Több friss téma
Cikkek » WILL-I V2.0 (Robotika és AVR kezdőknek)
WILL-I V2.0 (Robotika és AVR kezdőknek)
Szerző: Fizikus, idő: Feb 5, 2010, Olvasva: 39981, Oldal olvasási idő: kb. 3 perc
Lapozás: OK   2 / 9

Analóg és digitális jelek

A mindennapi életben a minket körülvevő fizikai mennyiségek folytonosak. Ez alatt azt kell érteni, hogy általában két szélső érték között végtelen sok értéket vehetnek fel, és időben változhatnak is. Ahhoz hogy egy mennyiséget a mikrokontrollerrel mérni tudjunk, kell egy érzékelő, mely a mérendő jellel (jelen esetben a fényerősséggel vagy az érzékelt tárgyak távolságával) arányos elektromos jelet állít elő, amit már kezelni tud a mikrokontroller.
Az elektronikán belül a legtöbb esetben ez az elektromos jel az érzékelők kivezetésein megjelenő analóg feszültségjel. Ahhoz hogy ezt a jelet a mikrovezérlők digitális világában fel tudjuk dolgozni, egy analóg-digitális átalakítóra (ADC) van szükség. A legtöbb modern mikrokontroller, mint pl. az AVR is, rendelkezik beépített ADC átalakítóval. Az ADC a bemeneti analóg feszültségjelet átalakítja egy digitális jellé (bináris számmá). Ennek a számnak a lehetséges maximális értékét az ADC felbontása határozza meg. Az AVR analóg-digitális átalakítója 10 bites, azaz 0-1023 között vehet fel értékeket (210 = 1024).

Az ADC két referencia feszültségszint közötti feszültségtartományban mér. Az alsó a föld (GND) a felső peidg ARef, melynek maximális értéke 5V (AVcc) lehet. Tehát az ADC a 0 – ARef feszültségtartományba eső analóg bemeneti jelet alakítja át egy 0 – 1023 közötti digitális jellé (bináris számmá). Ha a bemenő feszültség 0V (GND), akkor a kimenet 0, ha a bemenő feszültség ARef-el egyezik meg, akkor a kimenet értéke 1023, ha pedig a bemenő feszültség pl. a referenciafeszültség fele, akkor a kimenet értéke ezzel arányosan 512 lesz. Az alábbi ábra ezt szemlélteti ahol ARef= 5V.

Az AVR egy kifinomult elektronikus eszköz, amely csak bizonyos határértékek közé eső feszültséget tud mérni. A határértéken kívül eső feszültségek károsíthatják a mikrokontrollert. Az AVR adatlapján az szerepel, hogy az ADC lábon a mérendő bemeneti jelnek AGND (0V) és Vcc (5V) között kell lenni. Ha a referencia feszültségnél (a belső 2,56 vagy a külső max. 5V) nagyobb feszültséget akarunk mérni, akkor egy feszültségosztó kapcsoláson keresztül kell a bemeneti jelet a mikrovezérlőre kötni.

Az ADC egy 10 bites számot eredményez (legyen mondjuk ez a szám pl. 693), amit nem lehet egyetlen bájtban tárolni ( egy bájt 8 bitből áll, ami 256 db értéket vehet fel (0-255-ig)), ezért minden ADC konverzió erédménye két bájtban (esetünkben az ADCH és ADCL adatregiszterekben) tárolódik el. Vegyük észre, hogy az egyik bájt két bitjét használjuk csak, a maradék 6 bitet nem. Az eredmény alapértelmezettként jobbra rendezett, de az ADMUX regiszter ADLAR bitjének megváltoztatásával balra rendezettre is átállítható (nemsokára meglátjuk hogy ez miért is lesz jó nekünk).

Megpróbálom egy kicsit érthetőbben szemléltetni az alábbi ábrán is:

Mivel az AVR-t magasszintű programozási nyelven (C) programozzuk, elég könnyű megfeledkezni arról, hogy egyes regiszterek mint pl az ADCH és ADCL ténylegesen hardverhez kapcsolódó regiszterek. Amikor az ADC-t használjuk, akkor a konverzió bármikor kész lehet (mint ahogy pl. egy megszakítás (interrupt) is bármikor bekövetkezhet), ezért ezeknek a hardverhez kötödő bájtoknak a használata némi körültekintést igényel, mert például ha a programunk éppen ADCH értékét olvassa ki, ADCL értékét pedig éppen ezzel egy időben frissíti az ADC, akkor könnyen előfordulhat hogy a kiolvasott ADCH-ADCL értékek nem ugyanahhoz, hanem két különböző méréshez tartoznak (ADCH az egyik mérésből származik, ADCL pedig már egy másik mérésből), ezáltal rossz mérési eredményt adva. Ha hamis értékekkel dolgozunk az zavart okozhat robotunk vezérlésében. Az AVR tervezése során hardveresen szüntették meg ezt a problémát.

Mindig ADCL-t kell először kiolvasni, utána ADCH-t, hogy biztosítsuk hogy az ADC adatregisztereiben tárolt értékek mindíg ugyanahhoz a méréshez tartozzanak. Amikor ADCL értékét kiolvassuk, akkor az ADC adatregiszterekhez való hozzáférése blokkolva lesz (le lesz tiltva), és az ADC adatregiszterek addig nem frissítődnek újra amíg ADCH értékét is ki nem olvassuk. Ez azt jelenti, ha ADCL-értékét kiolvassuk és egy ADC konverzió elkészülne még mielőtt ADCH értékét is kiolvasnánk, akkor egyik regiszter értéke sem frissül, az ADC konverzió eredménye elvész.
Miután ADCH értékét is kiolvastuk, akkor az ADC újra hozzáférhet az ADCL és ADCH adatregiszterekhez, és frissítheti őket az újabb ADC mérés eredményével. Azaz kiolvasás alatt a következő mérés adata nem tud beíródni a regiszterbe, így elkerülhető, hogy az alsó bit az előző, a felső meg az éppen most futó mérési eredményt adja vissza. Tehát csak az alábbi egyszerű szabályt kell alkalmazni az ADC eredmény kiolvasása során:
                    MINDIG az ADCL regiszter értékét olvassuk ki ELŐSZÖR!

Példaul az alábbi utasítással az ADC konverzió eredményét kiolvassuk és a ADCmeres nevű változóba írjuk: 
                    ADCmeres = (ADCL | ADCH<<8);

Most térjünk arra vissza, hogy néhány esetben miért is lesz jó nekünk, ha balra rendezett az ADC mérés eredménye. Az előző ábrát megnézve látható, hogy ha az eredmény balra rendezett, és nekünk a 8 bites felbontás is megfelelő (0 – 255 közötti érték), akkor elegendő csak az ADCH regiszter értékét kiolvasni.
A valóságban a legkisebb helyiértékeken lévő alsó két bit nagyon zajos tud lenni. Ezért ha csak ADCH értékét olvassuk ki, akkor az ADCL regiszterben lévő alsó 2 zajos bitet is kiszűrhetjük.


A cikk még nem ért véget, lapozz!
Következő: »»   2 / 9
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem