Dopo l'articolo sulla conversione analogico-digitale, ritengo sia interessante approfondire un altro argomento con il quale spesso si deve fare i conti, ossia la tecnica PWM. Obiettivo di questo capitolo della rassegna "Lo hai mai realizzato con un PIC?" porterà il lettore a imparare a configurare il modulo CCP dei PICMicro in modalità PWM, andando a impostare la frequenza e il duty-cycle. Tutto questo per mettere lo sviluppatore di prendere la giusta dimestichezza.
Indice |
Ma cos'è il PWM?
PWM è l'acronimo di Pulse Width Modulation; si tratta di una tecnica di modulazione in ampiezza di onde quadre. Si tratta di una tecnica sperimentata tanto in telecomunicazioni quanto in elettronica di potenza; è probabilmente questo l'aspetto più interessante oggi: l'impego di PWM per pilotare transistor di potenza. Per capire come funziona il PWM, si consideri un segnale ad onda quadra, con frequenza pari a f. Per trasmettere un contenuto informativo, all'interno di ogni periodo, la tecnica si preoccupa di variare la durata dell'onda a valore alto rispetto al totale. In figura 1 è mostrato un classico esempio utile per capire come sia possibile inviare un alfabeto di simboli diversi; la figura mostra quattro possibili simboli di nove totali
L'onda quadra di riferimento ha un periodo pari a T; ogni simbolo ha un valore di durata di Ton, ossia del tempo in cui l'onda quandra sta a valore logico alto, per i valori indicati nella tabella seguente:
Simbolo | Durata Ton |
---|---|
1 | 0.1T |
2 | 0.2T |
3 | 0.3T |
4 | 0.4T |
5 | 0.5T |
6 | 0.6T |
7 | 0.7T |
8 | 0.8T |
9 | 0.9T |
L'unità che riceve il segnale trasmesso è in grado di determinare il simbolo ricevuto semplicemente misurando la durata di Ton, compreso tra un fronte di salita ed uno di discesa.
Si definisce duty-cycle il rapporto tra Ton e T e in particolare:

