Reklama

Začínáme s mikrokontroléry ATmega – A/D převodník 1. díl (teoretický základ)

Úvod

AD převodník je jednou z nejdůležitějších periferií mikrokontroléru. Tvoří most mezi analogovým a digitálním světem. Využití najde snad kdekoliv. Jednoduchým měřením napětí akumulátoru počínaje a záznamem audiosignálu konče. Není proto od věci ho podrobit důkladnější prohlídce.

Vzhledem k důležitosti a širokým aplikačním možnostem A/D převodníku bude tento návod poněkud obsáhlejší. Ani ne tak množstvím informací, ale spíše množstvím příkladů. Možnostem a obecné práci s A/D převodníkem se bude věnovat úvodní teoretická část. Série příkladů pak bude předvádět různá uplatnění vybraných funkcí A/D převodníku. Bude na vás, které příklady si prohlídnete nebo vyzkoušíte.

Jisté základní znalosti obecně o A/D převodu byste již měli mít a pokud nemáte, tak brouzdejte po webu. Je to problematika natolik rozsáhlá, že se jí nebudu věnovat. Převodník na Atmelu je desetibitový. Rozděluje tedy nějaké referenční napětí (o něm později) na 1024 hladin. Vzhledem k povoleným mezím referenčních napětí se rozlišení bude pohybovat v rozsahu 1 – 4 mV. Převodník dle mých zkušeností netrpí žádným větším “šumem”, takže v rozumných podmínkách je opakovatelnost měření veliká (v podstatě +/- 1 LSB). Jinak řečeno výsledek měření se náhodně mění jen v rozsahu jednoho kroku. Na veškerou matematiku s A/D převodníkem vám bude stačit trojčlenka, kterou předpokládám, že ovládáte ;)

Napájení AD převodníku

K napájení A/D převodníku slouží pin AVCC. Musí na něm být připojeno de facto stejné napětí, jakým napájíte mikrokontrolér (tedy stejné jako na VCC). Přesněji řečeno nesmí se lišit o víc, jak 0.3 V. Možná se zeptáte, proč je tedy samostatně vyvedené? Samotné napájecí napětí mikrokontroléru může být totiž “zarušené”, což digitálním obvodům to většinou nevadí, ale analogové obvody by trpěly. Samostatný AVCC pin vám má umožnit přivést stabilní “nezarušené” napětí pro A/D převodník (například skrze LC filtr).

Reference AD převodníku

Referencí se rozumí napětí, vůči němuž převodník vztahuje své výsledky. Převodem získáte zlomek (číslo) z referenčního napětí. Z něj pak hodnotu napětí počítáte. Jinak řečeno jestliže, vám jako výsledek převodu vyjde 256, víte že měřené napětí je 256 / 1024 (dvě stě padesát šest tisíc dvaceti čtvrtin :D) z referenčního napětí. Pokud je referenční napětí třeba 4 V pak se jedná o 256 x 4 V / 1024 = 1 V. A to je prosím ta zmiňovaná trojčlenka. Matematicky zapsáno: U = ADC_hodnota x Vref / 1024,
kde U je hodnota měřeného napětí, ADC_hodnota je výsledek převodu a Vref je hodnota referenčního napětí. Pro jistotu uvedu dva příklady.

 
1.) Referenční napětí je 1.1 V, výsledek převodu je 150, Měřené napětí tedy je U = 150 x 1.1 / 1024 = 161 mV
 
2.) Referenční napětí je 5 V, výsledek převodu je 873, měřené napětí tedy je U = 873 x 5 / 1024 = 4.26 V
 
