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