Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

13
voti

LO HAI MAI REALIZZATO CON UN PIC? Generare 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.

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

Figura 1 - Segnali modulati in PWM

Figura 1 - Segnali modulati in PWM

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:

SimboloDurata 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

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

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

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 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:

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

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

Riferimenti

PilloleDiMicrocontrolloriPIC.JPG

PilloleDiMicrocontrolloriPIC.JPG

10

Commenti e note

Inserisci un commento

di ,

allora posso usare anche il CCP ! ero convinto che si potesse ottenere un segnale PWM solo se la porta aveva il "PWM Standard" e non si potesse invece ottenere se è "CCP". grazie mille!

Rispondi

di ,

:-)

Rispondi

di ,

Quando ho voglia di mal di testa, mi sparo un bel sorgente in assembler per PIC :-)

Rispondi

di ,

Grazie, ragazzi. Questa era ed è la mia intenzione. Ho in serbo qualche altro articolo che spero presto giungerà qui e su http://picexperience.altervista.org

Rispondi

di ,

ottimo tutorial :-)

Rispondi

di ,

Paolino grazie per le tue guide e per la tua saggezza sono un tuo ammiratore!!!

Rispondi

di ,

PicTrainer, grazie per il commento. La rubrica "LO HAI MAI REALIZZATO CON UN PIC?" nasce proprio con la filosofia dell'open-source, cercando di mettere a disposizione di chiunque quel poco che so. Sono andanto a visitare la "Tascosa & Green Valley RailRoad e ho forse intuito il motivo di tutti i tuoi mal di testa :-) Tornando a questo articolo: si propone come base per approfondimenti, ben conscio che non è possibile liquidare la faccenda PIC nè con pochi articoli nè con un tutorial! L'obbiettivo è quello di aiutare chi approccia il mondo del PICMicro ad uscire da qualche empasse che, a volte, scoraggia il neofita. A volte gli articoli scaturisconoda idee concrete (vedi ad esempio l'articolo sulla SIBILLA ed altri ancora - http://picexperience.altervista.org).

Spero di vederti su ElectroYOU! Ciao. Paolo.

Rispondi

di ,

Primo commento "a freddo": non ho mai trovato il tempo di approfondire l'argomento del comparatore e del generatore PWM "insito" nel PIC, quindi tornerò su questa pagina per capire bene le cose: mi sembra una spiegazione piuttosto esaustiva; per contro, avendo bisogno di due generatori PWM indipendenti, in fase tra loro sulla salita, pilotati da potenziometri e a frequenza bassa ("circa" 50 Hz, senza necessità di precisione) ho dovuto impostare tutto a software, usando pesantemente l'interrupt sia per la temporizzazione (TMR0) sia per il controllo dei canali A/D. Se hai voglia di scoprire il perché di tutta questa "fonte di emicranie", prova a dare un'occhiata al mio sito:http://sites.google.com/site/tascosagreenvalley/ (ci trovi anche la mia faccia, anche se la foto poteva essere migliore...) e, se la cosa sembra interessante, fammelo sapere, io sono uno a cui fa piacere raccontare quello che sa, NON tenerselo per se. CIAO !

Rispondi

di ,

Grazie, DonJ. :-)

Rispondi

di ,

Grande Paolino, le tue guide tornano sempre utili e facili da comprendere. Grazie!

Rispondi

Inserisci un commento

Per inserire commenti è necessario iscriversi ad ElectroYou. Se sei già iscritto, effettua il login.