Referenční napětí tedy limituje měřící rozsah. Měřit lze jen napětí nižší jak referenční. Nejvyšší měřitelné napětí je Vref x 1023 / 1024. Převodník totiž měří od nuly a výsledek převodu může být nejvýše 1023. Pokusíte-li se měřit vyšší napětí než je reference, výsledek bude stále 1023. Reference má velký význam, protože mimo jiné určuje nejmenší napěťové rozlišení převodníku. S referencí 1.1 V můžete rozlišit přibližně 1 mV, s referencí 5 V přibližně 4 mV. Obecně se vyplatí měřit vždy s nejnižší možnou referencí, pak je měření nejcitlivější. V Atmelu si totiž referenci můžete vybírat a běžně máte k dispozici tři až čtyři varianty. Volit si ji proto můžete u každé aplikace jinak. Referencí pro převodník může být:

  • napájecí napětí Atmelu (reference AVCC)
  • interní 1.1 V napětí
  • interní 2.56 V napětí
  • externí reference na pinu AREF

Některé Atmely mají interní referenci 1.1 V (ATtiny24), některé 2.56 V (ATmega16) a některé obě (ATmega644). Vnitřní reference jsou výhodné proto, že pracují bez jakéhokoli vnějšího obvodu. Jejich hodnota není nejpřesnější (+/- 0.1 V) a je dobré si je u každého Atmelu změřit a zapsat do programu. Napájecí napětí jako reference poslouží ve specifických případech (měření polohy potenciometru, měření hodnoty napájecího napětí atd.). Externí reference sice vyžaduje vnější obvod (například TL431) ale umožňuje zvolit si libovolnou hodnotu (větší jak 2 V) a v případě přesnějších měření je dobrou volbou. Obecně je možné na AREF pin přivést jakékoli napětí. Takže za určitých okolností můžete využít například dělič z napájecího napětí, nebo si pomocí externího multiplexeru třeba přepínat i několik vnějších referencí a volit si tak pro každé měření tu nejoptimálnější. Více se o využití výše uvedených čtyř variant dozvíte u jednotlivých příkladů. Reference se vybírá pomocí bitů REFS1 a REFS0 v registru ADMUX. Všechny reference kromě externí vyžadují, aby byl na AREF připojen filtrační kondenzátor (typicky 10 nF – 100 nF, proti GND). Po zvolení interní reference si její napětí můžete na tomto pinu změřit, nebo ji použít nějakým vnějším obvodem. Pokud vnitřní referenci zapnete (ať už spuštěním A/D převodníku nebo komparátoru nebo Brown-out detektoru) musíte počkat nejméně 70 µs než naběhne. Kromě toho musíte počkat než se filtrační kondenzátor na AREF nabije na příslušnou hodnotu (na to musíte čekat i když vnitřní referenci třeba jen změníte). Ta doba může být různá a v datasheetu ji nenajdete. Já si ji změřil. Při přepnutí z interní 2.56 V na AVCC trval přechod přibližně 20 µs. Ale naopak při přepnutí z AVCC na interní 2.5 ms. Většinou ale referenci za chodu měnit nebudete.

Na závěr by se slušelo poznamenat, že existují Atmely s bohatšími možnostmi výběru reference, ale těmi se zde nemá smysl zabývat.

Hodiny A/D převodníku

Hodiny A/D převodníku se odvíjejí od hodin mikrokontroléru a měly by být v rozsahu 50 – 200 kHz, pokud chceme využívat plných deset bitů jeho rozlišení. Pokud si vystačíme s nižším rozlišením, tak jej můžeme taktovat na vyšších frekvencích. K jeho nastavení vám slouží předdělička, která se nastavuje snad u všech Atmelů v registru ADCSRA pomocí bitů ADPS2, ADPS1 a ADPS0. Pokud na měření nespěcháte nebo máte signál s vyšší výstupní impedancí (tzn. signál, kterému vadí, když jej zatěžujete i malým proudem), taktujte raději nižší frekvence. Pokud naopak spěcháte a potřebujete vyšší vzorkovací frekvenci, smíte podle datasheetu jít až na 1 MHz. Testoval jsem však i na 2 MHz s dobrým výsledkem (viz příklad I). Samotný převod trvá 13 cyklů. Výjimkou je úplně první převod po spuštění A/D převodníku, tam probíhá jeho inicializace a celkem trvá 25 cyklů. Pokud vás někdy budou zajímat tak si detaily o časování samotného převodu najdete v datasheetu.

Spouštění (triggrování) převodu

