GUIDA 10: Arduino, il PWM

In questo articolo su Arduino vediamo cosa è il PWM e qualche esempio di applicazioni.

PWM significa in inglese “Pulse Width Modulation”, tradotto in italiano “modulazione di larghezza di impulso”. Detto in parole semplici significa che facciamo lampeggiare un LED a una frequenza talmente elevata che l’occhio umano non riesce a percepire. Cambiando il rapporto tra il tempo in cui il LED rimane acceso e quello in cui il LED è spento, possiamo variare la sua luminosità.

Il Duty Cycle

Il duty cicle, in un’onda quadra è il rapporto tra il tempo in cui il segnale è alto e il periodo totale del segnale.

grafico

 

Considerando il grafico:

formula

dove è il tempo in cui il segnale è alto, T è il tempo in cui il segnale è basso. Nel grafico T è il doppio di t. Possiamo quindi affermare che si tratta di un duty cycle del 50%.

Proviamo a realizzare uno sketch che permetta di applicare la tecnica PWM a un LED collegato a un pin digitale con un duty cycle del 50%. In questo caso la luminosità del LED sarà del 50%.

int led=13;
void setup(){
pinMode(led, OUTPUT);
}
void loop(){
digitalWrite(led, HIGH);
delay (10);
digitalWrite(led, LOW);
delay (10);
}

Per avere un duty cycle di diverso valore percentuale è sufficiente cambiare i valori del delay. Ad esempio, inserendo nel primo delay una attesa di 5 e nel secondo una attesa di 15 ms, otteniamo un duty cycle pari a:

formula2

 

 

 

La “tecnica” del delay non è però la migliore se si vuole utilizzare il PWM. Infati, se aggiungiamo altri componenti al nostro circuito, il LED tremola, mentre viene completato il loop. Per aggirare il problema, Arduino UNO mette a disposizione alcuni pin (3, 5, 6, 9, 10, 11) su i quali è possibile eseguire la funzione “analogWrite()“. La sintassi di questa funzione:

analogWrite(pin, valore);

“pin” corrisponde al pin digitale a cui è collegato Arduino, mentre “valore” corrisponde al valore del duty cycle, tra 0 (spento) e 255 (acceso).

Se quindi scriviamo:

analogWrite(3, 128);

otteniamo un duty cycle, e quindi una luminosità del 50% sul LED collegato al pin 3.

Scrivendo:

analogWrite(3, 32);

Il duty cycle sarà del 12,5%.

Nel video sotto mostro tre LED collegati ad Arduino. Uno ha luminosità massima, il secondo del 50% e il terzo del 25%.