logo_elektromys.eu

/ AD převodník (na STM8S208)|

Než se pustím do samotného vysvětlování musím běžného čtenáře upozornit že nejde o "běžný článek" ale podpůrný text pro středoškolské kurzy mikrokontrolérové techniky. Text tedy může obsahovat zjednodušené (zkreslené) informace, nebo zdlouhavé polopatické vysvětlování. Čipy STM8S mají dva typy AD převodníku. STM8S208 je vybaven "jednodušším" převodníkem ADC2 a o něm bude následující text. Čipy STM8S103, či STM8S105 mají "pokročilý" převodník ADC1. Odlišnosti obou převodníků jsou jen "drobné", takže v podstatě vše co se dočtete zde bude platné i pro čipy vybavené ADC1. Odlišnostem budu věnovat další kapitolu. Protože jsou oficiální knihovny (Standard Peripheral Libraries) pro ADC zabugované (detaily v poznámkách na konci), budu v textu pracovat s "obohacenou" verzí ze "školní" knihovny (spse_stm8.h, součástí naší šablony).

Blokove schema ADC
Blokové schema AD převodníku STM8S208

Analogově digitální převodník, anglicky Analog Digital Converter (ADC) je zjednodušeně řečeno "voltmetr". Je schopný převádět napětí do číselné podoby. Proces převodu probíhá ve třech krocích. Před samotným ADC se nachází analogový multiplexer (ANALOG MUX) - elektronický přepínač. Ten připojuje k ADC vybraný vstup (náš mikrokontrolér jich má celkem 16). Převod začíná tzv. vzorkováním. Na zvolený čas připojí vstup (vybraný multiplexerem) k vnitřnímu vzorkovacímu kondenzátoru a ten se nabije na napětí vstupu. Následně se vstup zase odpojí a napětí vzorkovacího kondenzátoru se převede do číslicové podoby (tzv. "kvantování" a "kódování").

/ Napájení AD převodníku|

ADC má své vlastní napájecí piny označené VDDA(+) a VSSA(-). VSSA se připojuje na "zem" (tedy na stejný potenciál jako VSS). VDDA je vyvedeno samostatně proto abychom na něj mohli připojit "kvalitní" napětí (které není zašuměné tak jako třeba bývá napájení mikrokontroléru - VDD). Na Nucleo kitu je VDDA připojeno přes LC filtr k VDD (napájení mikrokontroléru). Z dílu o Nucleo kitu víte, že napájení můžete přivést z různých zdrojů (pokud nevíte, projděte si ho). Napájení 5V přímo z USB je pro kvalitu převodu nejméně vhodné (jak můžete shlédnout na následujícím oscilogramu). Mnohem vhodnější je napájení stabilizátorem a to jak 3.3V tak i 5V (ze vstupu VIN).
Noisy 5V from USB
Modrá stopa - 5V přímo z USB(zvlnění typické pro spínané zdroje)
Ornžová stopa - šum napájení z 3.3V stabilizátoru (mnohem čistší)

/ Rozlišení AD převodníku|

Rozlišení převodníku se uvádí v bitech a udává počet hladin napětí které umí rozlišit. Náš převodník je 10bitový a umí rozlišit 210=1024 napěťových hladin. Rozestup mezi hladinami (tzv. napěťové rozlišení) je určeno referenčním napětím. Popíšu raději na příkladu. Máme-li referenční napětí 3.3V, bude napěťové rozlišení 3.3/1024 = 3.22mV. Máme-li referenční napětí 5V, rozlišení bude 5/1024 = 4.88mV. Můžete se na to dívat také tak že rozlišení je přibližně 0.1% z referenčního napětí.

/ Reference AD převodníku|