Všem Atmelům je možné převod spouštět “manuálně”, zápisem log. 1 do bitu ADSC v registru ADCSRA. Chudší Atmely jako třeba ATmega8 už ani jiné možnosti nemají. Ale u vybavenějších modelů je možné spouštět převod nějakou jinou periferií, jako třeba externím přerušením, komparátorem nebo časovačem. Díky tomu můžete mít přesnou kontrolu nad okamžikem převodu (nebo přesněji řečeno nad okamžikem vzorkování). Kromě toho máte možnost nechat A/D převodník běžet v tzv. “free-running” režimu. V něm se neustále vzorkuje a převádí napětí na jednom vybraném kanále a vy tak máte k dispozici vždy tu nejaktuálnější hodnotu. Detaily se dozvíte v příslušných příkladech. Po dobu převodu je bit ADSC držen v log. 1, jakmile převod skončí, tak se bit ADSC vynuluje, takže jej můžete využít při čekání na dokončení převodu. Automatické spouštění se povoluje bitem ADATE v registru ADCSRA. Zdroj spouštěcího signálu se vybírá bity ADTS2, ADTS1 a ADTS0. Ty se nachází v různých registrech. U ATmega16 v registru SFIOR u ATmega644 v registru ADCSRB, takže vám někdy nezbude než kouknout do datasheetu.

Přerušení od A/D převodníku

Po dokončení A/D převodu může převodník vyvolat přerušení v jehož rutině si pak můžete výsledek vyzvednout a zpracovat. Tato možnost se pro vás stane v podstatě nezbytnou, pokud využíváte převodu spouštěného nějakou vnější událostí (ať už pravidelně nebo jednorázově). Přerušení se povoluje bitem ADIE v registru ADCSRA. I když není povoleno, tak o příchodu události, která by přerušení spustila informuje stavový bit ADIF, která se nachází ve stejném registru. Stejně jako se všemi stavovými bity se maže zápisem jedničky nebo zavoláním rutiny přerušení.

Multiplexer

Asi všechny Atmely jsou vybaveny analogovým multiplexerem, díky němuž můžete přepínat A/D převodníku vstupy. Těch bývá různé množství. U větších Atmelů většinou osm. Označují se ADC0ADC7 a jejich rozmístění najdete v datasheetu. Kromě toho ale umožňuje multiplexer u většiny Atmelů připojovat k A/D převodníku i některé interní vstupy. Jako například reference nebo teplotní čidla. Multiplexer se ovládá bity MUX4MUX0 v registru ADMUX a jejich množství se může podle mikrokontroléru lišit. V datasheetu je vždy přehledná tabulka popisující všechny možné kanály multiplexeru.

Zesilovač a diferenciální měření

Některé Atmely mají A/D převodník vybavený možností měřit diferenciálně (tedy rozdíl napětí mezi dvěma kanály). A typicky pak i zesilovač, který umožňuje před měřením tento rozdíl zesílit. Zesílení mají podle typu mikrokontroléru různé volitelné hodnoty od 2x až do 200x. Tato možnost vám v mnoha situacích zjednoduší práci a ušetří vám na desce externí zesilovač. Měření v těchto režimech ale vyžaduje jistou míru opatrnosti (vstupní signál by neměl obsahovat složky vyšší jak 4 kHz a pod.). Detaily o použití se dozvíte u příslušných příkladů.

Obecné vlastnosti

Hrubě jsme načrtli základní možnosti A/D převodníku a bity, které ho řídí. Přece jen nám ale zůstalo pár ovládacích prvků, které nikam nezapadají. Jednak je to bit ADLAR v registru ADCSRA, ten slouží k zarovnání dat. Výsledek převodu je desetibitový a máte možnost ho zarovnat doprava (na to jste zvyklí) a nebo ho zarovnat doleva. To má hned dva důvody. Jednak pokud chcete pracovat pouze s osmibitovou hodnotou, tak si tím můžete usnadnit vyčítání výsledků převodu (i když v Céčku to asi nepoznáte). Za druhé, a to je asi hlavní důvod, umožní vám to lépe převádět výsledek na znaménkový typ. Běžně je převod přirozeně neznaménkový (prostě je hodnota kladná), ale v případě diferenciálního měření už je znaménko potřeba, protože rozdíl napětí na dvou kanálech může být i záporný. Výsledek převodu se nachází v registrech ADCL a ADCH o jejichž korektní vyčtení (nejprve ADCL a hned potom ADCH) se v našem případě postará překladač a v céčku můžeme přistupovat k “registru” ADC. U některých mikrokontrolérů se ještě můžete setkat s možností vypnutí vstupních “bufferů”. Co to je a proč ho vypínat se dozvíte v článku o komparátorech.

