This is an old revision of the document!


Laborator 4: Analog Digital Convertor (ADC)

Acest laborator are ca scop familiarizarea voastră cu lucrul cu convertorul analog-digital prezent în microcontroller-ul Atmega328p.

1. Măsurarea semnalelor analogice

Pentru a putea măsura semnalele analogice într-un sistem de calcul digital, acestea trebuie 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ă.

 Semnal Analogic

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 stocate intern sub formă binară, rezoluția unui convertor analog-digital este exprimată în biți.

| Rezolutie ADC

De exemplu, dacă rezoluția unui convertor este de 10 biți atunci el poate furniza 2^10 = 1024 valori diferite la ieșire. Dacă gama de măsurare este de la 0 la 5V, rezoluția de măsurare va fi: (5V-0V)/1024 = 0.0048V adică 4.8mV.

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ă. Mai jos observam cum arată modul în care semnalul eșantionat 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.

| Esantionare

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 pentru 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).

click pentru mai multe informatii

click pentru mai multe informatii

Resolution

The resolution represents the number of discrete values that can be produced over the range of analog values in a measurement period. The discrete values are usually in binary form, so a common way to represent resolution is in audio bit depth (the number of bits of information in each sample). For example, for a resolution of 8 bits, we can encode the analog input signal in 256 different levels, the values ranging from 0 to 255. Resolution can also be expressed in volts, each level representing a fraction of the voltage measurement range. For example, for a range of 0- 5V and an 8-bit resolution, the subdivision would be (5V – 0V) / (2 ^ 8).

Sampling Rate

The sampling rate represents the time at which the values of the analog input signal are read. The time is divided into discrete intervals, each sampling a value from the input signal. The Nyquist frequency tells us that it is mandatory for the sampling rate to be at least twice the frequency of the analog input signal so that the signal can be reconstructed afterwards. There appears a problem where frequencies above half the Nyquist frequency are sampled because they are incorrectly detected as lower frequencies. This process is called aliasing.

ADC Types

Direct Conversion (Flash ADC)

Has a bank of comparators sampling the input signal in parallel, each firing for their decoded voltage range. The comparator bank feeds a logic circuit that generates a code for each voltage range.

Successive Approximation

Uses a comparator to successively narrow a range that contains the input voltage. At each successive step, the converter compares the input voltage to the output of an internal digital to analog converter which might represent the midpoint of a selected voltage range. At each step in this process, the approximation is stored in a successive approximation register (SAR). Successive approximation ADC`s are cheaper than direct conversion ADC`s, and have a smaller footprint on the IC, but they are also slower.

Sigma-Delta

Is a newer design that offers low conversion noise and good resolution. Sigma-delta convertors are appropriate for application that require high resolution, but not the fastest conversion. As stated above, an ADC conversion is not instant, it requires a certain amount of time to complete. This raises a issue: what will happen with the result of the conversion if the input signal will change during this conversion time. The conversion result might not correspond then to the real value of the signal. To solve this, an internal input buffer is used. When the input signal is sampled, switch S1 is closed, S2 open, so that the Csh capacitor will hold a voltage equal to the input signal. S1 will then open, S2 will close and the conversion will begin. The two switches will hold this state until the conversion will end. Capacitor Csh will hold the (analog) value of the signal while the during the A/D conversion.

2. Convertorul ADC al Atmega 328p

Convertorul analog-digital inclus în microcontroller-ul Atmega328p 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 (6 disponibile pe arduino).

Acest convertor poate fi controlat prin doua registre de stare și control (ADCSRA si ADCSRB) și un registru cu biți de selecție pentru multiplexoare (ADMUX). În primele, putem stabili 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 (ADC).

Relația dintre valoarea din registrul ADC și tensiunea măsurată este următoarea:

ADC = V_in * 1024 / V_ref

sau

V_in = ADC * V_ref / 1024

unde V_in este tensiunea măsurată iar V_ref este tensiunea aleasă ca referință.

Tensiune de referinta

In functie de intervalul in care varieaza semnalul pe care il citim putem selecta alta tensiune de referinta. Acest lucru este util pentru a mari rezolutia citirii. ADC-ul de pe Atmega 328p ne ofera ca tensiune de referinta tensiunea de alimentare (AVCC), o tensiune interna de 1.1V sau un pin pe care putem conecta o referinta de tensiune externa (AREF)

Prescaler

ADC-ul nostru are nevoie de un semnal de ceas pentru a stii cat timp dureaza o conversie. Pentru ca semnalul de ceas al microcontrollerului este prea rapid avem nevoie de un prescaler. Cea mai mica valoare este 2 si cea mai mare este 128.

F_ADC = F_CPU / PRESCALER

Alegerea prescaler-ului depinde de frecventa de esentionare si de acuratetea dorita. Cu cat prescaler-ul este mai mare frecventa ADC va fi mai mica si acuratetea va fi mai mare. Mai multe informatii se pot gasi in capitolul 23.4 din datasheet.

Moduri de functionare

