Arduino PWM

No, Arduino PWM non è un modello di Arduino, ma la possibilità per Arduino di generare una uscita PWM.

PWM stà è un acronimo inglese che stà per Pulse Width Modulation, cioè modulazione a larghezza di impulsi… si ma che cosa è?

Si tratta della capacità di generare un segnale impulsivo il cui comportamento dipende da un valore che in Arduino assume i seguenti limiti:

  • valore 0 – minimo – il segnale del PWM è un segnale sempre a 0 (zero) logico, cioè basso
  • valore 255 – massimo – il segnale del PWM è un segnale sempre a 1 (uno) logico, cioè alto

Per tutti gli altri valori intermedi il segnale oscillerà generando un treno di impulsi.

In pratica, più siamo vicini allo zero più stretti saranno gli impulsi, più siamo vicino al massimo (255) più saranno larghi gli impulsi. Si parlerà di DUTY CYCLE esprimendolo in percentuale (%) intendendo con questo valore la percentuale della presenza del segnale alto rispetto al basso nel periodo del segnale considerato. Un grafico renderà meglio questo concetto:

Arduino genera un PWM con una frequenza di 500Hz, vuol dire che tra un impulso e l’altro ci sono 2ms (2 millisecondi), contrassegnati dalle linee rosse nel grafico.

I PIN che possono generare nativamente un segnale PWM sono ben definiti per ogni tipologia di board Arduino. Per un Arduino Nano v3.0 fare riferimento a questo link: Arduino Nano Pinout.

Una volta individuato il PIN che utilizzeremo per il segnale PWM è sufficiente utilizzare la funzione analogWrite() che la libreria standard di Arduino ci mette a disposizione, quindi senza che abbiamo necessità di usare librerie esterne.

https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/

Da cui è possibile estrarre un esempio:

int ledPin = 9;      // LED connected to digital pin 9
int analogPin = 3;   // potentiometer connected to analog pin 3
int val = 0;         // variable to store the read value

void setup()
{
  pinMode(ledPin, OUTPUT);   // sets the pin as output
}

void loop()
{
  val = analogRead(analogPin);   // read the input pin
  analogWrite(ledPin, val / 4);  // analogRead values go from 0 to 1023, analogWrite values from 0 to 255
}

Alcuni miei progetti in cui ho usato il PWM: