luni, 15 noiembrie 2010

ADC

Lucararea de laborator Nr.6


Tema: Convertorul analogic-digital (ADC)

Scopul lucrării: Obţinerea cunoştinţelor practice şi deprinderilor de a opera cu convertorul analogic - digital într-un microcontreller din familia AVR.

Expunerea problemei: Să se elaboreze un dispozitiv care în dependenţă de valoarea semnalului Analogic la una din intrările analogice a microcontrollerului să indice nivelul semnalului la un set de 8 leduri, nivelul minimal va aprinde un singur led, iar nivelul maxim va aprinde toate ledurile. La un nivel intermediar se va aprinde un set de leduri corespunzător nivelului  aplicat.


Consideraţii teoretice:
Modulul ADC-ului de 10 biţi cu aproximare în serie intră în componenţa modelelor ATmega 8x, ATmega 163x, ATmega 32x, ATmega 323x, ATmega 64x şi ATmega128x. Parametrii de bază al acestui ADC sunt:
  • toleranţă absolută: ±2 LSB;
  • nelinearitatea integrală: ±5 LSB;
  • rapiditatea: pînă la 15mii probe/s;
Modulul Convertor Analog-Digital este utilizat pentru conversia tensiunii analogice într-o valoare digitală (în AVR pe 10 biţi). De exemplu, poate fi utilizat pentru perceptarea ieşirii de la un senzor (de temperatură, presiune, etc.) în anumite intervale, sau pentru a executa anumite acţiuni în dependenţă de valoarea primită. Există mai multe tipuri de convertoare, dar cele utilizate în microcontrollerele AVR sunt convertoarele cu aproximare succesivă. Mai jos urmează o schemă simplificată a convertorului analog-digital prezent pe AVR:

Fig. 1 Schemă simplificată a convertorului analog-digital

La intrare avem un multiplexor analog-digital, care este utilizat la selectarea între opt intrări analogice diferite. Aceasta înseamnă că este posibilă conversia a opt semnale (bineînţeles că nu în acelaşi timp). La ieşire, valoarea convertită este înscrisă în regiştrii ADCL şi ADCH, deoarece regiştrii AVR au lăţime de 8 biţi este nevoie de o pereche p-u a stoca o valoare pe 10 biţi.
În modelele ATmega16x, ATmega32x, ATmega64x, ATmega128x pinii ADC-ului pot fi uniţi în perechi pentru a obţine în total pînă la 13 canale cu intrare diferenţială. Două canale în aşa caz au posibiliatatea de amplificare preventivă de 20 şi 200 ori a semnalului de intrare. În cazul coeficienţilor de amplificare 1x şi 20x rezoluţia efectivă a conversiei este de 8 biţi, pe cînd la coeficientul 200x – 7 biţi.
În calitate de tensiune de referinţă pentru ADC poate fi utilizată atît tensiunea microcontrollerului cît şi sursa internă sau externă de tensiune de referinţă. ADC-ul poate funcţiona în două regime:
  • regimul conversiei unice, cînd startul fiecărei conversii este iniţializată de utilizator.
  • regimul conversiei continue, cînd startul conversiei are loc continuu după anumite intervale de timp.
Tensiunea analogică la intrare trebuie să fie mai mare decît 0V, şi mai mică decît tensiunea de referinţă a convertorului – AREF. Tensiunea de referinţă este o tensiune externă care trebuie aplicată la pinul Aref a microcontrollerului. Valoarea convertită poate fi calculată folosind următorea formulă:
ADCH:L= ((Vin/Vref)*1023)
Deoarece convertorul are o rezoluţie de 10 biţi, avem 1024 valori posibile, adică dacă tensiunea de intrare Vin este egală cu 0, atunci valoarea convertită v-a fi zero, dacă Vin este egală cu Vref atunci valoarea convertită v-a fi 1023, iar dacă Vin este ½ din Vref atunci valoarea ADCH:L este 512. Acest proces de conversie se mai numeşte cuantificare, bineînţeles ce produce o eroare, numită eroare de cuantificare.
Regimurile de operare a convertorului analog-digital (CAD)
Convertorul Analog-Digital are două regimuri fundamentale de funcţionare: Conversie Unară (singulară) şi Conversie Continuă. În regim de conversie unară, este necesar de a iniţializa fiecare conversie, cînd este gata rezultatul este plasat în perechea de regiştri ADCH:L, şi nu se porneşte o altă conversie. În regim continuu, este necesar de a porni doar o dată conversia şi CAD v-a porni automat următoarea conversie în dată ce este finisată cea actuală.
Conversia analog-digitală nu este infăptuită instantaneu, este necesar de un anumit interval de timp, care depinde de frecvenţa de clock folosită de CAD şi este proporţională cu frecvenţa de clock şi poate fi între 50-200 kHz.
Dacă este de ajuns o rezoluţie de conversie mai mică de 10 biţi, frecvenţa CAD poate fi mărită prin ajustarea unui prescaler prezent în CAD, care divide frecvenţa de clock la un anumit coeficient, setat prin intermediul biţilor ADPS2:0 descrişi mai jos.
Pentru a afla intervalul de timp necesar unei conversii se divide numărul de cicluri necesari unei conversii la frecvenţa DAC. Normal, o conversie este îndeplinită în 13 cicluri CAD, dar prima conversie (deodată după pornirea CAD) se îndeplineşte în 25 cicluri de clock, şi mai este numită “Conversie Extinsă”. De exemplu dacă folosim un CAD la frecvenţa de 200kHz, o conversie normală va fi îndeplinită în 65 µs, iar una extinsă în 125 µs.
Regiştrii de stare şi control ai CAD
CAD conţine 4 regiştri de I/O:
  • ADMUX – ADC Multiplexer Select Register
  • ADCSR – ADC Control and Status Register
  • ADCH:L – ADC Data Register(High, Low)
