Come generare un segnale PWM
I pin digitali del Netduino, come sapiamo, possono svolgere anche delle funzioni aggiuntive, in particolare i pin 5, 6, 10 ed 11 sono in grado di generare un segnale pwm (Pulse Width Modulation). Utilizzando questa funzione possiamo generare un segnale con una frequenza minima di 15Hz ed una massima di 500KHz, con un Duty Cycle variabile da 0 a 100%. Per poter generarlo dobbiamo creare un’istanza di oggetto dalla classe PWM
PWM pwm = new PWM(pin del Netduino);
Il costruttore della classe richiede come parametro il pin del Netduino che vogliamo utilizzare per generare il pwm.
Le funzioni disponibili sono due:
pwm.SetPulse(frequenza, duty cycle); pwm.SetDutyCycle(duty cycle);
SetPulse accetta due argomenti, il primo indica il valore della frequenza da generare ed il secondo il valore del duty cycle. Il valori validi da inserire nel parametro della frequenza vanno da 2 a 65535 mentre quelli validi da inserire nel parametro duty cycle vanno da 1 a 65534 ma dipendono dal parametro frequenza.
Il valore 2 corrisponde a una frequenza di 500Khz mentre il valore 65535 corrisponde a un frequenza di 15hz.
Il secondo parametro che definisce il duty cycle dipende strettamente dal valore numerico inserito nel parametro della frequenza. Chiarisco subito con un esempio, se voglio generare un segnale a 100Hz con duty cycle del 30% devo procedere in questo modo:
Calcolo il valore del parametro frequenza basandomi su questa proporzione
65535 : 2 = 500000 : 15
quindi per calcolare il numero intero che produrrà un segnale pwm con una frequenza di 100Hz devo eseguire questo calcolo
(65535*15) / 100 ~= 9830
Il risultato del calcolo va immesso nel campo frequenza della funzione SetPulse. Il valore di duty cycle da inserire nel secondo parametro dipende dal valore della frequenza, e per calcolarlo devo usare questa formula:
(Valore Frequenza / 100) * Valore Duty Cycle
che in pratica diviene:
(9830/100)*30 = 2949
di conseguenza la funzione SetPulse per generare un segnale a 100Hz con duty cycle al 30% è:
pwm.SetPulse(9830, 2949); //100Hz 30%
SetDutyCycle genera una frequenza fissa di 10KHz con un duty cycle variabile a seconda del valore inserito nel suo parametro. SetDutyCycle accetta valori da 0 a 100 rispettivamente per un duty cycle del 0% e del 100%. Se in questo parametro inseriamo il valore o otterremo un segnale basso all’uscita del pin del Netduino mentre se specifichiamo 100 otterremo sul pin in questione un valore fisso di 5Vdc, tutti gli altri valori da 1 a 99 produrranno il segnale pwm con duty cycle da 1% a 99%.
Il PWM solitamente è impiegato nel controllo della velocità di rotazione dei motori, la possibilità di variare il duty cycle permette di controllare direttamente la velocità di rotazione del motore, aumentandola o diminuendola in funzione del valore di duty cycle.
Il codice seguente mostra un esempio di utilizzo della funzione pwm del Netduino
public static void Main() { UInt32 DutyCycle = 0; PWM pw1 = new PWM(Pins.GPIO_PIN_D5); //uscita pwm su pin5 while (true) //ciclo infinito { // incrementato per 100 iterazioni la variabile Intensita // e la passo come parametro alla funzione SetDutyCycle for (DutyCycle = 1; DutyCycle <= 100; DutyCycle++) { pw1.SetDutyCycle(DutyCycle); Thread.Sleep(25); } } }
Il diagramma seguente mostra l’andamento del segnale pwm che progressivamente va da un duty cycle dell’1% sino al 99%. La frequenza del segnale è sempre di 10KHz
Come sempre critiche e suggerimenti sono sempre ben accetti.