AD převodník potřebuje přivést referenční napětí vůči němuž bude vztahovat výsledek převodu. Výsledkem převodu je zlomek, vyjadřující jak velký díl z referenčního napětí má napětí měřené. Pokud je výsledkem převodu například číslo 350 tak to znamená 350/1024 ("Třistapadesát tisícdvacetičtvrtin") z referenčního napětí. Referenční napětí přivádíme na piny VREF+ a VREF-. Pin VREF- se typicky připojuje na "zem" (k pinu VSSA). Na pin VREF+ je možné přivést napětí od 2.75V až do VDDA. Na Nucleo kitu je VREF+ spojen s VDDA, takže referenční napětí převodníku je shodné jako napájecí napětí. Na kitu není možné tuto konfiguraci upravovat, to by jste mohli jen na vlastní DPS. Pokud máme tu možnost tak referenční napětí volíme stabilní s nízkým šumem a takové aby co nejlépe vyhovovalo požadovanému vstupnímu rozsahu. V praxi s STM8 budeme mít tuto možnost jen vyjmečně, takže to dál rozvádět nebudu.

/ Clock pro AD převodník|

Tak jako skoro každá periferie v mikrokontroléru, potřebuje i ADC ke své činnosti clock (v blokovém schematu vyznačen jako fADC). Ten se získá podělením "hlavního" clocku (v našem případě typicky 16MHz) a musí být v rozsahu 1-6MHz při napájení 5V a v rozsahu 1-4MHz při napájení 3.3V. Od fADC se odvíjí vzorkovací čas, který trvá tři periody (3x1/fADC). Například při 4MHz je to celkem 0.75us. To je důležitá informace v případě, že převádíte napětí pocházející ze zdroje s výstupním odporem větším jak přibližně 10kOhm (vzpomeňte na Théveninovu větu). Protože musíte zaručit, že se za tento čas stihne dostatečně nabít vzorkovací kondenzátor (3pF). Celý převod trvá 14 taktů. Tedy konkrétně pro clock 4MHz je to 3.5us. Při 6MHz je to 2.33us a pokud převod běží v kontinuálním režimu (tedy jen co se jeden převod dokončí hned začne další) dokáže ADC změřit 428 tisíc převodů za sekundu.

/ Vstupy AD převodníku|

Jak už jsem se zmínil, AD převodník je vybaven analogovým multiplexerem (MUX), kterým si lze připojit k AD převodníku jeden ze 16ti vstupů (na STM8S208R). Které piny to umožňují si můžete dohledat v datasheetu. Pro přehlednost si ale dovolím vyznačit je na následujícím obrázku.

ADC inputs
Vstupy AD převodníku na našem STM8S208RB

/ Ovládání AD převodníku|

AD převodník lze využívat ve třech režimech. Už byla řeč o kontinuálním režimu. Ten můžeme klidně pustit z hlavy, protože jeho použití je velmi náročné na zpracování dat (každou milisekundu musíme "odbavit" stovky výsledků). Dalším režimem o kterém bude řeč později je tzv. "spouštěný" nebo "trigrovaný" převod. V něm AD převodník čeká na vnější nebo vnitřní signál, který odstartuje převod. Poslední a asi nejčastější používaný režim je tzv "single conversion" - jednorázový převod. V něm náš program spustí převod kdy uzná za vhodné. K ovládání ADC slouží následující funkce:

Následující kód ukazuje jak může vypadat inicializace ADC pro měření na kanálech ADC_IN2 (PB2) a ADC_IN3 (PB3).

// inicializace ADC 
void ADC_init(void){
// na pinech/vstupech ADC_IN2 (PB2) a ADC_IN3 (PB3) vypneme vstupní buffer
ADC2_SchmittTriggerConfig(ADC2_SCHMITTTRIG_CHANNEL2,DISABLE);
ADC2_SchmittTriggerConfig(ADC2_SCHMITTTRIG_CHANNEL3,DISABLE);
// nastavíme clock pro ADC (16MHz / 4 = 4MHz)
ADC2_PrescalerConfig(ADC2_PRESSEL_FCPU_D4);
// volíme zarovnání výsledku (typicky vpravo, jen vyjmečně je výhodné vlevo)
ADC2_AlignConfig(ADC2_ALIGN_RIGHT);
// nasatvíme multiplexer na některý ze vstupních kanálů
ADC2_Select_Channel(ADC2_CHANNEL_2);
// rozběhneme AD převodník
ADC2_Cmd(ENABLE);
}

| Poznámky /

| Odkazy /

Home
| v0.9 12.6.2022 /
| By Michal Dudka (m.dudka@seznam.cz) /