Tabel 1. Regiştrii de control a ADC-ului

Tab. 2. ADMUX


ADMUX
Acest registru este utilizat pentru selectarea unuia din cele 8 canale care va fi convertit. Tabelul de mai jos arată setările posibile ale acestui registru:

Tab. 3 Setările posibile ale ADMUX

Fig.2. Formatul registrului ADCSRA(ADCSR)

Tab. 4 Registrul ADCSR

ADEN – ADC Enable, setînd bitul dat în "1" este pornit CAD, iar în "0" CAD este oprit. Oprind CAD în timpul unei conversii va duce la anularea conversiei date.
ADSC – ADC Start Convertion, în regim de conversie continuă va fi necesar de setat acest bit doar la prima conversie, conversiile următoare v-or fi pornite automat. În regim de conversie unară acest bit trebuie setat la fiecare conversie necesară. Acest bit se setează în "0" automat la sfîrşitul oricărei conversii.
ADFR – ADC Free Running Mode, se setează în "1" la conversie continuă.
ADIF – ADC Interrupt Flag, acest bit este setat automat în 1 la finisarea unei conversii, sau este setat automat în "0" doar la executarea ISR corespunzător vectorului de întreruperi, alternativ poate fi setat în "0" înscriind "1" în acest bit.
ADIE – ADC Interrupt Enable, cînd este setat în "1" şi SREG(I)=1 la apariţia ADIF se cheamă ISR corespunzătoare din vectorul de întreruperi.
ADPS2:0 – ADC Prescaler Select, aceşti biţi determină factorul de dividere a frecvenţei de clock pentru CAD, tabela de mai jos arată valorile posibile:


Exactitatea maximă a conversiei se obţine, dacă frecvenţa de tact a modulului ADC e cuprinsă între 50...200kHz. respectiv coeficientul scalării trebuie de ales în aşa mod, ca frecvenţa ADC-ului să se afle în acest diapazon. Dacă însă exactitatea conversiei e mai mică de 10 biţi e destul, se poate de utilizat o frecvenţă mai mare, mărind astfel frecvenţa măsurării. În modelele ATmega8x, ATmega16x, ATmega64x şi ATmega128x pentru acest scop se utilizează bitul ASCHM din registrul SFIOR. La setarea lui în ”1” viteza de conversie se măreşte. Însă concomitent creşte şi consumul de energie a microcontrollerului.

Fig.3. Formatul registrului ADCSRB

Fig.4. Formatul registrelor ADCH şi ADCL

Aceşti regiştri conţin ultima valoare convertită, ADCH – biţii ADC9:8, ADCL – biţii ADC7:0. Cînd ADCL este citit datele din ADCH nu sunt modificate pînă cind nu se citeşte şi ADCH, adică este esenţial ca ambii regiştri să fie citiţi în acelaţi timp adică ADCL se citeşte înaintea ADCH.
Seria ATMEGA conţin un CAD mai complex, care are aceleaşi funcţii de bază dar şi anumite posibilităţi mai avansate ca:
  • Şapte Canale de intrare diferenţiale;
  • Două Canale de intrare diferenţiale cu amplificare 10x şi 200x;
  • Ajustarea la stînga a regiştrilor ADCH:L (p-u rezoluţie de 8 biţi);
  • Tensiune de referinţă selectabilă de 2.56V;
