duminică, 28 august 2011

Convertorul Analog-Digital(AD)

Convertorul Analog Digital,după cum îi spune şi numele, are rolul de a converti valorile semnalelor analogice în valori numerice.Semnalele analogice care intră în convertor pot proveni de la diverse dispozitive însă în cele mai multe cazuri acestea provin de la diverşi senzori(senzori de lumina, temperatura,etc.).

Pentru a putea folosi un convertor mai întâi trebuie setat pragul minim şi maxim de tensiune la care el funcţionează.Convertorul microcontrolerului ATMega8 permite mai multe moduri de alegere a referinţei de tensiune cum ar fi o referinţa externă prin pinul AVCC,internă egală cu cu tensiunea de alimentare sau internă egală cu 2,56V.În momentul folosirii ,convertorul trebuie legat şi la masă, acest lucru făcându-se prin pinul AREF.

Acest convertor stochează valoarea tensiunii numeric într-un registru de 10 biţi.Convertorul acestui chip are 6 canale de intrare care se găsesc pe portul C şi sunt notate cu ADC(ADC0-ADC5).La un moment dat se poate citi doar un singur canal.Rezultatatul citirii va fi depus în regiştrii de 8 biţi ADCH şi ADCL.Timpul de citire poate fi şi el prescalat iar numărul de tacte necesare pentru citire este 13.
Selecţia referinţei şi a canalului se face prin registrul ADMUX care are următoarea formă:
Biţii 7 şi 8 (REFS1 şi REFS0) folosesc la selecţia referinţei astfel:
REFS1 REFS0
00- Referinţă externă la pinul AREF;
01- Referinţă internă VCC cu rezistenţă şi condensator la pinul AREF(R=1K
şi C=14pF );
10- Referinţă internă ca la combinaţia 0 1 însă reversată;
11- Referinţă internă de 2.56V cu rezistenţă şi condensator la pinul AREF(R=1K
şi C=14pF );

Biţii 2-0 (MUX3-MUX0) au rolul de a selecta canalul de unde va fi citit semnalul:
MUX3 MUX2 MUX1 MUX0
0000– ADC0 ,pinul PC0
0001– ADC1 ,pinul PC1
0010– ADC2 ,pinul PC2
0011– ADC3 ,pinul PC3
0100– ADC4 ,pinul PC4
1110– 1.3V
1111– GND

Pinul 5,ADLAR are rolul de a selecta modul de scriere a valorii citite în regiştrii ADCL şi ADCH.Aceşti regiştrii sunt de 8 biţi însă rezutatul este pe 10 biţi, astfel se folosesc ambii regiştrii pentru memorare în felul urmăror:
Dacă bitul ADLAR = 0 avem primul mod de reţinere în care primii doi cei mai semnificativi biţi sunt reţinuţi în ADCH iar restul de 8 biţi sunt reţinuţi în ADCL.Dacă ADLAR = 1 atunci primii 8 cei mai semnificativi biţi sunt reţinuţi în ADCH iar restul de 2 biţi sunt reţinuţi în ADCL.Modul doi de reţinere se poate folosi atunci când dorim ca rezultatul să fie returnat pe 8 biţi, caz în care putem citi doar registrul ADCH.

Controlul convertorului se face prin registrul ADCSRA care are următoarea formă:
Cel mai seminiciativ bit,bitul ADEN are rolul de a permite folosirea convertorului astfel dacă ADEN = 1 convertorul poate fi folosit.
Bitul 6,ADSC, este folosit pentru a porni convertorul.Dacă dorim să citim valoarea unei tensiuni la un moment dat se setează bitul ADSC=1.Acest bit rămâne setat până când se realizează conversia, după conversie valoarea lui va deveni 0.

Prin bitul 5,ADRF, se setează modul de citire al tensiunii,astfel dacă ADRF=1 convertorul citeşte repetat valoarea tensiunii iar dacă ADRF = 0 citirea se face doar când ADSC = 1.
Pentru generarea unui semnal de întrerupere în momentul terminării conversiei trebuie ca bitul ADIF să fie 1.Bitul ADIE are valoarea 1 atâta timp cât nu a fost trimis nici un semnal de întrerupere.Dacă s-a trimis o cerere de întrerupere el devine 0 până când se execută rutina de tratare.La terminarea execuţiei rutinei ADIE ia valoarea 1.