Co je ve kterých příkladech

První sadu příkladů, na které se naučíme pracovat s referencemi, základní matematiku a přepínat kanály, si předvedeme na ATmega8. Jedná se o příklady A) až E). Je to takový běžný základ, se kterým si většina z vás vystačí. Pokud s A/D převodníkem začínáte, tak si je projděte všechny. Všechny tyto příklady by měly být přenositelné na další mikrokontroléry. V další sadě, tentokrát s ATmega16 si vyzkoušíme možnosti spouštění převodu (příklady H a I). Opět budou povětšinou přenositelné na jiné mikrokontroléry. Ne však třeba na mikrokontrolér ATmega8, protože ten vůbec možnosti automatického spouštění převodu nemá. Zacházení s diferenciálními kanály a zesilovači si předvedeme na ATmega644, protože ta je jimi vybavena i v DIP pouzdře (příklady F a G).

Seznam příkladů, které budou publikovány v následujících dílech seriálu:
 

  • A) ATmega8A – jednoduchý převod s VREF = AVCC
  • B) ATmega8A – měření s externí referenci (TL431)
  • C) ATmega8A – měření s interní referencí 2.56 V a s průměrováním
  • D) ATmega8A – měření více kanálů
  • E) ATmega8A – měření hodnoty AVCC s využitím interní reference
  • F) ATmega644P – Jednoduché diferenciální měření
  • G) ATmega644P – Diferenciální měření se zesilovačem
  • H) ATmega16 – Externím přerušením spouštěný ADC převod
  • I) ATmega16 – Free running ADC s přerušením
Na čem zkoušet?

Dobrou otázkou je, na jakém přípravku zkoušet uvedené příklady? První z vás asi napadne nepájivé (kontaktní) pole, ale to není dobrá volba. Ze zkušenosti můžu říct, že kontakty v nepájivém poli jsou hodně nespolehlivé. Mezi součástkami a polem vznikají přechodové odpory v řádu jednotek až desítek ohmů. Tekoucím proudem na nich vznikají úbytky napětí a běžně dosahují 30 – 50 mV. Tyto jevy zásadně narušují výsledky měření. A to nemluvím o tom, že se úbytky mění, jak s polem manipulujete. Proto doporučuji tyto příklady testovat buď na nějakých vývojových deskách, ať už EvB, Arduinech nebo obecně na pájecích prototypových deskách. Podstatné je, aby byly klíčové spoje (Ty jimiž teče nějaký proud) spájeny. Že to má smysl pochopíte většinou velice brzy. Představte si, že chcete sestavit jednoduchý teploměr z obvodu LM35 nebo LM335. Jeho výstupní napětí je úměrné teplotě s koeficientem 10 mV/°C. Nejistoty v řádu +/- 30 mV by měly za následek nejistoty v teplotě +/-  3 °C (!), přitom čidlo je schopné detekovat změny klidně setin stupně Celsia.

 
 

V příštím díle se již vrhneme na první praktické příklady.

 
Autor: Michal Dudka
 

 

Jiné příspěvky v kategorii:

 

 
Tajned facebook
 

Za případné chyby v textu, ve zdrojovém kódě, nebo ve schématickém zapojení se omlouváme.
AUTOŘI NEBEROU ŽÁDNOU ODPOVĚDNOST ZA PŘÍPADNÉ ÚJMY NA ZDRAVÍ ČI MAJETKU.