Modulazione PWM: Da un Semplice Termostato On/Off a un Segnale Analogico DC Livellato
su
Esistono molti termini simili come Pulse Duration Modulation, Pulse Time Modulation o Variable Duty Cycle Control, ma indicano tutti la stessa cosa. Ritengo che il termine più diffuso sia Pulse-Width Modulation, perché è collegato all’acronimo PWM utilizzato nella maggior parte dei datasheet dei microcontrollori.
La forma più semplice di controllo a modulazione di larghezza d’impulso con cui tutti abbiamo familiarità è un comune riscaldatore elettrico domestico. La temperatura desiderata può essere regolata ruotando la manopola del termostato. Quando viene raggiunta la temperatura ambiente impostata, si sente un clic e l’alimentazione all’elemento riscaldante viene interrotta. Quando la temperatura scende leggermente, si sente nuovamente il clic e il riscaldamento si riattiva, ripetendo il ciclo. Più alta è la temperatura impostata, più lunga sarà la fase di accensione e più breve quella di spegnimento per mantenere la temperatura desiderata.
Questo funziona perché esiste sempre una soglia inferiore che attiva il riscaldamento e una superiore che lo disattiva. Quanto più queste soglie sono vicine tra loro (cioè minore è l’isteresi), tanto più rapidi saranno gli intervalli di commutazione e minori saranno le variazioni di temperatura.
Questo metodo è adeguato per il controllo della temperatura ambiente perché la temperatura non cambia istantaneamente durante la commutazione, ma in modo graduale. Se invece vogliamo controllare qualcosa come la luminosità di un LED, i tempi di commutazione di questo metodo non sono più adatti. La frequenza di commutazione deve essere molto più elevata — almeno 100 Hz — perché non vogliamo che il LED lampeggi visibilmente; vogliamo una variazione di luminosità stabile e uniforme. Regolando la durata di ciascun impulso, possiamo attenuare la luce dallo 0% al 100% con passi molto piccoli.
La forma d’onda mostrata in Figura 1 illustra le diverse larghezze d’impulso dallo 0% (completamente spento, nessun impulso) al 100% (sempre acceso). Con un duty cycle del 50% il segnale è attivo per lo stesso tempo in cui è inattivo. Si può vedere chiaramente come, da sinistra a destra, il colore di sfondo passi gradualmente dal bianco (spento) al grigio (acceso) all’aumentare della larghezza dell’impulso.
Generazione di un segnale PWM
È possibile generare un segnale PWM utilizzando un timer dedicato come l’NE555, ma è altrettanto semplice farlo con Arduino o qualsiasi altro microcontrollore. Questi dispongono di uscite PWM che non si basano su comandi delay, che lasciano il processore inattivo in attesa. La maggior parte dei microcontrollori ha uscite PWM dedicate controllate da un timer interno a 8 bit. È sufficiente specificare il duty cycle desiderato. Un valore di 0 produce un segnale sempre spento, mentre 255 produce un segnale sempre acceso. Un valore di 128 genera un’onda quadra con duty cycle del 50%.
Con ATmega328 (o ATmega168), è possibile generare automaticamente un segnale PWM a 490 Hz sui pin I/O 3, 9, 10 e 11. Questo è più che sufficiente per controllare la luminosità dei LED, poiché lo sfarfallio diventa visibile solo a frequenze ben inferiori a 100 Hz. Se sono necessarie frequenze più elevate, i pin 5 e 6 possono generare segnali PWM a 980 Hz (usando Fast PWM). Tuttavia, questa modalità va usata solo se necessario, perché funzioni di sistema come millis() e delay() utilizzano lo stesso timer interno. Nell’ambiente Arduino si può usare la funzione analogWrite con un valore da 0 a 255. Non è nemmeno necessario impostare il pin come output con pinMode.
Aggiungendo un transistor all’uscita PWM, possiamo controllare in modo efficiente la luminosità di un LED ad alta potenza o la velocità di un motore DC. Questo metodo è molto più efficiente rispetto all’uso di una tensione continua generata da un regolatore lineare, perché il circuito commuta semplicemente tra acceso e spento, riducendo al minimo le perdite di potenza.
Demodulazione tramite filtro passa-basso
A volte è necessario ottenere una vera tensione continua o una corrente stabile e regolata, ad esempio per caricare una batteria. Per convertire un segnale PWM in una tensione continua basta un resistore e un condensatore collegati per formare un filtro passa-basso (come mostrato in Figura 2).
smussa il segnale PWM.
Le forme d’onda in Figura 3 mostrano inizialmente il PWM spento (0%). La tensione sul condensatore resta a 0 V. Poi Arduino genera un PWM al 75%. Il condensatore si carica lentamente e la tensione si stabilizza a circa 3,75 V.
La tensione non è perfettamente stabile: resta un piccolo ripple. Aumentando il condensatore si riduce il ripple ma aumenta il tempo di risposta.
La costante di tempo τ
La costante di tempo τ è definita come τ = R × C. Nel nostro esempio: τ = 4,7 kΩ × 100 µF = 470 ms.
Tensione di ripple e come ridurla
ΔV = Vb / (4 × f × R × C)
Nel nostro caso: ΔV ≈ 5,4 mV, valore molto basso.
Controllo della tensione con retroazione
Per un controllo più preciso si può usare la retroazione collegando l’uscita PWM a un ingresso analogico del microcontrollore.
Per pilotare carichi più elevati si usa un transistor, che amplifica la corrente.
Domande o commenti?
Per domande tecniche contattare l’autore: r.sont@freenet.de oppure la redazione Elektor: editor@elektor.com.
Nota dell’editore: Questo articolo (230583-01) — a cura di Rolf Gerstendorf e tradotto da Martin Cooke — è pubblicato in Elektor marzo/aprile 2026.

Commenti (0 commenti)