Modulul periferic ADC. Generare semnal PWM

Scopul lucrarii:  
 - De a configurara modului periferic ADC;
- generarea semnalelor PWM;
- interactiunea intre module.

Sarcina lucrarii:  
  - generarea semnalului PWM controlat de ADC;
  - pornirea modului de conversie continua de la TIMER;
  - colectarea de la canale multiple; - generarea semnalului PWM cu limite de stanga si de dreapta pentru a obtine un semnal de iesire RC care va controla un motor Servo. Semnalul va fi periodic, 50Hz, cu factorul de umplere de la 1ms la 2ms.

Notiuni teoretice:

   PWM (Pulse Width Modulation) este o tehnica folosita pentru a varia in mod controlat tensiunea data unui dispozitiv electronic. Aceasta metoda schimba foarte rapid tensiunea oferita dispozitivului respectiv din ON in OFF si invers. Perioada de timp corespunzatoare valorii ON dintr-un ciclu ON-OFF se numeste factor de umplere (duty cycle) si reprezinta, in medie, ce tensiune va primi dispozitivul electronic. Astfel se pot controla circuitele analogice din domeniul digital. Practic, asta inseamna ca un LED actionat astfel se va putea aprinde / stinge gradual, iar in cazul unui motor acesta se va invarti mai repede sau mai incet.
    Factorul de umplere se exprima in procente si reprezinta cat la suta din perioada unui semnal acesta va fi pe ON. In Figura 8 se pot observa semnale PWM cu factori de umplere diferiti. Astfel, se poate deduce foarte usor formula pentru a obtine valoarea factorului de umplere (D):
                                             D=pulse_width/period * 100%


Astfel, tensiunea medie care ajunge la dispozitiv este dat de D * Vcc.

   Un convertor analog – digital (ADC) este un circuit electronic care convertește o tensiune analogică de la intrare într-o valoare digitală.
    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.
    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.
     Registrele necesare pentru configurarea convertorului sunt următoarele:

ADMUX 



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




   Î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:
 , unde Vin este tensiunea măsurată iar Vref este tensiunea aleasă ca referință.
Schema bloc:


Codul sursa:

#include <avr/io.h>
#include <avr/interrupt.h>
char stare = 0;

int main(void){
     DDRA = 0x00;
     DDRD = 0xFF;
     TCCR0 = (1<<CS02) | (0<<CS01) | (0<<CS00);
     TIMSK = (1<<TOIE0);
TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<WGM11) | (1<<WGM10);
     TCCR1B = (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
     ADMUX = 0;
     ADCSRA = (1<<ADEN) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
     ADCSRA |= 1<<ADSC;
         sei();
         while(1) {    }
}
ISR(ADC_vect) {
     if(stare == 0){
         OCR1A = ADC;
         ADMUX = 1;
         stare = 1;
         } else {
         OCR1B = ADC;
         ADMUX = 0;
         stare = 0;    }}

ISR(TIMER0_OVF_vect) {
     ADCSRA |= 1<<ADSC;}



Codul sursa:


#include<avr/io.h>
#include<avr/interrupt.h>

int main()
{
DDRD=0xff;
DDRA=0x00;

ICR1 = 1250;  //cu ajutorul lui se face fregventa de 1250 hz

TCCR1A=(1<<COM1A1)|(0<<COM1A0)|(0<<WGM11)|(0<<WGM10);
TCCR1B=(1<<WGM13)|(0<<WGM12)|(0<<CS12)|(1<<CS11)|(0<<CS10);
//configurare PWM
OCR1A = 100;  // pentru sa fie frecventa 50 hz

while(1);
return 0;
}
Concluzie:
In urma efectuarii acestei lucrari de laborator am obesrvat ca modulul periferic timer ne permite sa transformam orice semnal analogic in digital in plus putem sa facem o astfel de transformare a mai multor semnale in paralel, ca rezultat obtinem un semnal PWM cu o tensiune medie egala cu tensiunea semnalului de la intrare, aceasta tensiune medie fiind dirijata de factorul de umplere.