in Elettronica, Tutorial

Tutorial – Arduino spiegato facile – PWM (Pulse Width Modulation).

Continuiamo la serie su Arduino, illustrando quello che è uno degli strumenti indispensabili da conoscere e capire per realizzare progetti e non solo, ovvero il PWM.

Con segnale PWM si intende, letteralmente, modulazione di larghezza di impulso (o Pulse Width Modulation). Nella pratica si tratta di una tecnica per generare un segnale onda quadra con un duty cycle variabile.

Un generico segnale a onda quadra, con indicato il duty cycle e il periodo.

Come visibile nella figura, il segnale è un tipicamente digitale, ovvero capace di assumere al più due valori o livelli logici di tensione: alto e basso, 1 e 0. In genere, questi valori sono fissati a priori in funzione del tipo di dispositivo e di architettura che si usa e che li genera: un Arduino Uno lavora con livelli logici a 5V, dunque i valori saranno 0V e 5V, invece un ESP8266 lavora a 3,3V.

Ciò che caratterizza e rende interessante la tecnica PWM è la possibilità di variare il duty cycle, ovvero l’intervallo di tempo in cui si ha lo stato alto rispetto al periodo totale. Matematicamente:

D=\frac { { t }_{ on } }{ T }

che, per sua natura, può variare tra 0 e 1. Più comunemente, viene espresso in termini percentuali (%D).

Variare questo parametro “D” del segnale permette di ottenere una tensione variabile dipendente dal rapporto tra la durata dell’impulso positivo e di quello totale.

Introduciamo il concetto di valore efficace RMS di una funzione (Root Mean Square in inglese) utile a capire il fenomeno in esame, definito come la media quadratica sul periodo della funzione stessa:

{ V }_{ RMS }=\sqrt { \frac { 1 }{ T } \int _{ 0 }^{ T }{ { \left( { v }_{ pwm }(t) \right) }^{ 2 }\quad dt } }

In genere, si applica a segnali di tensione o corrente al fine di calcolare gli effetti sul carico. In altre parole, il valore efficace (di una tensione o di una corrente) è quel valore di segnale in continua che produce su una resistenza gli stessi effetti (dissipazione di potenza) di un segnale  non continuo.

Nel caso di onda quadra con ampiezza 5V e duty cycle D, si ha:

{ V }_{ RMS }=\sqrt { \frac { 1 }{ T } \int _{ 0 }^{ T }{ { \left( { v }_{ pwm }(t) \right) }^{ 2 }\quad dt } } =\\ =\sqrt { \frac { 1 }{ T } \left[ \int _{ 0 }^{ { t }_{ ON } }{ { \left( 5 \right) }^{ 2 }\quad dt } +\int _{ { t }_{ ON } }^{ T }{ { \left( 0 \right) }^{ 2 }\quad dt } \right] } =

Dove abbiamo diviso il segnale in parti, sfruttando il fatto che sia pari a 5V nel semiperiodo ton e nullo nel semiperiodo toff. Inoltre, il secondo integrale è evidentemente uguale a zero, dunque:

=\sqrt { \frac { 1 }{ T } \left[ \int _{ 0 }^{ { t }_{ ON } }{ { \left( 5 \right) }^{ 2 }\quad dt } \right] } =\\ =\sqrt { \frac { 1 }{ T } { \left( 5 \right) }^{ 2 }\left[ \int _{ 0 }^{ { t }_{ ON } }{ { 1 }\quad dt } \right] } =\\ =\sqrt { \frac { { t }_{ ON } }{ T } { \left( 5 \right) }^{ 2 } } =\\ =\sqrt { D{ \left( 5 \right) }^{ 2 } }

dove nell’ultimo passaggio abbiamo utilizzato la definizione di duty cycle. Possiamo quindi ricavare l’espressione generale:

{ V }_{ RMS }=\sqrt { D{ \left( { V }_{ max } \right) }^{ 2 } }

