0% au considerat acest document util (0 voturi)
4 vizualizări11 pagini

L4. PWM

Documentul prezintă generarea semnalului modulat în impuls (PWM) utilizând microcontrolerul ATmega328, explicând conceptul de PWM și aplicațiile sale, cum ar fi controlul intensității LED-urilor și generarea sunetului. Se detaliază funcția analogWrite() din limbajul Arduino pentru a crea semnale PWM și se discută despre timerele microcontrolerului care permit generarea acestor semnale. De asemenea, sunt incluse exemple de cod pentru implementarea PWM în diverse aplicații, precum modificarea intensității unui LED și generarea de sunete cu un traductor piezo.
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
4 vizualizări11 pagini

L4. PWM

Documentul prezintă generarea semnalului modulat în impuls (PWM) utilizând microcontrolerul ATmega328, explicând conceptul de PWM și aplicațiile sale, cum ar fi controlul intensității LED-urilor și generarea sunetului. Se detaliază funcția analogWrite() din limbajul Arduino pentru a crea semnale PWM și se discută despre timerele microcontrolerului care permit generarea acestor semnale. De asemenea, sunt incluse exemple de cod pentru implementarea PWM în diverse aplicații, precum modificarea intensității unui LED și generarea de sunete cu un traductor piezo.
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PDF, TXT sau citiți online pe Scribd

Sisteme cu microprocesoare

Laborator 4
4. Semnalul modulat în impuls

Scopul acestei lecții este familiarizarea studenților cu modul de generare a unui semnal
modulat în impuls (semnal PWM) cu ajutorul microcontrolerului ATmega328.

4.1. Generalități privind semnalul modulat în impuls

Semnalul modulat în impuls, sau semnalul PWM – Pulse Width Modulation, este o
tehnică pentru obținerea rezultatelor analogice cu mijloace digitale. Controlul digital este
utilizat pentru a crea o undă dreptunghiulară, un semnal de 0 (gol - OFF) și de 1 (plin - ON).
Acest model de tip ON-OFF poate simula tensiuni între complet plin (5 volți) și complet gol (0
volți) prin schimbarea porțiunii de timp pe care semnalul este pe 1, față de timpul petrecut de
semnal pe 0. Factorul de umplere al semnalului este definit ca durata de semnal 1 dintr-o
perioadă a semnalului. Durata de ON (semnal 1) este denumită lățimea impulsului. Pentru a
obține valori analogice diferite, se schimbă sau se modulează lățimea impulsului. Dacă se
repetă acest model de pornire suficient de rapid cu un LED, de exemplu (cu o frecvență
suficient de mare astfel încât ochiul să nu mai perceapă semnalul ON și OFF), rezultatul este
asemănător unui semnal ce reprezintă o tensiune constantă între 0 și 5V, controlând
luminozitatea LED- ului.

În Figura 1 sunt afișate exemple de semnale PWM împreună cu semnalul simulat: semnal
cu factor de umplere 50% și tensiune simulată de 2.5V (a), semnal cu factor de umplere 20% și
tensiune simulată de 1V (b) și semnal cu factor de umplere 75% și tensiune simulată de 3.75V
(c).

Fig.1. Exemple de semnale PWM


_ _
= × 100 = × 100
_ + _
= ×

4.2. Generarea semnalului PWM în limbaj Arduino

În limbaj Arduino, pentru generarea unui semnal de tip PWM se folosește


funcția analogWrite(pin, value), unde:
 pin: reprezintă numărul pinului pe care se generează semnalul PWM.
Pentru Arduino UNO, pentru generarea unui semnal PWM sunt disponibili pinii: 3, 5,
6, 9, 10, 11. Pinii 5 și 6 generează un semnal cu frecvența de 980 Hz, în timp ce ceilalți
generează un semnal cu frecvența de 490 Hz. Pinii 5 și 6 împart timerul folosit în generarea
semnalului cu funcțiile millis() și delay(), iar la valori scăzute ale factorului de umplere pot
rezulta semnale unde valoarea de 0 să nu fie precisă.
 value: setează factorul de umplere al semnalului.