Mărirea exactităţii conversiei
Mai jos sunt prezentate careva recomandări, care permit folosirea la maxim a posibilităţilor ADC-ului. În primul rînd, pentru a minimiza erorile ADC-ului însuşi, e necesar de a alege corect frecvenţa de tact a conversiei. Cu tot acest scop la intrarea ADC-ului se recomandă de conectat un filtru de frecvenţe joase. În afară de aceasta, la proiectarea construcţiei şi topologiei plăcii trebuie de respectat regulile generale de proiectare a dispozitivelor analogico-digitale:
  • pe placă trebuie prevăzută o zonă cu metalizare continuă pentru ”împămîntare” analogică. Partea analogică a microcontrollerului şi partea analogică a întregului dispozitiv trebuie să fie plasate deasupra la această zonă. ”Pămînturile” analogic şi digital trebuie să se unească unul cu altul într-un singur punct a plăcii;
  • conductorii, prin intermediul cărora sunt transmise semnalele analogice, trebuie să fie cît mai scurte şi să fie amplasate deasupra ”pămîntului” analogic. În afară de aceasta, ei trebuie să fie amplasaţi cît mai departe de ciruitele digitale rapide;
  • pinul AVCC a microcontrollerului trebuie să fie unit la sursa de alimentare prin filtru LC, cu e arătat în fig.5
  • dacă careva din pinii de intrare a ADC se utilizează ca pini de ieşire digitali, ei nu trebuie să-şi schimbe starea în timpul conversiei.
Fig. 5 Conectarea alimentării la ADC
Pentru a micşora la minim zgomotele electromagnetice, induse de nucleul procesorului, în toate microcontrollerele analizate, există un regim adăugător de ”somn” - ADC Noise Reduction. În acest regim, din toate periferiile lucrează doar ADC şi watchdog-ul. Cu acelaşi scop, dar efectivitate mai mică poate fi folosit regimul Idle. Pentru utilizarea ADC-ului în oricare din regimele indicate, e necesar de a se convinge că ADC-ul este conectat şi nu e ocupat cu vre-o conversie, după care de conectat ADC-ul în regim de conversie unică şi de permis intreruperile de la ADC, după care de pus microcontrollerul în regim ADC Noise Reduction (sau Idle).
Imediat după oprirea procesorului se va începe ciclul de conversie. După finisarea conversiei o să fie generată o întrerupere, care va readuce microcontrollerul în regim de lucru, şi se va începe executarea subrutinei de prelucare a întreruperii date.

Fig. 6 Parametrii de bază a ADC

Mersul lurării:
1)  Pentru  afişarea variaţiei tensiunii sursei de curent, vom utiliza un bargraph cu 10 nivele. Pentru controlul lui vom utiliza Portul C şi primii 2 pini din Portul D. Pentru intrarea semnalului vom utiliza PinA0.
Principiul de lucru va fi următorul: ADC-ul e setat în regim de conversie continuă  şi va lua probe ale semnalului de intrare, şi la finisarea conversiei va genera o întrerupere. În subrutina de prelucrare a întreruperii se va face compararea valorii ADC-ului cu valorile asociate cu fiecare nivel, astfel dacă valoarea ADC-ului e mai mare decît un nivel, LED-ul respectiv va fi conectat, dacă nu, atunci deconectat. Mai clar e prezintat principiul de lucru în Schema bloc.


Frecvenţa de lucru a microcontrollerului de 1Mhz e mai mult ca destul pentru această sarcină. Valoarea prescalerului ADC-ului este egală cu 8, deci ADC-ul funţionează cu frecvenţa 125kHz, ce se află în mijlocul diapazonului său de lucru 50÷200kHz.




2)  În baza schemei create, se construieşte schema electrică cu ajutorul programului PROTEUS, care la rândul ei va acţiona în baza programului.

Fig. 9 Schema electrică

3)  În baza schemei bloc create prezentăm listingul programului:
  ...

4)   Compilarea programului şi verificarea funcţionării sale (executării) pas cu pas cu scopul de a găsi şi elimina erorile.
5)   Ultimul pas este simularea circuitului creat în PROTEUS, corecţia acestuia în caz de necesitate, în urma căreia ne putem convinge că programul funţionează corect şi că microcontrollerul execută toate comenzile cu exactitate, obţinînd rezultatul dorit : adică in dependenţă de valoarea semnalului Analogic la una din intrările analogice a microcontrollerului să indice nivelul semnalului la un set de 8 leduri, nivelul minimal va aprinde 1 singur led, iar nivelul maxim va aprinde toate ledurile, dar la un nivel intermediar se va aprinde un set de leduri la nivelul aplicat.
Descrierea comenzilor utilizate:
LDI R1, K - încarcă în registrul R1 o constantă
IN R1, PINx – citeşte în registrul R1 datele de intrare de la PINx
OUT PORTx, R1 – încarcă în registrul de ieşire a potului x datele din registrul R1
BRLO(Branch if Lower) – sare dacă este mai mic, operandul k If Rd<-PC+k+1. Nu activeaza nici un flag.