Obsluha A/D převodníku

dsPIC patří mezi Digitální Signálové Procesory (DSP). Typická aplikace takového procesoru vypadá tak, že na jeho vstupu je A/D převodník a na výstupu naopak D/A převodník. Tak procesor může zpracovávat vstupní analogová data a zase je v analogové formě na výstupu odevzdávat. Protože procesory dsPIC obsahují poměrně výkonné A/D převodníky s mnoha možnostmi, budeme se právě v tomto článku věnovat jejich obsluze. Článek je zaměřen konkrétně na 12-ti bitový převodník procesorů z rodiny dsPIC 30FXXXX, ale velmi podobně se chovají i 10-ti bitové převodníky a převodníky v rodině procesorů dsPIC 33Fxxxx.

Popis převodníku

Než přistoupíme k vlastnímu programování, je třeba si popsat jaké části A/D převodník v procesorech dsPIC obsahuje a jak funguje. Nejlépe je vyjít přímo ze schématu uvedeného v 18. kapitole dokumentu dsPIC Family Reference Manual (FRM).


Schéma 12ti bitového převodníku v procesorech dsPIC 30FXXXX Vlastní převodník je na obrázku podbarven červeně. Jedná se o 12-ti bitový převodník s postupnou aproximací. Převodník je schopen pracovat s maximální vzorkovací frekvencí 200 ksps. Převodník s postupnou aproximací pro svou činnost vyžaduje zachování dvou podmínek. První z nich jsou přesná a stabilní referenční napětí. Ta můžeme volit ze dvou zdrojů - buďto jsou odvozena přímo z napájecího napětí analogové části procesoru (může být odděleno od digitálního napájení) nebo z nezávislého zdroje referenčního napětí přiváděného na vstupy dsPICa. Konfigurace referenčních napětí se provádí pomocí bitů VCFG v registru ADCON2, a to nezávisle pro kladné a záporné napětí.
Druhou podmínkou úspěšného převodu pomocí postupné aproximace je stabilita vzorku po celou dobu převodu. Té se dá dosáhnout zesilovačem Sample and Hold (S/H), který nabere vzorek napětí (sample) a udrží beze změny jeho hodnotu po celou dobu převodu (hold). Blok S/H zesilovače je v obrázku podbarven žlutou barvou. Jak vlastní převod, tak i nabírání vzorku vyžaduje určitý čas. Proto jsou oba obvody řízeny hodinovým signálem s periodou Tad. Ta může být odvozena buďto od taktování jednotlivých instrukcí (Tcy) nebo od kmitočtu nezávislého RC oscilátoru, čehož se využívá v situacích, kdy má A/D převodník fungovat ve sleep módu procesoru. časování převodníku se nastavuje v registru ADCON3. Bit ADRC určuje zda zdrojem hodin bude interní RC oscilátor (log. 1) nebo systémové hodiny Tcy (log. 0). Šestice bitů ADCS<5:0> určuje dělící poměr mezi Tcy/2 a Tad. Je tedy možno nastavit libovolný poměr mezi Tcy/2 a Tcy*32. Bity SAMC určují kolik period Tad bude prováděno samplování v režimu automatického převodu (viz níže).

Dalším důležitým modulem je přepínání vstupů (na obrázku podbarven zeleně). Základní funkcí tohoto bloku je výběr jednoho z až 16 analogových vstupů (verze procesorů s menším počtem pinů jich mají osazen pouze menší počet a v příslušném datasheetu je třeba vyhledat, které konkrétně to jsou). To jestli vstup bude fungovat jako analogový (log. 0) nebo digitální (log. 1) je určeno příslušným bitem z registru ADPCFG. Pin samozřejmě musí být nastaven jako vstupní pomocí příslušného TRIS registru. Vybraný analogový vstup je přiveden na neinvertující vstup S/H zesilovače. Na invertující vstup se buďto přivádí referenční napětí Vref-, nebo namísto toho je možno použít napětí přivedené na vybrané analogové vstupy a převádět tak rozdíl napětí mezi vybranými dvojicemi vstupů. Nastavení vstupní jednotky se provádí pomocí skupin bitů v registru ADCHS. Existuje mnoho možností nastavení a na první pohled to vypadá složitě, ale v nejjednodušším režimu stačí pomocí bitu CH0NA nastavit na invertujícím vstupu S/H zesilovače záporné referenční napětí (log. 0) a pomocí CH0SA vybrat jeden z dostupných vstupů. Ostatní bity registru ADCHS je možno vynulovat (vynulujeme-li celý registr ADCHS, je nastaven jako vstup AN0). Takto nastavíme převodník jestliže chceme převádět trvale z jednoho vstupu nebo vstupy podle potřeby přepínat softwarově.

A/D převodník ale umí i režim scanování. V něm automaticky postupně přepíná vybrané vstupy a provádí popořadě jednotlivé převody. Výběr vstupů se v takovém případě provádí pomocí registru ADCSSL a pomocí bitů SMPI<3:0> z registru ADCON2 se dá nastavit po kolika takových převodech dojde k vyvolání přerušení. Je tedy možno například nechat automaticky naměřit hodnoty napětí na až šestnácti čidlech, výsledky nechat uložit do 16ti registrů a teprve pak vyvolat přerušení a takto automaticky získané výsledky dále softwarově zpracovat. Možných speciálních režimů činnosti A/D převodníku je celá řada, ale zde se jimi dále nebudeme zabývat. Zájemci najdou veškeré podrobnosti v již zmíněné 18. kapitole FRM.

O ovládání S/H zesilovače, složitější režimy výběru vstupů, uložení a interpretaci výsledků převodu se starají na schématu modře podbarvené bloky. Režim ovládání S/H zesilovače vlastně určuje, jakým způsobem budou jednotlivé převody spouštěny. Nastavuje se pomocí bitů SSRC<2:0> v registru ADCON1. Převod může být spuštěn softwarově vynulováním bitu SAMP nebo automaticky po uplynutí nastaveného počtu period Tad určených bity SAMC z registru ADCON3. Existují ale i další použitelné spouštěcí mechanizmy jako vstup INT0, časovač TMR3 nebo interval jednotky PWM. Vlastní samplování (nastavuje se bitem ASAM) může být zahájeno automaticky ihned po dokončení posledního převodu nebo ručně nastavením bitu SAMP do logické 1.

Výsledek převodu je ukládán do jednoho ze šestnácti dvanáctibitových registrů ADCBUF0ADCBUFF. Konkrétní buffer, do kterého bude výsledek uložen je určen počtem převodů na jeden interupt a pořadím daného převodu ve skupině. Bude-li například nastaven jeden převod na přerušení (SMPI=0), bude výsledek vždy v bufferu ADCBUF0. Bude-li SMPI=3 (čtyři převody na přerušení), budou postupně naplněny buffery ADCBUF0ADCBUF3 a pak dojde k přerušení. Při čtení těchto registrů dochází k automatické konverzi formátu dat nastaveného v bitech FORM<1:0> registru ADCON1. Lze zde nastavit formát integer bez znaménka, se znaménkem a formát zlomkový také bez nebo se znaménkem.

Celkové zapnutí převodníku zajistí nastavení bitu ADON v registru ADCON1 do logické jedničky. Ukončení převodu je indikováno bitem DONE v témže registru, takže obsluha se případně dá realizovat i bez použití přerušení. Ještě ovšem existuje jeden bit, který výrazným způsobem ovlivňuje činnost A/D převodníku. Nachází se ovšem v registru, o kterém není v kapitole 18 FRM ani zmínka. Jedná se o registry PMD, které zajišťují minimalizaci spotřeby procesoru dsPIC vypnutím nepotřebných periférií. Zmínka je o tom v kapitole 10.7 FRM s tím, že konkrétní registry pro jednotlivé typy procesorů je třeba dohledat v jejich datasheetech. Například u procesoru dsPIC 30F3012/3013 je to popsáno v kapitole 17.8 datasheetu. Pro A/D převodník se konkrétně jedná o bit ADCMD z registru PMD1, který musí být vynulován, aby byl převodník napájen.

Tiny Bootloader (viz odpovídající článek) tento bit nastavuje na log. 1 a tak převodník vypíná. Proto je třeba, pokud tento bootloader použijete, nejprve v uživatelském programu vynulováním tohoto bitu převodník zapnout!

Příklady

A nyní několik jednoduchých příkladů konkrétních konfigurací A/D převodníku, jejichž zdrojový kód najdete v příloze tohoto článku. Nastavení registrů převodníku je v těchto ukázkových programech záměrně psáno tak, aby bylo co nejčitelnější. To ale znamená, že programy nejsou optimální z hlediska zabrané paměti ani doby vykonávání. Například nastavení registru ADCON1 je v prvním příkladu řešeno čtyřmi řádky:

ADCON1bits.ADON = 0; //Vypnutí převodníku ADCON1bits.FORM = 0; //formát výstupu (0 unsigned int, 1 int, 2 unsignet fractional, 3 fractional) ADCON1bits.SSRC = 0; //start převodu (0 ručně, 1 INT0, 2 TMR3, 3 PWM, 7 auto) ADCON1bits.ASAM = 0; //start samplování (0 ručně, 1 auto ihned po převodu)

Ty se přeloží pomocí deseti instrukcí strojového kódu. V případě, že nám jde o optimalizaci, můžeme totéž zapsat jediným řádkem:

ADCON1 = 0;

Ten je pak přeložen pomocí pouhých dvou instrukcí strojového kódu.

První příklad

A-D-prevod1.c používá to úplně nejzákladnější nastavení převodníku. Celý program běží v nekonečné smyčce, ve které se čeká na interval (zhruba půl sekundy) od časovače TMR1 (bez použití přerušení). Převádí se z jediného vstupu (AN2) a celý převod je řízen "ručně". To znamená, že se ručně spustí samplování, počká se na interval od časovače, když přijde, ukončí se ručně samplování čímž se zároveň spustí převod. Počká se na dokončení převodu (opět bez použití přerušení jen na základě testování bitu DONE v registru ADCON1), přečte se výsledek, který je následně odeslán přenosovou rychlostí 38400 Bd na sériový port. Poté se znova spustí samplování, čeká se na další interval od TMR1 a celý tento cyklus se neustále opakuje.

Druhý příklad

A-D-prevod2.c se od prvního liší pouze tím, že používá automatické spuštění převodu. Po příchodu intervalu od TMR1 se spustí samplování. Po době 1 Tad (což je dáno bity SAMC v registru ADCON3) se automaticky spustí převod. Po něm se jen odešlou výsledky a čeká se na další interval od TMR1.

Třetí příklad

A-D-prevod3.c již používá plně automatizovaného převodu. Převod se zahajuje pomocí časovače TMR3 a samplování začíná automaticky ihned po dokončení předchozího převodu. Po dokončení převodu vyvolá převodník přerušení a v jeho obslužné rutině se provede zpracování výsledků (v tomto příkladu opět pouze odeslání na sériový port). Veškeré nastavení je pro větší přehlednost programu umístěno ve funkci s názvem Inicializace(), takže hlavní program pak zabírá pouze několik řádků (vpodstatě pouze dva, Inicializace a nekonečný cyklus while):

int main (void) { Inicializace(); // Vše se nejprve zinicializuje while(1) // Nekonečný cyklus { //veškerá obsluha se realizuje jen v ISR, //proto je zde hlavní smyčka programu prázdná } } //Konec main()

K této verzi příkladu jsem vytvořil i primitivní windows aplikaci PICoscilo, která zobrazuje hodnoty odeslané z dsPICu sériovým portem do počítače. Vzorkovací frekvence se v případě použití tohoto prográmku musí nastavit dostatečně nízká (kolem 10 Hz) a odesílání výsledků se musí nastavit na jednobajtové (je to zakomentováno ve zdrojovém kódu pro dsPICa).

PřílohaVelikost
PICoscilo.zip75.84 KB
priklady-AD.zip6.71 KB