ADC
ADC znamená analog-to-digital converter,
tedy analogově-digitální převodník.
Je to část mikrokontroléru,
která umí změřit analogové napětí
a převést ho na číslo.
Digitální pin běžně vidí jen dvě možnosti:
0 nebo 1.
ADC je jiné.
Dokáže říct,
že napětí není jen "nízké" nebo "vysoké",
ale třeba někde mezi.
K čemu se hodí
ADC se používá, když mikrokontrolér potřebuje měřit veličinu, která se mění plynule:
- napětí z potenciometru,
- výstup analogového senzoru,
- napětí baterie,
- intenzitu světla přes vhodné zapojení,
- teplotu z analogového čidla.
ADC obvykle neměří "teplotu" nebo "světlo" přímo. Měří napětí. Teprve program si z naměřeného čísla dopočítá, co toto napětí znamená.
Druhy ADC
ADC není jen jeden jediný vynález. Existuje více způsobů, jak převést analogové napětí na číslo. V mikrokontrolérech se často potkáte hlavně s těmito pojmy:
| typ ADC | kde se hodí | poznámka |
|---|---|---|
| SAR | běžné mikrokontroléry | rychlý a poměrně jednoduchý převodník |
| sigma-delta | přesnější měření, audio, pomalé senzory | často přesnější, ale pomalejší |
| flash | velmi rychlé převody | rychlé, ale složitější a náročnější na hardware |
U malých mikrokontrolérů je velmi běžný SAR ADC.
Zkratka znamená successive approximation register.
Nemusíte si pamatovat celý název.
Důležité je,
že převodník postupně zkouší bity výsledku
a porovnává,
jestli je odhad větší nebo menší než měřené napětí.
Vzorkovací kondenzátor
U běžného SAR ADC není vstup jen kouzelná díra, do které se podíváme a hned známe napětí. Uvnitř bývá malý vzorkovací kondenzátor. Při měření se na chvíli připojí ke vstupnímu pinu, nabije se na měřené napětí a potom z něj převodník udělá číslo.
To má praktický důsledek: kondenzátor se musí stihnout nabít. Když je zdroj signálu slabý, má velký odpor nebo ADC běží moc rychle, napětí na kondenzátoru se nemusí stihnout ustálit. Výsledek pak může být posunutý, kolísat nebo vypadat záhadně špatně.
Když nastavíte ADC příliš rychle, vzorkovací kondenzátor nemusí mít dost času se nabít na skutečné vstupní napětí. To je vidět hlavně u signálů s vyšším výstupním odporem, třeba u odporových děličů, některých senzorů nebo potenciometrů s velkou hodnotou odporu.
Řešení bývá snížit rychlost ADC, přidat delší vzorkovací čas, použít menší odpor ve zdroji signálu nebo signál oddělit zesilovačem. Konkrétní limity vždycky hledejte v datasheetu.
Rozlišení
ADC má určité rozlišení. To říká, na kolik kroků umí měřený rozsah rozdělit.
| rozlišení | počet hodnot | rozsah čísel |
|---|---|---|
| 8 bitů | 256 | 0 až 255 |
| 10 bitů | 1024 | 0 až 1023 |
| 12 bitů | 4096 | 0 až 4095 |
Když má ADC rozlišení 10 bitů
a měří rozsah od 0 V do 5 V,
hodnota 0 odpovídá přibližně 0 V
a hodnota 1023 odpovídá přibližně 5 V.
Hodnota uprostřed bude přibližně polovina rozsahu.
Když ADC vrátí 742,
není to samo o sobě ani volt,
ani stupeň Celsia,
ani procento.
Je to číslo z převodníku.
Význam získá až podle referenčního napětí,
zapojení senzoru
a výpočtu v programu.
Referenční napětí
ADC potřebuje vědět, proti čemu napětí porovnává. Tomu se říká referenční napětí.
Když je reference 5 V,
nejvyšší výsledek odpovídá přibližně 5 V.
Když je reference 1.1 V,
nejvyšší výsledek odpovídá přibližně 1.1 V.
Menší reference může dát jemnější měření malých napětí, ale jen pokud měřené napětí tuto referenci nepřekročí. Když na vstup ADC přivedeme víc, než čip dovoluje, není to odvážné měření, ale cesta k poškození pinu.
Kanály a pinmux
Mikrokontrolér mívá jeden ADC převodník, ale více vstupů, které k němu lze připojit. Těmto vstupům se říká kanály.
Výběr kanálu je podobný přepínači:
Než začneme měřit, musíme vybrat, který vstup se má k ADC připojit. To úzce souvisí s tím, že jeden fyzický pin může mít více funkcí. Tomu se věnuje kapitola Pinmux.
Spuštění převodu
Základní práce s ADC bývá:
- nastavit referenci,
- vybrat kanál,
- nastavit rychlost převodu,
- spustit převod,
- počkat na dokončení,
- přečíst výsledek.
Zjednodušený zápis může vypadat takto:
adc_select_channel(ADC_CHANNEL_LIGHT);
adc_start_conversion();
while (!adc_is_ready()) {
// cekame na dokonceni prevodu
}
uint16_t value = adc_read_result();
Tady se používá čekání, tedy polling. U jednoduchého měření to může stačit. Když ale program potřebuje mezitím dělat další práci, hodí se použít přerušení.
ADC a přerušení
ADC často umí vyvolat přerušení ve chvíli, kdy je převod hotový. Program pak nemusí v hlavní smyčce pořád kontrolovat, jestli už ADC doměřilo.
Typický nápad je:
ADC0.INTCTRL = ADC_RESRDY_bm;
Tím se povolí přerušení, které nastane, když je výsledek připravený. Obsluha přerušení pak výsledek rychle uloží a delší zpracování nechá na hlavní smyčce.
ADC není nezávislé kouzlo. Stejně jako UART nebo časovač závisí na hodinách. Když jsou hodiny převodníku moc rychlé nebo moc pomalé, měření může být nepřesné nebo převod nemusí odpovídat tomu, co čekáte.
V datasheetu proto vždycky hledejte doporučenou frekvenci ADC a nastavení prescaleru. U některých čipů se zvlášť nastavuje také vzorkovací čas, tedy jak dlouho se nechá vstupní obvod ustálit před samotným převodem.
Co si hlídat
- Pin musí být opravdu připojený na ADC kanál.
- Referenční napětí musí odpovídat měřenému rozsahu.
- Vstupní napětí nesmí překročit povolené hodnoty čipu.
- Převod chvíli trvá, takže výsledek není dostupný hned po spuštění.
- Vstupní signál musí stihnout nabít vzorkovací kondenzátor ADC.
- Výsledek je číslo, které je potřeba přepočítat podle zapojení.
ADC je typický příklad periferie, kde se potkává hardware, registry, časování a programová struktura. Proto má smysl nejdřív rozumět hodinám, přerušením a základnímu ovládání registrů.