Il modulo PWM del PIC18

Attenzione! Questa pagina contiene materiale obsoleto - Vai al tutorial relativo all'ambiente MPLAB X e XC8 Attenzione!

L'uso di segnali modulati a larghezza di impulsi (PWM, Pulse Width Modulation, in inglese) è una tecnica che permette ad un sistema digitale di pilotare dispositivi analogici potendo variare con continuità la tensione di comando. Per esempio in un motore DC è possibile variare con continuità la velocità, in una lampada è possibile variare la luce emessa. A differenza dei circuiti che usano un ADC seguito da un amplificatore lineare, con la tecnica PWM questa operazione è teoricamente possibile senza spreco di energia.

E' nelle prime fasi di stesura il tutorial relativo all'ambiente MPLAB X e XC8.

Per sapere di più potete fare riferimento alla pagina http://en.wikipedia.org/wiki/Pulse-width_modulation.

Di seguito le immagini di due segnali PWM generati attraverso un PIC18, come appaiono sullo schermo di un oscilloscopio. Nel caso di carichi lineari la potenza associata al secondo dei due segnali è doppia di quella associato al primo, essendo doppio il Duty Cycle.

PWM con DC=25% - Vrms=1.41V Segnale PWM con DC =50% - Vrms=2V

Per generare un segnale PWM utilizzando il modulo hardware del PIC18 è prima di tutto necessario impostare la frequenza del segnale utilizzando il Timer2. Pur essendo possibile scrivere direttamente nei registri di controllo  del Timer2, è decisamente più comodo usare le funzioni delle librerie fornite da Microchip con il compilatore C18.

Il codice di esempio completo che implementa ciò lo trovate a fondo pagina. Di seguito solo alcuni commenti integrativi a quelli già presenti nel codice stesso.

La funzione OpenTimer2( TIMER_INT_OFF & T2_PS_1_1 & T2_POST_1_1) attiva il Timer2. Con i parametri riportati non viene inserito alcun pre- o post- scaler (cioè divisori di frequenza in ingresso o uscita) e senza invocare una interruzione a fine conteggio.

La funzione OpenPWM1(count) imposta la frequenza del segnale PWM che si vuole generare.  La formula da utilizzare è:

count = T f / 4 / T2_PS - 1

Dove T è il periodo richiesto, f la frequenza del clock e T2PS il prescaler del Timer2, se presente. Per esempio con clock a 16MHz, per ottenere un segnale PWM con periodo di 50 us (20 kHz) occorre impostare count al valore 199 nell'ipotesi di prescaler del Timer2 unitario .

La funzione SetOutputPWM1 (SINGLE_OUT, PWM_MODE_1) imposta il modulo PWM per generare una singola uscita (invece che 2 o 4). Il secondo parametro indica se le uscite sono attive alte o basse.

Infine la funzione SetDCPWM1() determina per quanto tempo il pin di uscita rimane attivo, tempo che deve ovviamente essere compreso tra 0 ed il periodo T. La formula da utilizzare è:

Dove DC è compreso tra 0 e 100, T ed f coincidono con i valori già sopra citati.

Alcune note importanti se non volete perdere tempo a cercare errori banali ma che spesso sfuggono:

Scarica il codice sorgente

Licenza "Creative Commons" - Attribuzione-Condividi allo stesso modo 3.0 Unported


Pagina principaleAccessibilitàNote legaliPosta elettronicaXHTML 1.0 StrictCSS 3

Vai in cima