Il PWM ed i PICMicro
All'interno dei PICMicro con possibiilità di generare PWM è presente almeno un modulo hardware denominato CCP in grado di svolgere tre funzioni differenti: Capture Compare PWM; di queste, si va ad approfondire la sola funzionalità PWM. Nel caso ne siano presenti due, come per il PIC16F87xA, si parlerà di CCP1 e CCP2. Il modulo CCP in modalità PWM, il cui schema a blocchi semplificato è illustrato in figura 2, è in grado di generare un'onda quadra con livelli logici Vdd e Vss con frequenza impostabile e duty-cycle variabile.
Osservando con attenzione il datasheet del PIC16F87xA, si nota che la definizione di duty-cycle non corrisponde con quella fornita nel paragrafo precedente nella (Eq.1). In particolare, fissato il periodo T, il duty-cycle è definito come una porzione del totale.
Per la gestione del PWM, il PIC utilizza come base dei tempi per la generazione dell'onda quadra, il timer TMR2. All'interno di ogni periodo, fintanto che TMR2 è minore o uguale al valore impostato nel registri deputati al duty-cycle, l'onda quadra è a valore alto. Non appena TMR2 supera questa soglia, l'onda quadra si porta a valore basso fino a che TMR2 non va in overflow.
La frequenza dell'onda PWM dipende da diversi fattori tra i quali Fosc; ciò significa che non è possiile, fissato Fosc, utilizzare tutte le frequenze PWM. Una volta fissato il valore di Fpwm, bisogna caricare un valore ben determinato in PR2. Questo valore è ottenuto dalla Eq.2:
(Eq. 2)
Il duty-cycle può avere una risoluzione massima pari a 10 bit. Il calcolo della risoluzione è data da:
[bit] (Eq. 3)
Il valore del duty-cycle invece deve essere messo nel registro CCP1RL e nei bit 5 e 4 del registro CCP1CON. Una volta selezionato il valore del duty, con Eq. 4 si determina il valore dei registri CCP1RL e CCP1CON <5:4>:
αpic = (CCPR1L:CCP1CON < 5:4 > ) * Tosc * (TMR2Prescaler)
dove
αpic
rappresenta il duty cycle secondo la definizione grafica fornita dal datasheet (vedi figura 3).
Configurare il PWM in 5 passi
Per riassumere, ecco cosa suggerisce il datasheet per avere sul pin RC2 un segnale PWM:
1. Impostare il periodo dell'onda PWM mediante il registro PR2.
2. Impostare il duty-cycle, mediante il registro CCPR1L ed i bit5 e 4 del registro CCP1CON.
3. Mettere il modulo CCP1 in grado di generare un output sul pin RC2, agendo sul registro TRISC (bit 2)
4. Impostare il valore del prescaler di TMR2 ed abilitare il Timer2 agendo sul registro T2CON (bir T2ON).
5. Configurare il modulo CCP1 affinchè operi come PWM.
Un aiuto nel calcolo dei parametri
Per facilitare il calcolo del PWM ho sviluppato un foglio di calcolo (da utilizzarsi con Calc di Open Office), in grado, fissato il valore di Fpwm, scelto il valore di Fosc e del prescaler di Timer 2, di fornire come risultato il valore da caricare nel registro PR2 e il numero dei bit da impiegarsi per il duty-cycle. Il foglio di calcolo appare come in figura:
Per scaricare il foglio di calcolo, clicare su questo link
Un semplice esempio
Con questo breve esempio si mostra come con un PIC16F87xA sia possibile generare un segnale PWM. Il codice proposto, scritto in assembly, segue i cinque passi di configurazione proposti dal datasheet (ed illustrati in questo paragrafo); successivamente, è stato simulato con MPSIM per poter dimostrare il funzionamento del PIC. Le specifiche sono le seguenti:
Fosc: 4 MHz
Fpwm: 2 kHz
Ed ecco il codice:
; ; Esempio di funzionamento del PWM ; su PICMicro PIC16F876A ; ; Valori per il duty-cycle: ; Duty al 50% con CCPR1L = 0x7F, CCP1CON.5 = 0, CCP1CON.4 = 0 ; Duty al 10% con CCPR1L = 0x19, CCP1CON.5 = 1, CCP1CON.4 = 0 ; Duty al 90% con CCPR1L = 0xE6, CCP1CON.5 = 0, CCP1CON.4 = 0 ; processor PIC16f876a #include "p16F876A.inc" radix dec __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC errorlevel -302 ORG 0x00 goto main ; Interrupt vector ORG 0x04 ; ISR - Interrupt Service Routine INTR retfie main call InitPIC ; Chiamata alla routine di setup PWM inizio goto inizio ; ciclo infinito InitPIC ; Routine di setup del PWM ; 1. Impostare il periodo dell'onda PWM mediante il registro PR2. banksel PR2 movwf 124 ; 2. Impostare il duty-cycle, mediante il registro CCPR1L ; ed i bit5 e 4 del registro CCP1CON. banksel CCPR1L movlw 0x7F ; movwf CCPR1L bcf CCP1CON,4 bcf CCP1CON,5 ; 3. Mettere il modulo CCP1 in grado di generare un output sul pin RC2, ; agendo sul registro TRISC (bit 2) banksel TRISC bcf TRISC,2 ; 4. Impostare il valore del prescaler di TMR2 ed abilitare il Timer2 ; agendo sul registro T2CON (bir T2ON). banksel T2CON movlw 0x05 movwf T2CON ; 5. Configurare il modulo CCP1 affinchè operi come PWM. banksel CCP1CON movlw 0x0C movwf CCP1CON return ; Fine del programma END
Per poter variare i valori del duty, si deve agire su un valore a 8 bit, considerando che i bit più bassi sono CCP1CON <5:4> La simulazione, per un duty pari al 10%, è la seguente:
Riferimenti
- PWM su wikipedia.org
- PWM su wikipedia.it
- Open Office
- Ambiente di sviluppo MPLAB: http://www.microchip.com/mplab
- Datasheet PIC16F87xA: http://ww1.microchip.com/downloads/en/DeviceDoc/39582b.pdf
- Sito web PicExperience
- Collana "LO HAI MAI REALIZZATO CON UN PIC?":