Autor: Prog0el | 1.7.2016 |
Až doposud jsme pracovali se signálem pouze o dvou úrovních; již zmíněných 0 a 1. V tomto díle si řekneme, že existuje i jiný signál, se kterým se sice v mnoha případech setkáme, avšak zároveň nám také svou existencí značně komplikuje život. V čem je tedy ten rozdíl? Právě v počtu úrovní, kterých má analogový signál nekonečně mnoho. Příkladem takovéhoto signálu je například zvuk. Jistě jste se již setkali s pojmy souvisejících s audiotechnikou, kterými jsou vzorkovací frekvence, či bitrate zvukové nahrávky. Tyto pojmy s převodem analogového signálu na digitální úzce souvisí. Další oblastí použité AD převodníku by bylo měření napětí či proudu, ke kterému se často AD převodníky používají. AD převodník nás informuje o poměru napětí na jeho vstupu k referenčnímu napětí, které je generováno obvodem napěťové reference umístěné uvnitř či vně mikrokontroléru (nebo externího AD převodníku).
Zmíněný převod lze pochopitelně realizovat i obráceně a to převodem digitálního signálu na analogový pomocí digitálně-analogového převodníku (DAC). V souvislosti s těmito pojmy se vžily následující zkratky:
ADC: AD převodník: Analog to Digital Converter
DAC: DA převodník: Digital to Analog Converter
Tento díl bude výhradně o popisu ADC.
Na začátku si definujeme několik důležitých pojmů, které v souvislosti s ADC používáme. Základním parametrem, který nám udává rozlišení ADC je jeho bitová hloubka, čili bitrate. Bitrate se udává v bitech a popisuje, jak dlouhé slovo bude popisovat již zmíněný poměr napětí na vstupu k napětí referenčnímu. Počet kroků, které je ADC schopen vypočítat je roven n-té mocnině čísla dvě, kde „n“ je bitrate. Bitrate, který využívá mikrokontrolér AVR s jeho interním ADC je 10b. Ke zpracování zvuku je rozumný údaj alespoň 16b, či lépe 24b.
Dalším parametrem je vzorkovací frekvence. Vzorkovací frekvence se udává v jednotce hertz a popisuje, kolikrát za sekundu dojde k převodu analogového signálu do digitální podoby. Tento parametr závisí na maximální rychlosti, kterou je schopen ADC pracovat. Platí zde Shannon-Nyquistův teorém, který definuje, že vzorkovací frekvence ADC musí být alespoň dvojnásobná oproti frekvenci signálu ADC vzorkovaným. Toto pravidlo je nutno dodržet, jinak by výsledný signál nebylo možno znovu zrekonstruovat.
Z tohoto důvodu se před vstup ADC připojuje dolní propust, což je filtr, který omezí vyšší kmitočty, než kmitočty o poloviční frekvenci, aby se zmíněný teorém nenarušil. Zmiňovaný filtr se nazývá antialiasing filtr. V našem voltmetru jej vynecháme, nicméně v konkrétní aplikaci by již neměl chybět.
Výpočet napětí přivedeného na vstup ADC se provádí pomocí následujícího vzorce:
Uin=(x/(2^n))*Uref
x… navrácená hodnota z ADC
n… bitrate ADC
Uref… referenční napětí ADC
Uin… napětí na vstupu ADC
Samotný ADC je v mikrokontroléru přítomen pouze jednou a všechny jeho kanály přístupné na mikrokontroléru AT mega 8 na portu C jsou připojovány přes multiplexor. Multiplexor na základě adresy, kterou mu nastavíme, připojí příslušný kanál na vstup ADC. Číslování kanálů ADC a bitů portu C je stejné. Například kanál 0 je přítomen na portu C, bitu 0. Vyjma externích vstupů pro ADC je připojena i reference 1,3V a GND- viz registr ADMUX, který bude popsán níže. Kanály 6 a 7 jsou přístupné pouze na mikrokontrolérech v TQFP pouzdře (SMD), kde nejsou součástí žádného portu. V mikrokontrolérech v DIL pouzdře (THD), které používáme my, tyto piny nebyly vyvedeny.
Za účelem eliminace rušení má ADC oddělené napájení, od zbytku mikrokontroléru. Dle datasheetu výrobce by před napájení ADC měla být zapojena dolní propust, což si později ukážeme ve schématu zapojení. Jedná se o piny AVCC (VCC ADC) a AGND (GND ADC). Zbývá nám ještě pin AREF, který plní také neméně důležitou funkci. Jedná se o vstup externí napěťové reference. Máme na výběr mezi napěťovou referencí interní (2,56V), snímanou z pinu AVCC, či referenci externí na pinu AREF. V případě, že je využita interní reference, pak nesmí být na pin AREF externí referenční zdroj připojen, avšak je doporučeno na tento pin vůči zemi připojit kondenzátor o hodnotě 100nF, který je schopen vyrovnat výkyvy v napětí interní napěťové reference. Interní napěťovou referenci je možno zkontrolovat voltmetrem připojeným na pin AREF a AGND při zapnutém módu interní napěťové reference. Měli bychom naměřit 2,56V zcela přesně, jelikož přesnost převodu analogového signálu na digitální se odvíjí od tohoto referenčního zdroje. Použitý ADC má garantovanou přesnost +-2b, což znamená, že výstupní data se mohou lišit maximálně v odchylce dvou bitů. Maximální napětí přivedené na pin AREF, či kterýkoliv jiný pin vyjma (A)GND smí být maximálně 5V +10%, tedy 5,5V. Pokud máme v úmyslu měřit napětí vyšší, musíme využít odporový dělič.
Další faktory ovlivňující přesnost měření, jako jsou chyby nelinearity, zesílení apod. si může čtenář dohledat v datasheetu; pro prvotní seznámení se s ADC jejich znalost není nutná.
ADC může pracovat v módu, ve kterém dochází k jednotlivým konverzím iniciovaných programem, anebo v módu volného běhu „free running“, při kterém se neustále obnovuje informace v datovém registru ADC(H/ L). Dva datové registry jsou nezbytné, jelikož každý z nich je osmibitový, avšak ukládané slovo je desetibitové. V souvislosti s datovými registry existuje jistá funkcionalita, která výsledek zarovnává vlevo či vpravo, jak je uvedeno v následující kapitole.
Pro určení rychlosti konverze se používá dělička kmitočtu. Ta je programovatelná a umožňuje dělení systémového kmitočtu čísly 2, 4, 8, 16, 32, 64, 128. Je však nutno si uvědomit, že při přepínání multiplexoru je nutno čekat nějaký čas, než dojde k jeho korektnímu přepojení a frekvence vzorkování se tedy neodvíjí pouze od děličky kmitočtu. Rovněž při použití více kanálů rychlost konverze klesá podílem počtu kanálů.
ADC mikrokontroléru AVR rozhodně není na nějaké pokročilé zpracování zvuku, či signálu o vysoké frekvenci. Občas se sice někde objeví vcelku zdařilé konstrukce osciloskopů, které mají řadu nectností, za kterou je odpovědný nevhodně pomalý převodník.
Rovněž je v možnostech mikrokontroléru zpracovávat přerušení po dokončení konverze, která jsou popsány níže.
ADMUX
Ovládání multiplexoru, napěťové reference a zarovnání dat.
|REFS1|REFS0|ADLAR|-|MUX3|MUX2|MUX1|MUX0|
ADLAR- zarovnání dat ADC(L/ H) (registrů výsledku konverze) 1: vlevo/ 0: vpravo
MUX[3:0]:
0000- CH0
0001- CH1
0010- CH2
0011- CH3
0100- CH4
0101- CH5
0110- CH6- pouze TQFP
0111- CH7- pouze TQFP
1000- nevyužito
1001- nevyužito
1010- nevyužito
1011- nevyužito
1100- nevyužito
1101- nevyužito
1110- 1,3V
1111- GND
ADCSRA
Konfigurační registr AD převodníku.
|ADEN|ADSC|ADFR|ADIF|ADIE|ADPS2|ADPS1|ADPS0|
ADEN: spuštění AD převodníku (ne konverze)
ADSC: spuštění konverze analogového signálu na digitální
ADFR: mód volného běhu AD převodníku- spuštěn: 1.
V tomto módu dochází k automatickému obnovování hodnoty v registru ADCH/L
ADIF: Příznak přerušení po dokončení konverze
ADIE: Povolení přerušení po dokončení konverze: 1
ADPS[2:0]: Dělička vzorkovacího kmitočtu pro AD převodník (ze systémového kmitočtu)
000- 2
001- 2
010- 4
011- 8
100- 16
101- 32
110- 64
111- 128
ADC(H/ L)
výsledek konverze formátovaný bitem ADLAR v 0:
ADCH |-|-|-|-|-|-|ADC9|ADC8|
ADCL |ADC7|ADC6|ADC5|ADC4|ADC3|ADC2|ADC1|ADC0|
výsledek konverze formátovaný bitem ADLAR v 1:
ADCH |ADC9|ADC8|ADC7|ADC6|ADC5|ADC4|ADC3|ADC2|
ADCL |ADC1|ADC0|-|-|-|-|-|-|
ADC9: nejvyšší bit (MSB)
ADC0: nejnižší bit (LSB)
V praktickém příkladě si vyzkoušíme měření napětí s výstupem na LCD display, který byl předmětem minulého dílu, ve kterém jsme pouze vypisovali statický text. Opět uvidíme krásné prolnutí programování a elektroniky, jelikož budeme muset využít odporový dělič. Jedná se o odporový dělič napětí, který bude v našem případě realizován potenciometrem. V minulém díle jsme odporový dělič používali k regulaci kontrastu LCD displaye. V tomto díle jej využijeme k simulaci změny napětí na vstupu ADC.
Princip je takový, že potenciometr (RP1) dělí napětí přivedené mezi vývody „1“ a „3“ a v závislosti na nastavení jezdce je mezi vývodem „1“ a „2“ napětí, které lze případně dopočítat dle jednoduchého vztahu. Pro výpočet budeme potřebovat úvahu, která nemusí být na první pohled zcela patrná, a proto ji vysvětlím na náhradním schématu potenciometru, kterým budou dva rezistory zapojené v sérii.
Pokud připojíme na svorky „1“ a „3“ napětí, pak obvodem začne procházet proud, který bychom mohli vypočítat jako I=U/(RA+RB). Z tohoto vztahu jasně plyne, že pokud chceme vysokou účinnost daného zařízení a nechceme zbytečné ztráty na děliči napětí, pak je žádoucí, aby byl odpor potenciometru co nejvyšší.
Naproti tomu, maximální proud, který je možno do zátěže přivést by klesal, což v tomto případě není naše starost, jelikož ADC nepotřebuje ke měření proud téměř žádný, což je základním požadavkem každého přesného voltmetru- nezatěžovat měřený obvod.
Nás ovšem více zajímá výpočet napětí na výstupu tohoto děliče:
URA=(RA/RB)×U
URB=(RB/RA)×U
URA+URB=U
Z uvedených vztahů je patrné, že se jedná o pouhý poměr dvou hodnot. Potenciometr lze zapojit i opačně (záměnou vývodů „1“ a „3“). Pak by se také změnily směry manipulace s jezdcem nutné ke zvýšení/ snížení výstupního napětí.
S potenciometry se jistě každý z vás setkal například u domácí Hi-Fi pro regulaci hlasitosti či ekvalizéru. Pokud by konstruktér zmíněné vývody zaměnil, pak by maximální hlasitost byla nastavena po otáčení potenciometrem vlevo a nikoliv na zažitou pravou stranu. Pro jistotu ještě přikládám fotografii potenciometru a potenciometrického trimru, který má místo hřídele šroub. Změna odporu je posléze realizovatelná šroubovákem uvnitř zařízení například pro účely kalibrace.
Princip AD převodu jsem již popsal v předešlých odstavcích. Hrubé uspořádání programu bude ADC v módu free running, při kterém bude neustále docházet ke vzorkování kanálu AD převodníku. Po dokončení AD konverze kanálu se vyvolá přerušení, po kterém dojde k výpisu dat na LCD display.
Jako napěťovou referenci použijeme interní referenci 2,56V, což sice není nejpřesnější možnost ze všech, avšak na naše prvotní seznámení s AD převodníkem jistě postačí. Pozorný čtenář si jistě bude schopen upravit zapojení či program dle svých přání, s čímž velmi rád pomohu.
Rozlišení ve voltech na bit získáme podělením napěťové reference počtem tzv. „kvantizačních úrovní“. Počet kvantizačních úrovní je číslo dvě na bitrate (v našem případě 10), které bylo uvedeno na začátku tohoto dílu.
Vyjde nám, že rozlišení je 2,56/1024=0,0025V/bit. Při uvedené nepřesnosti +-2bity bude odchylka hodnot maximálně 5mV (0,005V). Rozsah přístroje je ovšem pouze do 2,56V, což nezní příliš použitelně. Co kdybychom chtěli zvýšit rozsah tak, aby voltmetr měřil alespoň do 12-ti voltů? Uvedený problém vyřešíme napěťovým děličem na vstupu. Napětí 12V podělíme napětím referenčním a vyjde nám, kolikrát potřebujeme napětí podělit, abychom dosáhli daného rozsahu. Vyšla hodnota cca 4,69, což není zcela uspokojivý výsledek, jelikož by se nám zbytečně pletly do programu operace s desetinnými čísly. Výsledek proto zaokrouhlíme na pět. Rozsah se nyní posune do 5×2,56V, tedy 12,8V.
Nyní je jasné, že budeme muset předřadit před vstup ADC napěťový dělič, kde na rezistoru připojeném mezi zem a vstup bude napětí odpovídat pětině napětí na celém děliči. Poměr odporů rezistorů bude 1:4. Součet tohoto poměru je číslo 5, což je číslo, kterým se napětí vydělí.
Výrobce udává v datasheetu jako vhodné, aby byla výstupní impedance měřeného zdroje signálu 10kR, což můžeme splnit použitím rezistoru 10kR k zemi a 40kR ke zdroji signálu. V níže uvedeném schématu jsou tyto rezistory uvedeny jako R3 a R4.
Současně je nutno si uvědomit, že dojde také k vyšším nepřesnostem (pětkrát). Odchylka bude nyní 25mV a rozlišení 0,0125V. Z tohoto důvodu bude vhodné, aby byla využita přesnost pouze na jedno desetinné místo. Kdybychom měli v úmyslu stavět přesnější voltmetr pro velký rozsah hodnot, pak není od věci uvažovat o větším množství kvantizačních úrovní, kdy při každém zvýšení bitrate o jeden bit dojde ke zdvojnásobení přesnosti.
Schéma zapojení celého měřicího přístroje:
Realizace zapojení na nepájivém kontaktním poli:
Rezistor R4 jsem nahradil sériovou kombinací dvou rezistorů o odporu 1kΩ a 39kΩ, jelikož 40kΩ rezistor nebyl k dispozici. Tlumivku L1 lze běžně koupit v obchodech a není nutno ji vinout po domácku. Pokud ji nemáte k dispozici, pak není pro testovací a nenáročné účely tuto cívku nezapojit a nahradit drátovou propojkou. Mějte na paměti, že je nezbytné, aby byl připojen napěťový dělič, jelikož posléze by došlo ke zničení mikrokontroléru vlivem překročení napětí 5,5V na jeho pinech a výsledek měření by byl pětkrát větší.
Zdrojový kód přikládám zde. Z jeho popisu bude zřejmá i funkce celého programu. Můžete si i všimnout do jaké míry nám pomohly bitové operace pro posun a je také použito opatření proti vnášení nepřesnosti. Celý příklad se obešel bez používání desetinných čísel, čehož se dosáhlo vyjádřením čísel jako zlomky. Kdyby vám bylo cokoli nejasné, pak se mne neváhejte zeptat, jelikož chápu, že tento díl již poněkud více zasahuje do elektroniky.