PWM (Pulse Width Modulation)
Il microcontrollore, oltre ad avere delle uscite e ingressi digitali, può anche gestire i segnali analogici, infatti, il microcontrollore ATmega328 ha alcuni ingressi che sono dotati di un convertitore ADC (Analog Digital Converter ) selezionabile dai registri di configurazione del microcontrollore.
In particolare, il microcontrollore sopracitato, montato sulla scheda di Arduino Uno, non possiede un DAC (Digital Analog Converter), per la generazione dei segnali analogici.
Tuttavia, questa mancanza può essere superata , seppur con qualche limitazione, tramite un segnale PWM.
Un segnale PWM ha una frequenza costante, ma il duty cycle è variabile nel tempo, se variamo in percentuale il tempo in cui il segnale è nello stato alto, nella Figura 1 si chiarisce il concetto:
Come anticipato in precedenza, un segnale analogico può essere generato da un segnale PWM, infatti, il suo valore medio varia in funzione della percentuale, nel periodo, in cui la forma d’onda si trova nello stato alto. Il valore medio di un segnale PWM può essere ottenuto grazie all’utilizzo di un filtro passa basso ( descriveremo in un futuro post).
Approfondimenti
La frequenza di un segnale periodico è data dal numero di volte che esso si ripete in un secondo, per esempio, se ha una frequenza di 1kHz, significa che in un secondo il segnale si ripete per mille volte. Mentre, il periodo è l’intervallo temporale che intercorre, per esempio, tra due fronti di salita, nel caso di onda quadra.
Il periodo e la frequenza sono inversamente proporzionali, cioè se il periodo aumenta, di conseguenza diminuisce la frequenza, perché in un secondo ci sono meno ripetizione, poiche’ ogni singola forma d’onda ha una durata maggiore. Se conosciamo il periodo possiamo ricavare la frequenza da questa relazione:
f = 1/T
dove f è la frequenza e T il periodo.
Viceversa se abbiamo la frequenza possiamo ricavare il periodo:
T = 1/f
Come pilotare l’uscita PWM
Il PWM del microcontrollore ATmega328 ha una risoluzione di 8 bit , pertanto, abbiamo la possibilità di generare 28 combinazione che corrispondono a 255 valori, con l’istruzione analogWrite(pin, i), dove i imposta in percentuale il tempo in cui il segnale rimane alto, per esempio con i = 0 , il segnale rimane basso per l’intero periodo T, invece se impostiamo i = 127, il segnale rimane alto per il 50% del periodo, quindi, c’è una proporzionalità lineare tra il valore di i e il tempo in cui il segnale rimane alto, mentre con “pin” selezioniamo uno dei pin dove si desidera attivare la periferica PWM. In Figura 2 e’ riportato lo schema elettrico, in questo caso, non abbiamo inserito, in serie al diodo LED, un filtro passo basso, perche’ il nostro occhio e’ intrinsecamente un filtro e quindi non riusciremo ad apprezzare gli intervalli d’accensione del diodo LED, ma rileveremo solo un aumento o una diminuzione dell’intensita’ luminosa, e’ lo stesso principio con il quale al cinema non riusciamo a rilevare la sequenza d’immagini proiettata sullo schemo.
const int LED=9; // il pin 9 e' rinominato come LED per usare un valore mnemonico void setup() { pinMode (LED, OUTPUT); // Set the LED pin as an output analogWrite(LED, 0); } void loop() { for (int i=0; i<256; i++) { analogWrite(LED, i); delay(10); } for (int i=255; i>=0; i--) { analogWrite(LED, i); delay(10); } }
Codice
Appena parte l’esecuzione del codice, il diodo LED è spento, per poi eseguire le istruzioni presenti nel primo ciclo “for” che si ripete fino a quando la variabile i è inferiore a 256, il valore di i è incrementato ad ogni ciclo, ed essa setta il valore di controllo del PWM, nella funzione analogWrite(LED, i); per cui ad ogni ciclo, con un ritardo di 10 ms, il diodo LED aumenta progressivamente la sua luminosità fino al valore massimo, cioè, quando la variabile i raggiunge il valore di 255. Nel secondo ciclo “for” la situazione è inversa, il dido LED è alla massima intensità luminosa, ad ogni ciclo la variabile i è decrementata e progressivamente l’intensità luminosa del diodo LED diminuisce fino a raggiunge il valore di zero dove il diodo LED si spegne di nuovo.