ATtiny85‎ > ‎

Analógovo-digitálny prevodník

V nasledovnom texte by som sa nechcel až tak zameriavať na bežné ADC prevody, ktoré sa v podstate nelíšia od tých, čo máme v Arduine, ale viac na diferenciálne prevody, o ktorých je na Internete pomenej informácií.
https://sites.google.com/site/arduinoslovakia/attiny85/analogovo-digitalny-prevodnik/attiny85_adc.png

ATtiny85 konvertuje merané napätie pomocou 10-bitového prevodníka, čiže je rovnako presný ako v prípade Arduina. Máme k dispozícii štyri vstupy:
  • ADC0 - Nachádza sa na pine 1. Jeho využiteľnosť v bežnom nastavení fuses je diskutabilná, pretože ten istý pin využíva aj reset.
  • ADC1 - Nachádza sa na pine 7.
  • ADC2 - Nachádza sa na pine 3.
  • ADC3 - Nachádza sa na pine 2.
Ak používame analógové vstupy na meranie napätie, môžeme použiť ľubovoľný z nich. Ak sa rozhodneme pre diferenciálne vstupy, delíme ich na:
  • Kladné - Kladnými vstupmi môžu byť:
    • ADC0
    • ADC2
  • Záporné - Zápornými vstupmi môžu byť:
    • ADC0
    • ADC1
    • ADC2
    • ADC3
Vidíme, že je tu nepomer medzi počtami vstupov, ale má to svoj zmysel. Tvorcovia mikrokontroléra totiž umožnili merať offset na zosilňovači a preto je na kladnom vstupe len polovica možností. ADC0 a ADC2 môžu byť konfiguráciou MUX[0:3] v registri ADMUX nastavené na oba vstupy zosilňovača. Skúsil som to merať zo zvedavosti, na mojom mikrokontroléri som ale nameral nulový offset. Nemusí to byť ale pri každom exemplári.

Pri rozdielovom meraní si možno vybrať zosilnenie:
  • 1x
  • 20x
Ako napäťová referencia merania môže slúžiť:
  • Vcc - To isté napätie, ktoré napája mikrokontrolér. V prípade diferenciálneho merania datasheet toto nedoporučuje, pretože to nejakým nešpecifikovaným spôsobom má ovplyvňovať presnosť.
  • AREF - Na pine PB0. Externá referencia. V prípade diferenciálneho merania datasheet toto nedoporučuje, pretože to nejakým nešpecifikovaným spôsobom má ovplyvňovať presnosť v prípade, že je AREF>Vcc-1V.
  • Interná referencia 1,1V - Bez obmedzenia.
  • Interná referencia 2,56V - V datasheete je zmienka, že minimálne Vcc je v tomto prípade 3V.
Konverzie:
  • Jednoduché meranie - Vin väčšie ako Vref dáva výsledok 1023.
    • ADC=Vin x 1024 / Vref
  • Rozdielové unipolárne - Vpos musí byť väčšie ako Vneg.
    • ADC=(Vpos - Vneg) x 1024 x GAIN / Vref
  • Rozdielové bipolárne - Vpos môže byť aj menšie ako Vneg. V tomto bode si to vyžaduje ešte výskum. Zatiaľ sa mi zdá, ako keby tento režim nefungoval podľa datasheetu. Možno som zatiaľ niečo dobabral pri jeho nastavovaní. Našiel som na Internete, že je to funkčné iba pri internej referencii 1.1V, ale zaťiaľ som nemal kedy to podrobnejšie preskúmať.
    • ADC=(Vpos - Vneg) x 512 x GAIN / Vref

Arduino

Ak sa chceme venovať ADC prevodom, je dobre ak sa pozrieme na to, ako nastavuje pre nás Arduino východzí stav. Celá inicializácia je ukrytá vo funkcii init() v súbore wiring.c. V kóde je tam vidno, že sa nastavuje frekvencia konverzie na 125 kHz (CK/128) a ADC sa povoľuje. Súčasne je v kóde poznámka, že nastavenie preddeličky je natvrdo podľa frekvencie 16 MHz a že pre iné frekvencie hodín nie je preddelička nastavená tak, aby sa trafila do intervalu 50-200 kHz.
Takto je to nastavené v zdrojových kódoch verzie IDE 1.0.6 a 1.5.8. V novších môže byť táto logika zmenená.

Ak ADC nepotrebujeme

ATtiny85 používame preto, že má nízku spotrebu. Zapnuté ADC v prípade, že s ním nerobíme, znamená len mrhanie prúdom. Takže ak nám záleží na spotrebe, je vhodne nastaviť bit ADEN v ADCSRA na 0.

Vyladenie frekvencie

V nasledovnej tabuľke je vypočítaná frekvencia s preddeličkou a sú tam aj vyznačené výsledky, ktoré sú vhodné pre optimálny výsledok konverzie. Podľa tabuľky si treba nastaviť bity ADPS[2:0] v ADCSRA.
 F_CPU CK/2CK/4 CK/8 CK/16 CK/32 CK/64 CK/128 
 1000000 500000250000 125000  62500 31250 15625 7812
 8000000 40000002000000 1000000 500000 250000 125000 62500 
Ak je mikrokontrolér zapnutý na 16 MHz, nie je treba nič nastavovať. Toto sa týkalo tých, čo používajú kód Davida A. Mellisa. Ak používate alternatívnu verziu arduino-tiny, v nej nie je treba nič nastavovať a jadro sa o to postará samé.

Diferenciálne prevody

Po pár krvopotných experimentoch sa konečne objavili nejaké výsledky. Dá sa povedať, že pre reálne použitie je k dispozícii iba pár ADC2 a ADC3 (PB4, PB3). Druhá dvojica nie je pri normálnom nastavení fuses použiteľná, pretože druhé ADC leží na resetovacom pine.
Druhý poznatok je ten, že fungujú oba režimy, aj normálny rozdiel, aj zväčšený operačným zosilňovačom. Ale na to, aby z toho vypadli rozumné výsledky, je potrebné robiť viac meraní. Ak je iba jedno meranie, tak je vysoko pravdepodobné, že sa nenamerá nič. Rozumné množstvo meraní je 16-32.
Tretí poznatok je ten, že neplatí úplne presne, že ak odmeriam dve napätia normálnym ADC a potom urobím rozdiel, že dostanem rovnaký výsledok ako v diferenciálnom móde. Výsledky sa mierne líšia a keď sa použije zosilnenie 20x cez interný operačný zosilňovač, je rozdiel ešte viac viditeľný.

[tu sa postupne objavia popisy jednotlivých prevodov]
Comments