Segnale PWM

LO HAI AI REALIZZATO CON UN PIC? Generare i segnali PWM con i PICMicro

 

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.

 

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; è probabile 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:


\alpha =\frac{T{on}}{T} Eq.1

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.

Figura 2 - Schema a blocchi del PWM secondo il datasheet.JPG

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.

Figura 3 - Onda PWM schematizzata nel datasheet

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:


PR2 = \frac{F_{osc}}{4  F_{pwm}   (TMR2_{PrescalerValue})}-1 (Eq. 2)

Il duty-cycle può avere una risoluzione massima pari a 10 bit. Il calcolo della risoluzione è data da:
Resolution =  \frac{log\frac{F_{osc}}{F_{pwm}}}{log(2)} [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)

(CCPR1L:CCP1CON<5:4>) =  \frac{\alpha_{pic}}{(T{osc} * TMR2_Prescaler)}

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:



Figura 4 - Il foglio di calcolo

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 nel paragrafo precedente); successivamente, è stato simulato con MPSIM per poter dimostrare il funzionamento del PIC. Le specifiche sono le seguenti:

Fosc: 4MHz
Fpwm: 2kHz

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 = 0
; Duty al 10% con CCPR1L = 0x19, CCP1CON.5 = 1, CCP1CON = 0
; Duty al 90% con CCPR1L = 0xE6, CCP1CON.5 = 0, CCP1CON = 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>

Figura 5 - Simulazione del PWM con duty-cycle al 10%

Riferimenti

PWM su wikipedia.org
PWM su wikipedia.it
Open Office

Licenza Creative Commons
Questa opera viene distribuita con licenza Creative Commons Attribuzione - Non commerciale - Non opere derivate 3.0 Unported.
ShoppingASEhandelASErhvervIndexDKServiceIndexDK