Da quest’ultima espressione è evidente che il valore efficace sarà dipendente da D, ottenendo valori compresi tra 0 e VDD, di natura prettamente analogica. Maggiore sarà il valore del duty cycle, maggiore sarà il valore efficace in uscita, e viceversa, come illustrato nel seguente grafico.

Segnale in uscita al variare del duty cycle: in evidenza, la differenza tra valor medio e valor efficace

In questo modo potrò pilotare diversi dispositivi sfruttando questa modulazione di segnale.
Ad esempio, applicazioni tipiche del PWM sono il controllo della luminosità LED, il controllo di motori, la gestione delle ventole del pc, o in applicazioni più complesse come negli alimentatori switching.

Questa tecnica si presta quindi ad usi in progetti con microcontrollori, come con il nostro Arduino.

Le nostre schede infatti permettono l’uso del PWM, presentando dei pin predisposti riconoscibili dal simbolo tilde ~ stampate su pcb. Il numero e la disposizione di questi pin varia da scheda a scheda. Ad esempio, l’Arduino Uno e Nano presentano PWM ai pin 3, 5, 6, 9, 10 e 11. Arduino Mega invece dispone di pin PWM dal 2 al 13! Il consiglio è comunque di controllare il pinout della scheda che si sta usando.

Pin PWM su scheda Arduino UNO

Per ottenere in uscita dai pin il segnale PWM desiderato, si utilizza la funzione analogWrite(pin, value)  dove pin il primo argomento indica appunto il pin utilizzato, mentre value indica il valore da 0 a 255 del nostro duty cycle, proporzionato in una scala percentuale. Quindi un valore di 255 rappresenta un duty cycle al 100%, un valore di 126 indica un duty cycle al 50% e così via.

Come discusso inizialmente, il PWM si caratterizza per la sua variazione di duty cycle che, per come è definito, dipende dal periodo del segnale. Il periodo del segnale è legato alla frequenza del dispositivo (microcontrollore) che si sta utilizzando e dunque varierà tra dispositivi differenti. Inoltre, non è detto che lo stesso microcontrollore utilizzi la stessa frequenza per ogni pin. Ad esempio, per un Arduino Uno, la frequenza del segnale PWM sui pin 5 e 6 sarà di circa 980Hz, mentre sugli altri pin sarà 490Hz. Questo è un fattore da tener conto in alcuni casi.

Presentiamo ora un semplice esempio per applicare i concetti introdotti.

Esempio

Prendiamo il classico esempio Blink. Con esso accendiamo e spegniamo un led, comandandolo tramite un segnale alto e basso. Ciò che otteniamo è un controllo del tipo totalmente acceso/totalmente spento. Ma se volessimo ottenere dei valori intermedi? Ecco che entra in gioco il PWM!

Realizziamo un semplice circuito formato da un LED e una resistenza (330 ohm) controllato da un Arduino Nano.

Schema circuitale

Di seguito, il codice commentato utilizzato per l’esempio.

#define pinLed 3  //definisco il pin (prestare attenzione a collegare l'anodo del led)
int value = 0; //valore pwm

void setup() {
Serial.begin(9600); //inizializzo la seriale
pinMode(pinLed, OUTPUT); //setto il pin pwm come uscita
}

void loop() {
//faccio crescere partendo da zero il valore del duty cycle fino al suo massimo
for (value = 0; value < 255; value ++) {
analogWrite(pinLed, value);
Serial.println(value);
}
//faccio diminuire, partendo dal suo massimo, il valore del duty cycle fino al suo minimo
for (value = 255; value > 0 ; value --) {
analogWrite(pinLed, value);
Serial.println(value);
}
}

E infine, il risultato ottenuto:

 

⇐ Tutorial – Arduino spiegato facile – Basi di programmazione e primo esempio


Per questo articolo è tutto.

Per dubbi, errori o semplicemente ringraziamenti, puoi contattarci attraverso i nostri contatti social.

Puoi seguirci sul sito: www.antima.it
su Instagram: https://www.instagram.com/antima.it/
su Facebook: https://www.facebook.com/Antima.it/

Scrivi un commento

Commento