- Az analóg komparátor működése
- Összehasonlított jelek bemeneteinek kiválasztása
- Összehasonlítás által kiváltott megszakítások
Előfordulhat olyan feladat, amikor analóg feszöltség értéktől függ programunk működése. Pl. szeretnénk riasztást küldeni egy bizonyos feszültségszint átlépésekor. Nem teljesen légből kapott példa a tápfeszültség figyelése. Ha lecsökken egy bizonyos feszültségszint alá, akkor szóljon a program a felhasználónak, hogy baj van stb. Természetesen megvalósítható ez úgy is, hogy folyamatosan mérjük a tápfeszültség értékét, és minden egyes mérés után kiértékeljük a mért adatot. Ennek a megoldásnak az a hátránya, hogy értékes időt fecsérlünk el a mérésekre és a számításokra. Másik probléma lehet a pontosság. Ha pl. a tápfeszültség értéke 5V, akkor (5/1024) kb. 4mV pontossággal tudjuk csak megállapítani a feszültség értékét. Bár a példánk nem igazán jó, hiszen nem indokolt nagyobb pontosság, mégis rávilágít arra, miért is jó az analóg komparátor. Egyrészt sokkal nagyobb pontossággal tudunk két feszültség értéket összehasonlítani analóg komparátorral, mint 10 bites AD átalakítással, másrészt semmi időt nem rabol el a programtól, hiszen csak akkor kell foglalkoznia a programnak a feszültségek eltérésével, amikor az megtörténik.
Lássuk hogyan is néz ki ez az egység a chip-en belül:

Kicsit bonyolultnak tűnik elsőre, de minket csak egyetlen dolog kell érdekeljen. Ott középen látható a lényeg, egy műveleti erősítő, ami a pozitív és negatív bemenetére kapcsolt jeleket összehasonlítja és kimenete nyilván annak megfelelő feszültség értéket vesz fel, hogy melyiken van nagyobb feszültség. Így aztán nem csodálkozunk azon, ha nem a feszültségek megegyezéséről kapunk információt, hanem arról, amikor a két feszültség viszonya megváltozik. A feszültségek pontos egyezésekor ugyanis elvben a műveleti erősítő kimenete 0, de ez egy nagy erősítésű műveleti erősítő esetén nem gyakran fordul elő. Azt viszont elég pontosan meg fogjuk tudni határozni, amikor a műveleti erősítő kimenete átbillen. Ez az esemény ugyanis generálhat egy megszakítást, vagy más módon jelzést küldhet programunknak.
Ennek megfelelően az analóg komparátor az AIN0 (+) és az AIN1 (-) bemeneteket hasonlítja össze. Ezek a kivezetések látatók az alábbi képen az Arduino nano pinout ábráján:

Ha az AIN0 bemenet feszültsége nagyobb, mint az AIN1 bemenet feszültsége, akkor az összehasonlító kimenete egyre állítja az ACSR regiszter ACO jelzőbitjét (lásd később). Az ACO bit beállítása 1-2 órajelciklust vesz igénybe, tehát ennyi késésre számítanunk kell. Ezzel a bittel aztán kétféle dolgot is tehetünk:
- A komparátor kimenete beállítható úgy, hogy aktiválja a Timer/Counter1 Input Capture funkcióját (lásd az időzítőkről szóló leírást). Ez a funkció egy külső órajel vagy más jelforrás impulzusainak számlálását teszi lehetővé, tehát igen nagy pontossággal tudunk periódus időt mérni a Timer1 segítségével, ami egy 16 bites számlálót tartalmaz.
- Ezenkívül a komparátor megszakítást is kiválthat. Meghatározhatjuk azt is, hogy az ACO bit nulláról egyre változása, vagy egyről nullára változása, esetleg mindkettő esetén keletkezzen megszakítás. Végső soron ez azt jelenti, hogy megszakítást kaphatunk akkor is, ha az AIN0 bemenetre kapcsolt feszültség nagyobb lesz mint az AIN1-re kapcsolt feszültség, illetve ha AIN0 lecsökken AIN1 feszültsége alá, illetve mindkét irányú változás esetén is.
Mivel a vezérlőben található egy analóg jel kiválasztó multiplexer is, nem hagyták ki a tervezők azt a lehetőséget sem, hogy bármelyik analóg bemeneti kivezetést is felhasználhassuk az AIN1 kivezetés helyett. Ekkor azonban az ADC egységet nem használhatjuk (ki is kell kapcsolni), mivel a multiplexer egység vezeti ez egyes analóg bemenetek feszültségét az ADC bemenetére. Ehelyett azonban ilyenkor az analóg komparátor bemenetére kerül a kiválasztott kivezetés feszültsége. Meg kell jegyezni, hogy a multiplexer egység az ADC-re tudja vezetni a belső referencia feszültséget és a GND pontot is, ez itt nem áll rendelkezésre, a 8 analóg bemenetből egyszerre egy választható ki. A multiplexer bemenetek kiválasztása az ADC egység ADMUX regiszterének MUX2-0 bitjeivel lehetséges az alábbi táblázat szerint:

(további részleteket lásd ADC egység leírásánál).
A „SLEEP mód” működéséről szóló leírásban található teljesítménycsökkentő ADC bitet (PRADC) le kell tiltani nulla beírásával, hogy használni lehessen az ADC bemeneti MUX-ot.
Regiszterek leírása
ADCSRB – ADC vezérlő és állapotregiszter B
Ebben a regiszterben az ECME bittel állíthatjuk be, hogy az analóg komparátor AIN1 bementére az AIN1 kivezetésre kepcsolt jel kerüljön, vagy az ADC egység multiplexerével kiválasztott bemenet jelét hasonlítsa össze a komparátor az AIN0 kivezetésre kapcsolt feszültséggel.