Este o valoare întreagă, pe 8 biți, și are o variație între 0 (semnalul tot timpul pe 0) și 255
(semnalul tot timpul pe 1).
În Figura 2 sunt reprezentate câteva semnale ce pot fi generate cu ajutorul plăcii de
dezvoltare Arduino. Factorul de umplere (Duty Cycle) este setat conform parametrului value.
Liniile verzi reprezintă o perioadă regulată de timp. Această durată sau perioadă este inversă
frecvenței semnalului PWM. Astfel, la o frecvență a semnalului PWM generat de Arduino de
aproximativ 500 Hz, distanța dintre liniile verzi ar măsura 2 milisecunde fiecare. Apelarea
funcției analogWrite() este pe o scară de la 0 la 255, astfel încât analogWrite (255) generează
un factor de umplere de 100% (mereu ON), analogWrite (127) un factor de umplere de 50%
(jumătate din timp ON) s.a. Pentru a seta un factor de umplere cu parametrul value se poate
folosi formula: = 256 × _ − 1.
Fig.2. Factor de umplere generat cu placa de dezvoltare Arduino

Semnalul PWM poate fi folosit la modificarea intensității unui LED, la generarea


tonului unui sunet cu ajutorul unui buzzer sau la controlul vitezei de rotații a unui motor. Un
exemplu de program în mediul Arduino pentru generarea unui semnal PWM este următorul,
unde pinul pe care se generează semnalul este pinul 9 iar valoarea care comandă factorul de
umplere este 127:

void setup() {
pinMode(9, OUTPUT); // setare direcție pin
analogWrite(9, 127); //generare semnal PWM
}
void loop() {
}

Exemplul 1. Modificarea intensității unui LED


Intensitatea unei anumite culori poate fi controlată cu ajutorul unui semnal PWM,
rezultând astfel numeroase aplicații unde se poate folosi această resursă. Un exemplu
demonstrativ este modificarea intensității luminii unui LED în timp (aplicație cunoscută și sub
denumirea de „fading”). Astfel, la un anumit interval, se modifică crescător, iar apoi
descrescător, factorul de umplere al semnalului, cu un anumit pas. În exemplul de mai jos se
modifică factorul de umplere cu un timp corespunzător valorii 5, la un interval de 50 ms.
void setup() {

pinMode(9, OUTPUT);

void loop() {

for (int i = 0 ; i <= 255; i += 5) { // creștere intensitate LED cu un pas de 5 puncte


analogWrite(9, i); // generare semnal PWM
delay(50); // așteptare 50ms pentru a vedea efectul de creștere a
} intensității

for (int i = 255 ; i >= 0; i -= 5) { // scădere intensitate LED cu un pas de 5 puncte


analogWrite(9, i); // generare semnal PWM
delay(50); // așteptare 50ms pentru a vedea efectul de reducere a
intensității
}
}

LED-urile RGB (Red, Green, Blue) sunt alcătuite din trei LED-uri colorate diferit,
într-o singură capsulă. Acestea se vor găsi în două configurații:
Catod comun – cele trei LED-uri au terminalele pozitive separate și un singur catod;
Anod comun – cele trei LED-uri au același anod, dar fiecare catod este distinct.

Fig.4. Modele LED-uri RGB

Problema rezistenței de limitare a curentului rămâne. LED-ul poate funcționa și cu un


singur rezistor înseriat anodului, respectiv catodului comun, dar, în acest caz, intensitatea
LED-urilor se va modifica și în funcție de numărul de LED-uri aprinse (R,G,B). Pentru o
funcționare corectă, vom înseria trei rezistențe cu terminalele distincte, folosind rezistori cu
valoarea de 100 Ω.
Fig.5. Schema de control a intensității unui LED RGB cu catod comun cu semnale PWM

Exercițiul 1. Folosind un LED RGB, modificați culoarea observată prin generarea a trei
semnale PWM diferite pentru fiecare culoare primară.
([Link]

Exemplul 2. Generarea de sunete


Traductorul de tip piezo este un dispozitiv electronic care generează tensiune când este
deformat fizic de o vibrație, un sunet sau o tensiune mecanică (spre exemplu, este capabil să
detecteze vibrații de genul unei bătăi la ușă). Similar, când i se aplică o tensiune, vibrează și
creează sunet. Astfel, componentele de tip piezo pot fi folosite pentru a detecta sau a genera
sunete. De exemplu, acest dispozitiv poate fi utilizat ca un traductor audio foarte mic, cum ar fi
un buzzer. Acestea sunt polarizate, astfel încât tensiunea trece prin ele într-o anumită direcție.
În realizarea circuitului trebuie luată în considerare polarizarea componentei (semnalul
PWM la „+” si GND la „-”) și introducerea unei rezistențe de ordinul sutelor de Ohmi (de
exemplu 150 Ω) pentru limitarea curentului. În Figura 6 este introdus un traductor piezo în
circuitul cu LED, astfel încât semnalul PWM de la pinul 9 controlează atât tonul sunetului cât și
intensitatea luminoasă. Codul poate fi folosit de la exemplul cu LED-ul.
Fig.6. Controlul intensității sunetului de la un traductor piezo cu un semnal PWM

4.3. Regiștrii microcontrolerului ATmega328 de generare a unui semnal PWM

Timerele sunt circuite specializate care permit execuția exactă a programului


(gestionarea evenimentelor), generarea undelor și măsurarea timpilor semnalului. ATmega328
are 3 timere: Timer0 (TC0) pe 8 biți, Timer1 (TC1) pe 16 biți si Timer2 (TC2) pe 8 biți.
Semnalele PWM sunt generate cu ajutorul timerelor. Fiecare timer poate genera 2 semnale
PWM, rezultând în total 6 semnale PWM cu frecvențe diferite, asignate pinilor din Tabelul I.
Tabelul I. Timerele microcontrolerului ATmega328
Timer Ieșire Arduino Pin Microcontroler Biți
Timer 0 OC0A 6 PD6 8
Timer 0 OC0B 5 PD5 8
Timer 1 OC1A 9 PB1 16
Timer 1 OC1B 10 PB2 16
Timer 2 OC2A 11 PB3 8
Timer 2 OC2B 3 PD3 8

Fiecare semnal PWM poate fi generat în trei moduri diferite: Fast PWM, Phase
Corrected PWM, and Phase and Frequency Phase Corrected PWM.
În continuare se va folosi modul Fast PWM. Fast PWM oferă opțiuni de semnale
PWM cu frecvențe ridicate și diferă de celelalte moduri prin funcționarea operațiilor pe o
singură pantă (se pot obține frecvențe de două ori mai mari). Acest tip de PWM este potrivit
de exemplu pentru ajustarea intensității LED-urilor. Celelalte două tipuri de PWM sunt
recomandate pentru controlul motoarelor.
Contorul numără de la bază (BOTTOM) la vârf (TOP), apoi se retratează la bază. TOP
este definit ca 0xFF sau ca valoarea lui OCRnx, în funcție de setări. În varianta de ieșiri non-
inversoare, registrul de comparare de ieșire (OCnx) este resetat când există potrivire de
comparare între TCNn și OCRnx, și setat la BOTTOM (Figura 7).

Fig.7. Generarea semnalelor PWM în modul Fast PWM non-inversor

Frecventa semnalului PWM poate fi calculată astfel:

=
× 256

unde N reprezintă factorul de divizare (prescaler).

4.3.1. Semnal PWM generat de Timerul 2

Timerul/Numărătorul 2 are 2 ieșiri sincronizate: OC2A și OC2B. Acesta poate primi


toate valorile de prescalare, rezultând o gamă mai mare de frecvențe ale semnalelor ce pot fi
generate față de semnalele generate de Timerul 0. Sursa ceasului clkT2 este implicit
egală/sincronizată cu cea a microcontrolerului, clkI/O. Regiștrii folosiți în generarea unui
semnal de tip Fast PWM sunt:

TC2 Registrul de control A – TCCR2A

Biții 7:6 – COM2An: Compare Output Mode for Channel A [n = 1:0]


Acești biți controlează comportamentul pinului de ieșire de comparare OC2A. Pentru
modul Fast PWM (setare WGM22) modul de comparare devine:
COM2A COM2A DESCRIERE
1 0
0 0 Operare normală a portului. OC2A deconectat – Comparatoarele sunt
oprite
0 1 WGM22 = 0: Operare normală a portului. OC2A deconectat
WGM22 = 1: Comutare OC2A la atingerea pragului de comparare
1 0 Mod non-inversor (HIGH la bază, LOW la pragul de comparare)
TCNT2<=OCR2A: 1 logic la ieșire, TCNT2>OCR2A: 0 logic la ieșire;
1 1 Mod inversor (LOW la baza, HIGH la pragul de comparare)
TCNT2<=OCR2A: 0 logic la ieşire, TCNT2>OCR2A: 1 logic la ieșire;

Biții 5:4 – COM2Bn: Compare Output Mode for Channel B [n = 1:0]


Acești biți controlează comportamentul celui de-al doilea pin de ieșire de comparare
OC2B. Pentru modul Fast PWM (setare biți WGM2[1:0]) modul de comparare devine:

COM2B COM2B
DESCRIERE
1 0
0 0 Operare normală a portului. OC2B deconectat – Comparatoarele sunt
oprite
0 1 Rezervat
1 0 Mod non-inversor (HIGH la bază, LOW la pragul de comparare)
TCNT2<=OCR2B: 1 logic la ieșire, TCNT2>OCR2B: 0 logic la ieșire;
1 1 Mod inversor (LOW la bază, HIGH la pragul de comparare)
TCNT2<=OCR2B: 0 logic la ieşire,TCNT2>OCR2B: 1 logic la ieșire;

Biții 1:0 – WGM2n: Waveform Generation Mode [n = 1:0]


Împreună cu bitul WGM22 din registrul TCCR2B, acești biți controlează secvența de
numărare a numărătorului, sursa pentru valoarea maximă (TOP) a numărătorului și ce tip de
formă de undă va fi folosită.

MODE WGM2 WGM2 WGM2 TOP DESCRIERE


2 1 0
0 0 0 0 0xFF Normal
1 0 0 1 0xFF PWM Phase Corrected
2 0 1 0 OCRA CTC
3 0 1 1 0xFF Fast PWM
4 1 0 0 - Reserved
5 1 0 1 OCR0A PWM Phase Corrected
6 1 1 0 - Reserved
7 1 1 1 OCR0A Fast PWM
TC2 Registrul de control B - TCCR2B

Bit 7 – FOC2A: Force Output Compare A


Este activ când biții WGM specifică un mod non-PWM.

Bit 6 – FOC2B: Force Output Compare B


Este activ când biții WGM specifică un mod non-PWM.
Bit 3 – WGM22: Waveform Generation Mode
Este folosit împreună cu WGM20 si WGM21.
Biții 2:0 – CS2[2:0]: Clock Select 2 [n = 0..2]
Selectează sursa ceasului pentru Timer/Numărător.
CS22 CS21 CS20 DESCRIERE
0 0 0 Timer/Numărător 2 Dezactivat
0 0 1 Fără Prescalare
0 1 0 Frecvență Ceas / 8
0 1 1 Frecvență Ceas / 32
1 0 0 Frecvență Ceas / 64
1 0 1 Frecvență Ceas / 128
1 1 0 Frecvență Ceas / 256
1 1 1 Frecvență Ceas / 1024

Registrul Timer/Numărător - TCNT2


Registrul care contorizează ciclurile de ceas.

Registrul de ieșire de comparare A - OCR2A


Stochează valoarea de comparare pentru ieșirea A. Conține o valoare pe 8 biți care e
comparată continuu cu valoarea numărătorului (TCNT2). O potrivire poate fi folosită pentru
generarea unei întreruperi sau pentru a genera o formă de undă pe pinul de ieșire OC2A.
Registrul de ieșire de comparare B - OCR2B
Stochează valoarea de comparare pentru ieșirea B. Conține o valoare pe 8 biți care e
comparată continuu cu valoarea numărătorului (TCNT2). O potrivire poate fi folosită pentru
generarea unei întreruperi sau pentru a genera o formă de undă pe pinul de ieșire OC2B.

Registrul masca de întrerupere al TC2 - TIMSK2


Este folosit pentru setarea unei întreruperi dată de TC2.

Registrul fanion de întrerupere al TC2 - TIFR2


Este folosit pentru setarea unei întreruperi dată de TC2.

4.3.2. Semnal PWM generat de Timerul 0 și Timerul 1

Timerul/Numărătorul 0 are 2 ieșiri sincronizate: OC0A și OC0B. Față de Timerul 2,


acesta nu are toate valorile de prescalare, astfel încât are o gamă mai redusă de frecvențe de
semnale pe care le poate genera (nu are factorii de divizare 32 și 128). Tabelul pentru setarea
factorului de divizare devine:

CS02 CS01 CS00 DESCRIERE


0 0 0 Timer/Numărător 2 Dezactivat
0 0 1 Fără Prescalare
0 1 0 Frecvență Ceas / 8
0 1 1 Frecvență Ceas / 64
1 0 0 Frecvență Ceas / 256
1 0 1 Frecvență Ceas / 1024
1 1 0 Sursa de ceas externă pe pinul T0. Ceas pe front descrescător.
1 1 1 Sursa de ceas externă pe pinul T0. Ceas pe front crescător.

Restul registrilor sunt similari celor caracteristici Timerului 2, dar cu denumire specifică:
TCCR0A, TCCR0B, TCNT0, OCR0A, OCR0B, TIMSK0, TIFR0
Timerul/Numărătorul 1 are 2 ieșiri sincronizate: OC1A și OC1B. Timerul are rezoluție
de 16 biți.

Exemplul 3. Generarea cu ajutorul Timerului 2 a două semnale PWM, unul cu factor de


umplere 50% (PB3 – OCR2A) și celălalt cu factor de umplere 20% (PD3 – OCR2B).

void setup() {

DDRB |= 0b00001000; // setare PB3 ca pin de ieșiri (pin 11 Arduino)


DDRD |= 0b00001000; // setare PD3 ca pin de ieșiri (pin 3 Arduino)
OCR2A = 127; // setare factor de umplere PWM la 50%
OCR2B = 51; // setare factor de umplere PWM la 20%
TCCR2A |= (1 << COM2A1) | (1 << COM2B1); // setare mod non-inversor pentru A și B
TCCR2A |= (1 << WGM21) | (1 << WGM20); // setare mod Fast PWM
//TCCR2A |= 0b10100011; // 0xA3; echivalent setare mod non-inversor pentru A și B si mod
Fast PWM
TCCR2B |= (1 << CS21); // setare factor de divizare 8
//TCCR2B |=0b00000010; // 0x02; echivalent setare factor de divizare 8
}

void loop() {
}

Exercitiul 2. Reluați exercițiul 1, folosind semnale PWM de la Timerul0 și Timerul2.

S-ar putea să vă placă și