V tomto článku si povieme niečo o AD prevodníku. Čo to vlastne je a ako jednoducho ho použiť.

Čo je to AD prevodník ?

AD prevodník (anglicky ADC – Analog to Digital Converter = Analógovo-digitálny prevodník) je elektronické zariadenia na prevod analógového signálu na digitálny signál. Analógovým signálom býva napätie alebo prúd, ktorý sa privedie na vstup AD prevodníka. Výsledkom prevodu je číslo, ktoré zodpovedá veľkosti vstupného analógového signálu.

Takýto AD prevodník sa používa veľmi často v zariadeniach, ktoré merajú napätie alebo prúd (napr. digitálne multimetre), alebo tiež v zariadeniach ktoré merajú neelektrické veličiny napr. v digitálnych teplomeroch, tlakomeroch a pod.

Základné parametre AD prevodníka

Parametre AD prevodníkov si môžete pozrieť v ebooku od Ondreja Závodského na strane 37.

AD prevodník v Arduinu

AD prevodník v Arduinu je 10 bitový (čím myslíme že má 10 bitové rozlíšenie), tzn. výsledné číslo po konvertovaní môže nadobúdať hodnoty 0 až 1023. Prevodník v Arduinu obsahuje 6 kanálov (8 kanálov Mini a Nano, 16 kanálov Mega), čomu zodpovedajú vývody A0 až A5, nazývame ich analógové vstupy. Môžeme teda snímať až 6 analógových signálov. Väčšinou tieto vstupy používame na pripojenie analógových senzorov, ale tieto vstupy je možné použiť aj ako štandardné digitálne vstupy alebo výstupy.

pinMode(A0, OUTPUT);
digitalWrite(A0, HIGH);

UPOZORNENIE

Ak chcete hociktorý analógový vstup použiť ako vstup AD prevodníka a použili ste ho predtým ako digitálny výstup (viď príklad) je nutné ho nastaviť späť ako vstupný, inak vám AD prevodník nebude fungovať.

Ak chceme teda použiť AD prevodník v Arduinu, urobíme to nasledovne:

int adcValue = analogRead(A0);

Týmto zápisom docielime prevod napätia (analógového signálu) na číslo (adcValue). Máme na to funkciu analogRead(Ax), ktorá ma jeden vstupný parameter a tým je číslo analógového vstupu (A0 až A5). Funkcia vracia číslo, ktoré vzniklo po skonvertovaní napätia na vstupe, ktorý sme zadali ako parameter.

AREF vývod na Arduinu

Tento vývod súvisí s AD prevodníkom. V súvislosti s týmto je treba spomenúť aký je vstupný rozsah napätia na analógových vstupoch. Tento rozsah je 0 až VCC (VCC môže byť tak 5V alebo 3,3V podľa typu Arduina). Číslo, ktoré nám vráti funkcia analogRead zodpovedá veľkosti napätia na vstupe, toto už vieme. Tzn. ak pripojíme napríklad nejaký analógový senzor na jeden z analógových vstupov, výstupné napätie zo senzora sa môže pohybovať v rozsahu 0 až 5V (uvažujme, že máme 5V Arduino) – všetko bude fajn, pretože AD prevodník s tým počíta (štandardné nastavenie ADC). V praxi sa ale vyskytujú senzory, ktoré majú výstupný rozsah menší, napríklad 0 – 1V, alebo 0 – 2,1V. V tomto prípade by výsledné konvertovanie bolo nepresné a my chceme čo najpresnejšie meranie, kedže pracujeme s digitálnou technikou. AREF vývod slúži teda na to aby sme nastavili takzvané referenčné napätie – je to napätie, ktoré nám určí hornú hranicu na analógových vstupoch, inak povedané aj keď máme napájacie napätie 5V, AD prevodník bude vzorkovať napätie z analógových vstupov podľa tohto (referenčného) napätia. Výsledok po konvertovaní bude tak presnejší a o to nám ide.

Ako teda nastaviť referenčné napätie?

Arduino má na toto špeciálnu funkciu analogReference, ktorá má jeden vstupný parameter. Tento parameter určuje aká referencia sa má použiť.

analogReference(EXTERNAL); Použije sa externá referencia. Pripojí sa presné referenčné napätie na vstup AREF. POZOR!
Toto napätie musí byť v rozsahu 0 až 5V.
analogReference(INTERNAL); Použije sa interná referencia. Jej veľkosť je 1,1V. (V Arduinu Mega takáto možnosť neexistuje)  
analogReference(DEFAULT); Štandardná referencia: 5 alebo 3,3 V, podľa typu Arduina Nemusíte nastavovať ak chcete použiť AD prevodník so štandardnou referenciou.
analogReference(INTERNAL1V1); Nastavenie internej referencie 1,1 V. Iba v Arduinu Mega
analogReference(INTERNAL2V56); Nastavenie internej referencie 2,56 V. Iba v Arduinu Mega

Ukážka nastavenia externej referencie.

void setup()
{
	//Najprv nastavime referenciu
	analogReference(EXTERNAL);
}