Convertorul poate functiona in mai multe moduri. Cel mai comun mod si cel care este desponibil si in biblioteca arduino este Single Conversion Mode. In acest mod se va efectua o singura conversie si se incepe setand ADSC pe 1. Registrul va fi setat pe 0 automat la finalul conversiei.

Un alt mod de functionare este Free Running Mode in care convertorul va functiona in continuu, la finalul unei conversii se va incepe automat urmatoarea conversie. De fiecare data rezultatul precedent va fi suprascris. Pentru a incepe o conversie se va seta registrul ADSC pe 1 si acesta nu va fi pus pe 0 automat.

  • External Interrupt Request. In acest mod o conversie va incepe pe un front pozitiv al unui pin de intrare.
  • Analog Compare mode. In acest mod ADC-ul poate compara doua semnale analogice. Nu vom folosi aceasta functionalitate in cadrul laboratorului. Mai multe detalii in capitolul 23 din datasheet.
  • Timer mode. Pentru un control mai precis al momentului in care se intampla conversia, se poate folosi un eveniment de timer pentru a incepe o noua conversie.

 ADC with Timer

Registre

ADMUX - ADC Multiplexer Selection Register

 ADCMUX

  • Bit 7:6 - REFS1:0: Reference Selection Bits → Selecteaza tensiunea de referinta
  • Bit 5 - ADLAR ADC: Left Adjust Result → Modul de aliniere a celor 10 biti. (left-aligned sau right-aligned)
  • Bits 3:0 - MUX3:0: Analog Channel Selection Bits → Selecteaza portul de intrare de pe care se face conversia

ADCSRA – ADC Control and Status Register A

| ADCSRA

  • Bit 7 – ADEN: ADC Enable → Porneste convertorul
  • Bit 6 – ADSC: ADC Start Conversion → Folosit pentru a incepe o conversie
  • Bit 5 – ADATE: ADC Auto Trigger Enable → Porneste modul in care se conversiile ADC incep automat in functie de o sursa specificata in ADCSRB
  • Bit 4 – ADIF: ADC Interrupt Flag → Setat pe 1 atunci cand o conversie s-a terminat. Acest flag este sters automat atunci cand se apeleaza o rutina de tratate a intreruperilor.
  • Bit 3 – ADIE: ADC Interrupt Enable → Porneste intreruperile pentru ADC
  • Bits 2:0 – ADPS2:0: ADC Prescaler Select Bits → Setare prescaler

ADCSRB – ADC Control and Status Register B

 ADCSRB

  • Bit 2:0 – ADTS2:0: ADC Auto Trigger Source → Sursa de la care sa se genereze o noua conversie. Depinde de ADATE din ADCSRA

Exemplu

Setup:

ADMUX = 0;
/* ADC1 - channel 1 */
ADMUX |= (1 << MUX0);
/* AVCC with external capacitor at AREF pin */
ADMUX |= (1 << REFS0);

ADCSRA = 0;
/* set prescaler at 128 */
ADCSRA |= (7 << ADPS0);
/* enable ADC */
ADCSRA |= (1 << ADEN);

Read:

/* start conversion */
ADCSRA |= (1 << ADSC);
/* wait until conversion is complete */
while (!(ADCSRA & (1 << ADIF)));
uint32_t result = ADC;

3. ADC in Arduino

Biblioteca arduino ne pune la dispozitie o functie simpla pentru a folosi ADC-ul si anume analogRead().

void loop() {
  val = analogRead(A0);  // read the input pin
  Serial.println(val);   // debug value
  delay(100);
}

Aceasta functie primeste ca parametru un pin si va bloca pana citirea valorii de pe acel pin se termina. Pentru aplicatii simple acest lucru este suficient, dar pentru aplicatii mai complexe in care ne dorim sa continuam procesarea in timp ce facem conversia va trebui sa folosim cod specific pentru microcontrollerul nostru.

Tensiunea de referinta folosita se poate seta cu functia analogReference()

4. Exercitii

Task 0 Folositi cod Arduino pentru a citi valoarea unui potentiometru si a unui senzor de temperatura si apoi trimiteti valorile pe seriala.

  1. Valoarea potentiometrului ar trebui transmisa catre consola ca un procent. Va trebui sa convertiti numarul citit de ADC la un procent intre 0% si 100%.
  2. Valoarea citita pentru senzorul de temperatura trebuie sa fie exprimata in grade Celsius. Tensiunea de iesire a senzorului variaza liniar cu temperatura. Puteti sa faceti conversia experimental sau folosindu-va de datasheet (Datasheet TMP36).

 PB1

Task 1 Folosind cod specific AVR, cititi valoarea potentiometrului doar atunci cand se apasa un buton.

 PB2

Task 2 Folosind cod specific AVR, cititi valoarea potentiometrului o data la 10ms. Pentru acest exercitiu trebuie sa folositi ADC-ul sa porneasca o conversie automat in functie de un timer.

5. Resurse

pinout Arduino UNO

Rezolvare
Arhiva cu soluțiile o puteți descărca de aici: lab4-solved.zip

6. Linkuri Utile

pm/lab/lab4-2022.1651404525.txt.gz · Last modified: 2022/05/01 14:28 by florin.stancu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0