6. bit – ACME: analóg összehasonlító multiplexer engedélyezése. Amikor ez a bit egy, és az ADC ki van kapcsolva (az ADCSRA regiszter ADEN bitje nulla), az ADC multiplexere választja ki az analóg komparátor negatív bemenetét. Ha ezt a bitet nullára állítjuk be, az AIN1 bemenet feszültsége kerül az analóg komparátor negatív bemenetére.
ACSR – analóg összehasonlító vezérlés és állapotregiszter
Ebben a regiszterben tudjuk beállítani az analóg komparátor működésének módját és itt kapjuk meg az összehasonlítás eredményét.

7. bit – ACD: analóg komparátor letiltása. Amikor ezt a bitet nullára írjuk, az analóg komparátor áramellátása kikapcsol. Ez a bit bármikor beállítható az analóg komparátor kikapcsolásához. Ez csökkenti az energiafogyasztást aktív és tétlen üzemmódban. Az ACD bit megváltoztatásakor az analóg összehasonlító megszakítást le kell tiltani az ACIE bit ACSR-ben történő törlésével. Ellenkező esetben megszakítás léphet fel a bit módosításakor.
6. bit – ACBG: Analóg komparátor referencia feszültség kiválasztása. Ha ez a bitet egybe állítjuk, az 1.1V-os referenciafeszültség kerül az analóg komparátor pozitív bemenetére. Ha ez a bitet törljük, az AIN0 bemenet feszültsége kerül az analóg komparátor pozitív bemenetére. Amikor a belső referencia feszültséget az analóg komparátor bemenetére kapcsoljuk, egy bizonyos időbe telik, amíg a feszültség stabilizálódik. Ha az értéke még nem stabil, az első komparálás rossz értéket adhat.
5. bit – ACO: analóg komparátor kimenet. Az analóg komparátor kimenete szinkronizáltan határozza meg az ACO bit értékét. Ez a szinkronizálás 1-2 órajelciklus késleltetést eredményez.
4. bit – ACI: analóg összehasonlító megszakításjelző. Ezt a bitet a hardver állítja be, amikor egy összehasonlítás kimeneti eseménye elindítja az ACIS1 és ACIS0 által meghatározott megszakítási módot. Az analóg összehasonlító megszakítási rutin akkor kerül végrehajtásra, ha az ACIE bit egy, és az SREG-ben a globális megszakítások engedélyezve lettek („I” bit). Az ACI bitet a hardver törli a megfelelő megszakításkezelő rutin meghívásakor. Alternatív megoldásként az ACI bit törléséhez logikai egyet kell erre a bitre írni.
3. bit – ACIE: analóg összehasonlító megszakítás engedélyezése. Ha az ACIE bit logikai egybe van írva, és az SREG-ban a a lobális megszakítások engedélyezve vannk („I” bit), az analóg összehasonlító megszakítási eseménye aktiválódik. Ha ezt a bitet töröljük, a megszakítás letiltásra kerül.
2. bit – ACIC: analóg összehasonlító bemenet rögzítésének engedélyezése. Ha erre a bitre egyet írunk, akkor az TIMER1 bemeneti rögzítési funkcióját az analóg komparátor aktiválja (lásd időzítők működéséről szóló leírást). A komparátor kimenet ebben az esetben közvetlenül kapcsolódik a TIMER1 rögzítés bemenetéhez, így a komparátor kihasználja a TIMER1 Input Capture megszakítás zajszűrő és élválasztó funkcióit. Ha nullát írunk erre a bitre, nincs kapcsolat az analóg komparátor és a bemeneti rögzítési funkció között. Ahhoz, hogy a komparátor kiváltsa a TIMER1 bemeneti rögzítési megszakítást, be kell állítani az ICIE1 bitet az időzítő megszakítási maszk regiszterében (TIMSK1).
1., 0. bit – ACIS1, ACIS0: Analóg összehasonlító megszakítási mód kiválasztása. Ezek a bitek határozzák meg, hogy mely összehasonlító események váltják ki az analóg összehasonlító megszakítását. A különböző beállításokat az alábbi táblázat mutatja.

Az ACIS1/ACIS0 bitek módosításakor az analóg összehasonlító megszakítást le kell tiltani a megszakítást engedélyező bitjének törlésével az ACSR regiszterben. Ellenkező esetben megszakítás léphet fel a bitek módosításakor.
DIDR1 – Digitális bemenet letiltása regiszter 1
Ebben a regiszterben az AIN0 és AIN1 bemenetekhez tartozó digitális bemeneti puffereket tudjuk letiltani a kisebb áramfelvétel érdekében.

7..2. bit – Res: Fenntartott bitek. Ezek a bitek az ATmega48PA/88PA/168PA/328P nem használt bitjei, és mindig nullaként jelennek meg.
1., 0. bit – AIN1D, AIN0D: AIN1, AIN0 digitális bemenet letiltása. Ha ezeket a biteket egyre írjuk, az AIN1/0 kivezetések digitális bemeneti puffere letiltásra kerül. A megfelelő PIN-regiszterbit mindig nulla lesz, ha a hozzátartozó AIN1D vagy AIN0D bit értéke egy. Ha analóg jelet viszünk az AIN1/0 tűre, és nincs szükség digitális bemenetre, akkor ezt a bitet egyre kell írni, hogy csökkentsük az energiafogyasztást a digitális bemeneti puffer kikapcsolásával.