void loop()
{
	//az potom zavolame funkciu analogRead
	int adcValue = analogRead(A0);
}

Príklad použitia AD prevodníka na meranie teploty

Ukážeme si ako jednoducho použiť AD prevodník v Arduinu na meranie teploty.

Takže ingrediencie :):

  • Arduino UNO alebo jeho kompatibilný klon
  • Analógový teplotný senzor LM35
  • Kontaktné pole a niekoľko vodičov

Na toto zapojenie použijeme analógový senzor teploty s označeným LM35DZ v puzdre TO92. Tento senzor je schopný merať teplotu v rozsahu 0 až 100 °C s presnosťou +/- 0,75°C podľa datasheetu. Iné označenia tohto senzora (LM35XY) dokážu merať teplotu aj v iných rozsahoch.
Ešte treba spomenúť mierku (Scale factor), aby sme vedeli vypočítať výslednú teplotu podľa „nameranej“ hodnoty napätia. Ta mierka je 10mV/°C, tzn. že 10mV na analógovom vstupe znamená 1 °C.

Zapojenie na kontaktnom poli

 

Ako je vidieť na obrázku zapojenie je veľmi jednoduché. Treba si dať hlavne pozor na správne zapojenie senzora.

Schéma zapojenie

Zdrojový kód

Zdrojový kód v súbore ino.
int adcValue = 0;
float tempInCelsius;

void setup()
{
	Serial.begin(9600);		
}

void loop()
{
	// nacitame hodnotu z AD prevodnika
	adcValue = analogRead(A0);
	// prepocitame na celziove stupne
	// (ADC * AREF / 10mV) / 1024
	tempInCelsius = ((adcValue * 5000.0) / 10.0) / 1024;	

	Serial.println(tempInCelsius);

	delay(1000);
}

Popis zdrojového kódu

Zdrojový kód je veľmi jednoduchý na riadku 12 načítame hodnotu z AD prevodníka, ktorú následne prepočítame na Celziove stupne (riadok 15). Vypočítanú teplotu hneď pošleme do PC cez sériové rozhranie. Celý cyklus sa opakuje po 1 sekunde.

Môžeme si ešte posvietiť na výpočet teploty. Hodnotu získanú z AD prevodníka vynásobíme referenčným napätím. Používame štandardné referenčné napätie 5V, túto hodnotu sme previedli na mV (milivolty). Výsledok násobenia podelíme desiatimi. Toto číslo predstavuje mierku senzora 10mV. Nakoniec ešte podelíme číslom 1024 (10 bitov) a máme teplotu v Celziových stupňoch.

Takýto spôsob je založený na percentuálnej hodnote a môže byť nepresný. Ak by sme chceli zvýšiť presnosť, musíme znížiť referenčné napätie AD prevodníka. Maximálne výstupné napätie senzora LM35 je 1 V, tzn. mali by sme nastaviť referenčné napätie na túto hodnotu.

Upravený zdrojový kód

Zdrojový kód v súbore ino.
// 10mV / (AREF[mV] / 1024)
// 10 / (1100 / 1024)
#define TEMP_DIVIDER 9.31

int adcValue = 0;
float tempInCelsius;

void setup()
{
	Serial.begin(9600);	
	//zmenime referencne napatie na interne = 1.1V
	analogReference(INTERNAL);
}

void loop()
{
	// nacitame hodnotu z AD prevodnika
	adcValue = analogRead(A0);
	// prepocitame na celziove stupne	
	tempInCelsius = adcValue / TEMP_DIVIDER;

	Serial.println(tempInCelsius);

	delay(1000);
}

Možno už viete, že v tomto prípade môžeme využiť aj internú referenciu 1,1V, nasledujúcim nastavením v setup metóde:

analogReference(INTERNAL);

Nie je to síce 1 V, ale meranie bude určite presnejšie ako predtým. Celý sketch môžete vidieť vpravo.

K číslu 9,31 sme sa dostali nasledovne:

Všimnite si komentár na riadkoch 1 a 2 je tam vzorec, podľa ktorého sme vypočítali toto číslo. Najprv si vypočítame koľko voltov pripadá na jeden dielik (z 1024) teda podelíme čísla:

1100 / 1024 = 1,0742

– 1100 je referenčné napätie 1,1V v mV. Výsledkom podelíme číslo 10 – čo je mierka senzora 10mV.

10 / 1,0742 = 9,31

Týmto zistíme koľko dielikov treba na jeden Celziov stupeň. Čiže na 1 °C nám pripadá 9,31 dielika. No a potom už je jednoduché vypočítať teplotu ako je vidieť na riadku 20.

Zhrnutie na záver

V tomto článku sme sa naučili ako používať AD prevodník v Arduinu. Funkcie, ktoré na to využívame sú: analogRead - na skonvertovanie analógového signálu na konkrétnom vstupe a funkcia analogReference, ktorou nastavujeme referenčné napätie, aby bolo meranie presnejšie. V prípade, že máte nejaké otázky, kľudne napíšte do komentára.