Măsurarea semnalelor analogice

Lumea înconjuratoare este alcătuită în esență din semnale analogice: lumina, sunetul, căldura. Pentru a putea fi măsurate într-un sistem de calcul digital, aceste semnale trebuiesc convertite în valori numerice discrete. Un convertor analog – digital (ADC) este un circuit electronic care convertește o tensiune analogică de la intrare într-o valoare digitală. Aceasta poate fi reprezentată în mai multe feluri în funcție de codificarea datelor: în binar, cod Gray sau cod complement al lui doi.

O caracteristică importantă a unui ADC o constituie rezoluția acestuia. Rezoluția indică numărul de valori discrete pe care convertorul poate să le furnizeze la ieșirea sa în intervalul de măsură. Deoarece rezultatele conversiei sunt de obicei stocate intern sub formă binară, rezoluția unui convertor analog-digital este exprimată în biți.



De exemplu, dacă rezoluția unui convertor este de 10 biți atunci el poate furniza Graph valori diferite la ieșire. Dacă gama de măsurare este de 0-5V, rezoluția de măsurare va fi: Graph O altă caracteristică importantă a unui convertor analog-digital o constituie rata de eșantionare. Aceasta depinde de timpul dintre două conversii succesive și afectează modul în care forma de undă originală va fi redată după procesarea digitală. Figura 12 arată modul în care semnalul eșantionat în Figura 11 va fi reconstituit în urma trecerii printr-un convertor digital – analog (DAC). După cum se poate observa, semnalul reprodus nu este identic cu cel original.Dacă rata de eșantionare ar crește semnalul reprodus aproximează din ce în ce mai bine originalul.

Care este însa rata minimă de eșantionare pentru a reproduce fără pierderi un semnal de o frecvența data? Teorema lui Nyquist spune că o rată de eșantionare de minim două ori mai mare decât frecvența semnalului măsurat este necesară pentru acest lucru, teorema aplicându-se și pentru un semnal compus dintr-un intreg spectru de frecvențe, cum ar fi vocea umană sau o melodie. Limitele maxime ale auzului uman sunt 20Hz – 20kHz dar frecvențele obișnuite pentru voce sunt în gama 20-4000Hz, de aceea centralele telefonice folosesc o rată de eșantionare a semnalului de 8000Hz. Rezultatul este o reproducere inteligibilă a vocii umane, suficientă pentru transmiterea de informații într-o convorbire obișnuită. Pentru reproducerea fidelă a spectrului audibil se recurge la rate mai mari de eșantionare. De exemplu, înregistrarea pe un CD are o rată de eșantionare de 44100Hz ceea ce este mai mult decât suficient pntru reproducerea fidelă a tuturor frecvențelor audibile.
In funcție de modul în care se execută conversia, convertoarele analog-digitale pot fi de mai multe tipuri :
  • ADC paralel (Flash)
  • ADC cu aproximare succesivă
  • ADC cu integrare (single-slope, dual-slope);
  • ADC Sigma-delta (delta-sigma, 1-bit ADC sau ADC cu oversampling).

Convertorul ADC al Atmega324

Convertorul analog-digital inclus în microcontrollerul Atmega324 este un ADC cu aproximări succesive. Are o rezoluție de pana la 10 biți și poate măsura orice tensiune din gama 0-5V de pe opt intrări analogice multiplexate. Dacă semnalul de la intrare este prea mic în amplitudine, convertorul are facilitatea de preamplificare a acestuia in două setări, de 10x sau de 200x.
Acest convertor poate fi controlat printr-un registru de stare si control si un registru cu biți de selecție pentru multiplexoare. În primul dintre ele, putem stabili de exemplu când să se efectueze conversia, dacă să se genereze întrerupere la finalul unei conversii etc. Folosind registrul pentru multiplexoare se alege ce canal va genera input pentru convertor si tensiunea de referință. De asemenea, în afară de aceste două registre mai avem registrul ADC în care este scris rezultatul conversiei.
Schema completă a convertorului ADC este dată în figura 13. În ea se pot observa atat convertorul cu aproximari succesive (componentele DAC, Sample/Hold Comporator, conversion logic) cât și intrările și registrele.

Registrele necesare pentru configurarea convertorului sunt următoarele:

ADMUX - ADC Multiplexer Selection Register

  • REFS1 și REFS0 selectează referința de tensiune, adică valoarea maximă care poate fi convertită. Utilizatorul poate alege dintre două referințe interne, de 2.5V și 5V sau o referință externă (orice valoare între 0V si 5V) care trebuie furnizată pe pinul AVcc.
  • ADLAR selectează ordinea biților rezultatului conversiei (LSB-first sau MSB-first).
  • MUX4..0 selectează intrarea de pe care se face conversia. Se poate alege și un mod de functionare diferențial, caz în care se va măsura diferența de tensiune între cei doi pini aleși.

ADCSRA - ADC Control and Status Register A

  • ADEN este bitul de Enable și activează convertorul.
  • ADSC: scrierea acestui bit pe 1 va genera automat o conversie de pe intrarea selectată.
  • ADATE este bitul de Enable pentru trigger-mode în care o conversie este generată pe frontul pozitiv al unui semnal furnizat extern de către utilizator.
  • ADIF este bitul de întrerupere și va fi setat automat la terminarea unei conversii.
  • ADIE este bitul de Enable pentru întrerupere. Aceasta va fi generată automat la fiecare conversie dacă bitul respectiv este 1.
  • ADPS2..0 selectează rata de eșantionare pentru convertor. Aceasta poate fi de maxim fclk/2.

ADC - ADC Data Register

În funcție de valoarea bitului ADLAR, rezultatul conversiei va fi pus în registrul ADC aliniat la stânga sau dreapta.
Relația dintre valoarea din registrul ADC și tensiunea măsurată este următoarea:
Graph , unde Vin este tensiunea măsurată iar Vref este tensiunea aleasă ca referință.

Exemple de utilizare

  • Initializare ADC: canal 1 (PA0):
ADMUX = 0
ADMUX |= _BV(REFS0); //AVCC with external capacitor at AREF pin
ADMUX |= _BV(MUX0); //ADC1 - channel 1
ADCSRA = 0;
ADCSRA |= _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0); //set clock prescaler at 128
ADCSRA |= _BV(ADEN); //enable ADC
ADCSRA |= _BV(ADSC); //start first conversion
  • Citire ADC prin polling:
ADCSRA |= _BV(ADSC); //start first conversion
loop_until_bit_is_set(ADCSRA,ADIF);  //wait until conversion is done: until ADIF from ADCSRA is set to 1
unsigned int value = ADC;

Referinte externe:
http://cs.curs.pub.ro/wiki/pm/lab/lab3