Ultimii 3 biţi,ADPS2-ADPS0 au rolul de a prescala timpul de citire a tensiunii astfel:
ADPS2 ADPS1 ADPS0 Prescalarea frecvenţei interne
000 2
001 2
010 4
011 8
100 16
101 32
110 64
111 128

Algoritmul de setare şi citire a convertorului este următorul:
În partea de setare a programului se setează registri ADMUX,setând referinţa,modul de citire şi canalul şi apoi se setează ADCSRA ,registru în care trebuie să avem mare grijă ca cel mai semnificativ bit să fie setat.
În partea de ciclare infinită trebuie să vedem cum am configurat citirea, periodică sau nu.Dacă citirea se face periodic atunci nu ne rămâne decât să citim valoarea convertorului.Dacă nu, citirea se face conform paşilor:
-pornim citirea:ADCSRA =ADCSRA | 0x40;
-aşteptăm să se termine citirea: while(ADCSRA | 0x40 == 1);
-citim valoarea convertorului;

Valoarea returnată va fi un număr cuprins între 0 şi 1024 dacă citirea se face pe 10 biţi sau între 0 şi 256 dacă citirea se face pe 8 biţi.Precizia citirii se calculează în felul următor:

Unde P este precizia şi Vref este tensiunea de referinţă care se poate împărţi la 1024 sau 256 în funcţie de numărul de biţi ai registrului de stocare.
Calcularea tensiunii efective se face după următoarea formulă:
Unde Tens reprezintă tensiunea efetivă,Vcit reprezintă valoarea returnată de convertor iar Vref tensiune de referinţă.

În exemplul următor vom citi valoarea unei tensiuni şi o vom afişa pe un LCD.Schema electrică este următoarea:

Progamul îl puteţi downloada de la secţiunea Download -Convertorul A/D -Aplicaţie 1.
Înainte de scrierea programului , la partea de setarea a generării codului vom avea următoarea setare:
Important aici este să nu uitaţi partea de setarea a LCD-ului pe portul D.
După generare, setările dinaintea părţii de ciclare vor fi următoarele:

ADMUX=0x00;

Adică referinţa va fi externă la pinu AREF,se citesc 10 bţi din partea stângă a registrului ADCH şi se selectează canalul 1.

ADCSRA=0x89;

Adică se permite folosirea convertorului,se activează permisia trimiterii cererii de întreruperea la terminarea citirii şi se prescalează ceasul cu 2.
Codul din bucla infinită este următorul:

ADCSRA |= 0x40; //pornim conversia
while(ADCSRA&0x40); //astempam ca citirea sa se finalizeze
adc_data = (adc_data*5*100)/1023; //calculam valoarea tensiunii
//transformam valoarea obtinuta in sir
valoare[0] = adc_data/100+48;
valoare[1] = '.';
valoare[2] = (adc_data/10)%10+48;
valoare[3] = adc_data%10+48;
valoare[4] = '\0';
sprintf(linie1,"V=%s",valoare); //copiem valoarea in sirul linie1
//afisam rezultatul pe LCD
lcd_clear();
lcd_gotoxy(0,0);
lcd_puts(linie1);
delay_ms(200); //asteptam 2 milisecunde

Aici microcontrolerul începe cu citirea tensiunii apoi se calculează valoarea efectivă a tensiunii.După aceste operaţii se transformă valoarea din long în şir de caractere după care se afişează pe ecran rezultatul.

Aplicaţia fizică o puteţi urmări aici:


2 comentarii:

Nicutz spunea...

Multumesc pentru exlicatii, au fost de folos !!

Nicutz

Anonim spunea...

Un articol interesant despre elementele de baza ale convertorului AD...multumim!

Trimiteți un comentariu

Twitter Delicious Facebook Digg Stumbleupon Favorites More