Energia 05 - La modulazione PWM

Valutazione attuale: 4 / 5

Introduzione

Nello scorso articolo abbiamo dato un'occhiata generale alla gestione delle uscite dell'MSP430 mediante la funzione analogWrite, utilizzando un LED RGB.

In questo articolo andremo a descrivere la funzione analogWrite; questa funzione utilizza la tecnica di modulazione PWM (Pulse Width Modulation) spesso usata nei sistemi di controllo di potenza. Sfruttando la caratteristica dell'occhio umano di non riuscire a percepire variazioni di stato per frequenze elevate è possibile controllare anche l'intensità luminosa dei LED. Metteremo inoltre a confronto i comandi analogWrite e digitalWrite per studiarne le differenze.

Materiale necessario

Per il nostro progetto abbiamo bisogno del seguente materiale:

Cos'è la modulazione PWM?

La modulazione di larghezza di impulso o PWM, acronimo del corrispettivo inglese Pulse Width Modulation, è un tipo di modulazione digitale che permette di ottenere una tensione media variabile dipendente dal rapporto tra la durata dell'impulso positivo e il periodo del segnale stesso. In particolare un segnale PWM  è caratterizzato da una frequenza costante e duty cycle variabile, ovvero il rapporto tra il tempo in cui il segnale viene posto a livello alto rispetto al periodo totale. Il periodo è una grandezza fisica relativa alle onde e rappresenta il tempo in cui l'onda compie un'oscillazione e torna alla condizione iniziale; si indica generalmente con il simbolo T e si misura, nel sistema internazionale, in secondi. Il tutto può essere riassunto e modellizzato mediante l'accensione o lo spegnimento di un interruttore ad alta frequenza.
 


Figura1: Esempio di un segnale PWM con duty cycle al 20% e 50%.

Come possiamo vedere dalla Figura 1, nel primo caso, il pin del microcontrollore (interruttore) resta alto il 50% dell'intero periodo. La lunghezza di un impulso è controllabile per mezzo della funzione 'analogWrite', in particolare 'analogWrite (0)' non produce alcun impulso e 'analogWrite (255)' produce un impulso che dura tutto il periodo, per cui l'uscita, in realtà, resta ad un valore fisso alto.
Specificando quindi un valore in analogWrite compreso tra 0 e 255 si produce un impulso di ampiezza variabile.
Se l'impulso resta  alto solo per il 5% del tempo dell'intero periodo, questo vuol dire che il dispositivo che stiamo controllando riceve solamente il 5% della potenza massima.
Se invece l'uscita risulta alta per il 90% del tempo, allora il carico ottiene il 90% della potenza massima. Nel caso in cui il carico sia un LED, avendo una frequenza di accensione e spegnimento molto elevato, l'occhio umano viene ingannato, avendo l'impressione che la luminosità del LED stia cambiando e non che il LED si stia accendendo e spegnendo.

Utilizzando invece la funzione digitalWrite piuttosto che analogWrite, abilitiamo semplicemente l'uscita del microcontrollore ad uno stato HIGH, cioè alto, nel caso in cui vogliamo l'accensione del dispositivo, o LOW, cioè basso, nel caso in cui vogliamo lo spegnimento del dispositivo. In questo modo non abbiamo nessun controllo della luminosità di un LED.

Esempio Applicativo

Nel programma che andremo a scrivere metteremo a confronto mediante due uscite collegate a due LED, le funzioni analogWrite e digitalWrite. Vediamo l'esempio nello specifico, come riportato in Figura  2.

Figura 2: Sketch per il controllo dei LED.

Lo sketch ha una struttura leggermente diversa da quella vista in precedenza, dato che andiamo ad utilizzare il ciclo for per andare ad incrementare ogni 10 ms l'intensità del LED.

Per prima cosa, come possiamo vedere, si sono inizializzate le variabili ritardo e luminosità che andremo poi ad usare; inoltre abbiamo utilizzato le scorciatoie che ci permettono di utilizzare, mediante l'indirizzamento diretto, i LED verde e rosso già presenti nativamente sul LaunchPad.

int ritardo = 500;
int intensita = 0;
void setup () {
   pinMode (RED_LED, OUTPUT);
   pinMode (GREEN_LED, OUTPUT);
}

Prima di procedere oltre, controllate che i ponticelli posti al lato dei LED siano presenti, dato che li avrete probabilmente rimossi durante lo scorso articolo.

Nella seconda parte dello sketch è presente il programma vero e proprio:

void loop (){
   digitalWrite (RED_LED, HIGH);
   delay(ritardo);
   for (intensita=0; intensita<=255; intensita++) {
      analogWrite(GREEN_LED, intensita)
      delay(10);
   }
   digitalWrite (RED_LED, LOW);
   digitalWrite (GREEN_LED, LOW);
   delay(ritardo);
}

Prima di tutto andiamo a settare il LED rosso nello stato  HIGH, cioè acceso, con la funzione "digitalWrite", aspettiamo poi mezzo secondo per vedere iniziare ad accendere il LED verde.
Questo è possibile grazie alla funzione "analogWrite"  che utilizza il PWM descritto poco fa.
Lo stesso esperimento è possibile farlo con i motorini elettrici in DC, variandone la velocità, ma questa è un'altra storia ed un altro articolo...

Questo breve Tutorial è stato realizzato con lo scopo di far conoscere quello che sta divenendo sempre più un ambiente di sviluppo alternativo a Code Composer Studio per gli MSP430.
Nel prossimo articolo andremo a vedere la funzione serial monitor attraverso l'utilizzo della funzione digitalRead.


Autore : Andrea Valeriani


Bibliografia


You don`t have permission to comment here!