Ce este PWM?
PWM(Pulse Width Modulation) este o tehnica de a emula un voltaj mai mic(semnal analog),prin scaderea duratei si distantei intre semnale HIGH(aprinderi) succesive.Ochiul uman este pacalit sa creada ca LED-ul(sau altceva) isi schimba luminozitatea. Cu cât distanţa de timp între aprinderi este mai mică cu atât va da impresia ochiului că ledul este “mai puternic aprins”. Şi cu cât distanţa între aprinderi este mai mare cu atât vom da ochiului impresia că ledul “îşi pierde din putere”. Arduino poate emite semnal HIGH intr-un timp numit grosimea pulsului(Pulse Width) si semnal LOW intre pulsurile succesive.Un puls impreuna cu un semnalul LOW de dupa este numit ciclu de umplere(Duty Cicle):
Uitandu-ne la graficul de mai sus,observam ca intr-un ciclu de umplere este semnal HIGH in 25% din ciclu si semnal LOW in restul de 75%.Cu cat este semnal HIGH intr-un procent mai mare din ciclu,cu atat LED-ul lumineaza mai puternic.
Un ciclu de umplere de 100% este acelasi lucru cu conectarea LED-ului la o sursa de 5V(aprins incontinuu),iar un ciclu de 0% este egal cu un LED stins.
Montajul
Montajul este similar cu cel de la proiectul anterior,cu exceptia faptului ca LED-ul trebuie conectat la un alt pin digital de pe placa cu semnul ~ in fata(eu am ales pinul 6):
Programul
In programare,PWM se implementeaza cu ajutorul functiei analogWrite(sintaxa AnalogWrite(nr/nume pin,nr cuprins intre 0 si 255).Cu cat numarul este mai mare,cu atat ciclul de umplere este mai mare si luminozitatea LED-ului va creste. Cu cat numarul este mai mic,cu atat ciclul de umplere va fi mai mic iar lumina LED-ului va fi mai slaba.
Si acum o sa va intrebati:de ce valoarea ciclului de umplere poate fi cuprinsa doar intre 0 si 255?Ei bine,pe pinii digitali PWM,Arduino are o rezolutie de 8 biti.Prin urmare,poate suporta un numar de 256(2^8) de trepte de putere(0-255).
Programul este acesta:
void setup() {
// put your setup code here, to run once:
pinMode(9,OUTPUT); // initializare pin 9 pentru emisie
}
void loop() {
// put your main code here, to run repeatedly:
analogWrite(9,255); // trimite semnal cu puterea de 255(HIGH) prin pinul 9
}
Incercati sa schimbati valoarea de 255 cu orice alta cifra. Se vede o lumina mai slaba?
Luminozitate variabila cu arduino
Scrieti urmatorul program:
void setup() {
pinMode(9,OUTPUT); // initializare pin 9 pentru emisie
}
void loop() {
for(int i=0; i<255; i++) // pentru variabila i egala cu 0 pana la 255,i creste
{
delay(5); // asteapta 5 ms pentru fiecare treapta
}
for(int i=255; i>0; i--) // pentru variabila i egala cu 255 pana la 0,i scade
{
analogWrite(9,i); // trimite semnal cu puterea i prin pinul 9
delay(5); // asteapta 5 ms pentru fiecare treapta
}
}
Acest program ar trebui sa creasca treptat luminozitatea LED-ului pana la maxim,apoi sa o scada treptat pana la stingerea completa:
Sa analizam programul.Mai intai initializam pinul 9 pentru emisie in ectiunea setup. In sectiunea loop,vom folosi doua functii for(sintaxa for(variabila,conditie,actiune legata de variabila) { actiune } ):una pentru cresterea luminozitatii si una pentru scadere.Acum sa analizam prima functie for:
for(int i=0; i<255; i++)
{
analogWrite(9,i);
delay(5);
}
In paranteza cream o variabila intreaga i,pe care o initializam cu valoarea 0(int i=0) si care este cuprinsa intre 0 si 255(i<255).Aceasta variabila va creste treptat (i++).
Intre acolade,folosim functia AnalogWrite pentru a aprinde LED-ul conectat la pinul 9 cu valoarea i.Datorita delayului de 5 ms,variabila i va creste cu o treapta odata la 5 ms,iar LED-ul va "zabovi" pe o treapta de luminoziatate 5 ms.Cu cat timpul de delay este mai mare,cu atat luminozitatea LED-ului va creste mai incet.Cealalta functie for este aproape identica,cu exceptia faptului ca variabila i va scadea(i--) si va fi initializata cu valoarea maxima(255),fiind cuprinsa intre 255 si 0.
Comments