Sei sulla pagina 1di 24

http://www.mrscuole.

net/anxapic/

Corso introduttivo sui microcontrollori PIC


PWM
Generare segnali PWM con il PIC16F877 Tecniche e consigli

Nicola Amoroso
namoroso@mrscuole.net

na_PWM

http://www.mrscuole.net/anxapic/ 1

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

uC Pic PWM
Un segnale PWM (Pulse Width Modulation ovvero modulazione a variazione della larghezza d'impulso) un'onda quadra di duty-cycle variabile che permette di controllare l'assorbimento (la potenza assorbita) di un carico elettrico (es. motore DC), variando (modulando) il duty-cycle del segnale.

Un segnale PWM caratterizzato dalla frequenza (fissa) e dal duty-cycle (variabile) come si deduce dalla figura Il duty cycle il rapporto tra il tempo in cui l'onda assume valore alto e il periodo T (l'inverso della frequenza: T=1/f) ne segue che un duty cycle del 50% corrisponde ad un'onda quadra che assume valore alto per il 50% del tempo, un duty cycle dell'80% corrisponde ad un'onda quadra che assume valore alto per l'80% del tempo e basso per il restante 20%, un duty cycle del 100% corrisponde ad un segnale sempre alto e un duty cycle dello 0% ad un segnale sempre basso (come vedremo anche questi ultimi due casi non sono del tutto inutili).

na_PWM

http://www.mrscuole.net/anxapic/ 2

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il PIC 16F877 Generare

segnali PWM

Esistono due modi per generare segnali PWM con i Pic: Il primo (emulazione PWM software) consiste nello scrivere del codice che generi un'onda quadra, di opportuna frequenza e duty cycle, assegnata su un certo piedino di uscita, Il secondo (PWM hardware) consiste nell'utilizzare delle periferiche apposite dei PIC, i moduli CCP (capture compare PWM), per generare l'onda. Risulta ovvio che il secondo metodo il migliore (con il primo la generazione dell'onda quadra pu essere difficile e comunque toglie preziosi cicli di clock al resto dell'applicazione) tuttavia non tutti i microcontrollori PIC sono dotati delle opportune periferiche hardware.

na_PWM

http://www.mrscuole.net/anxapic/ 3

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il PIC 16F877 Generare

segnali PWM

Il PIC16F877 dispone di ben due moduli CCP (CCP1 e CCP2) per il PWM: tali moduli si appoggiano al timer 2 e sono quindi vincolati ad avere la stessa frequenza mentre il duty cycle pu essere variato indipendentemente per ogni modulo andando a scrivere opportuni valori in appositi registri. I Pin RC2 (CCP1) e RC1 (CCP2) sono i piedini interessati per lutilizzo di questi moduli. Per luso di un modulo CCP bisogna eseguire i seguenti steps:
1. 2. 3. 4. Definire il periodo del segnale PWM generato andando a scrivere un opportuno valore nel registro PR2 del PIC Definire il modulo CCPx come modulo PWM Abilitare il timer Tmr2 con opportuno prescaler Definire il Duty cycle del segnale generato

na_PWM

http://www.mrscuole.net/anxapic/ 4

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il PIC 16F877 Generare

segnali PWM

Es: Generare un segnale ad onda quadra TTL compatibile con frequenza di 10 KHz e Duty cycle del 50%

Per generare questo segnale scelgo di utilizzare il modulo Hw CCP2 (Pin RC1 del Pic 16f877) da impostare in modalit PWM. E importante definire questa fase di impostazione in quanto [cfr.16f877 Microchip DataSheets] i moduli CCPx possono funzionare in modalit capture, compare e pwm. Tralasciamo le prime due modalit di funzionamento (non interessano il nostro problema) e invece consideriamo il modo pwm. Per poter generare questo segnale dobbiamo conoscere il periodo (inverso della frequenza) ad esso associato in quanto [cfr.16f877 Microchip DataSheets] :

periodo PWM =[(PR2)+1]*4*Tosc*(TMR2 prescale value)

- PR2 un registro (associato a Tmr2) da impostare con opportuno valore per ottenere il periodo voluto - Tosc linverso della frequenza del quarzo esterno che fornisce il clock al PIC - TMR2 prescale value il valore di prescaler associato al Timer2 del 16f877 N.B. => PR2 un registro a 8 bit, valore max impostabile pari a 255 [cfr.16f877 Microchip DataSheets] TMR2 prescale value pu valere 1, 4, 16 [cfr.16f877 Microchip DataSheets]

na_PWM

http://www.mrscuole.net/anxapic/ 5

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il PIC 16F877 Generare


Per il nostro esempio si ha:
Periodo PWM = 1/10.000 = 10 ms

segnali PWM

Es: Generare un segnale ad onda quadra TTL compatibile con frequenza di 10 KHz e Duty cicle del 50%

Tosc = 1/4.000.000 = 0,25 micros

TMR2 prescale value = 1 (scegliamo questo valore se poi il risultato del calcolo non accettabile verr cambiato Avremo quindi: PR2 = (0,0001/(4*0,00000025*1))-1 = 100-1 = 99

Vediamo ora il codice sorgente del nostro software. Il CCS PicC compiler fornisce tre funzioni interne che agevolano il nostro lavoro, precisamente:
- setup_timer_2 (mode, period, postscale) [Per labilitazione di TMR2 sempre collegato ai moduli CCPx] mode => TMR2 prescale value => nel nostro caso 1 [T2_DIV_BY_1] period => PR2 value => nel nostro caso 99 postscale => Indica il n.ro di overflow prima di generare un interrupt => bisogna indicare un valore tra 1 e 16 => nel nostro caso linterrupt non viene abilitato e questo valore lo mettiamo a 1

na_PWM

http://www.mrscuole.net/anxapic/ 6

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il PIC 16F877 Generare

segnali PWM

Es: Generare un segnale ad onda quadra TTL compatibile con frequenza di 10 KHz e Duty cicle del 50%

- setup_ccp2 (mode) [per scegliere la modalit di funzionamento del modulo CCP2 (Pin RC1)]
mode => sceglie la modalit di funzionamento del modulo => 4 modi possibili => [1] CCP_OFF (default) [2] CCP_CAPTURE_xx [3] CCP_COMPARE_xx [4] CCP_PWM

- set_pwm2_Duty (value) [permette di impostare il valore del duty-cycle del segnale pwm]
value => valore compreso tra 0 e il valore di PR2 definito in precedenza => per PR2 = 99 => value=49 Duty cycle 50% - value=35 Duty cycle 35% - value=80 Duty cycle 80%

Vediamo ora come scrivere il codice sorgente per il nostro software. Per questo esempio (molto semplice) non viene analizzato alcun flow-chart.
na_PWM

http://www.mrscuole.net/anxapic/ 7

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il PIC 16F877 Generare

segnali PWM

Es: Generare un segnale ad onda quadra TTL compatibile con frequenza di 10 KHz e Duty cicle del 50% Con il pic wizard del CCS PCWH impostiamo le modalit di funzionamento del nostro sistema 1. Impostazioni generali

na_PWM

http://www.mrscuole.net/anxapic/ 8

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il PIC 16F877

Generare segnali PWM

Es: Generare un segnale ad onda quadra TTL compatibile con frequenza di 10 KHz e Duty cicle del 50% 2. Abilito il modulo CCP2 in modalit PWM [Sezione Other del CCS Pic Wizard]

na_PWM

http://www.mrscuole.net/anxapic/ 9

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il PIC 16F877

Generare segnali PWM

Es: Generare un segnale ad onda quadra TTL compatibile con frequenza di 10 KHz e Duty cicle del 50% 3. Abilito timer TMR2 con prescaler di 1

Il prescaler (Resolution) di Timer2 viene impostato a 1 Loverflow period di Timer2 viene impostato a 99

na_PWM

http://www.mrscuole.net/anxapic/ 10

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il PIC 16F877

Generare segnali PWM

Es: Generare un segnale ad onda quadra TTL compatibile con frequenza di 10 KHz e Duty cicle del 50% 4. Il codice generato dal Pic wizard

Set modulo CCP2 (pin RC1) in modalita PWM. Segnale generato con duty-cycle del 50%

Il CCS Pic wizard genera automaticamente il codice necessario per il set di sistema ed in particolare, senza alcun calcolo preventivo, imposta i parametri per le tre funzioni interne che permetttono di definire lutilizzo del modulo CCPx scelto per generare il segnale PWM voluto (duty-cycle del 50%).

na_PWM

http://www.mrscuole.net/anxapic/ 11

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il PIC 16F877

Generare segnali PWM

Es: Generare un segnale ad onda quadra TTL compatibile con frequenza di 10 KHz e Duty cicle del 50% 4. Il codice generato dal Pic wizard [Nota] Riprendiamo in considerazione quanto affermato in precedenza riguardo alle tre funzioni interne, del CCS PCWH, che permettono di impostare luso del modulo CCPx scelto in modalit PWM con duty-cycle, del segnale generato, di opportuno valore. In particolare la funzione interna:

- set_pwm2_Duty (value) [permette di impostare il valore del duty-cycle del segnale pwm] value => valore compreso tra 0 e il valore di PR2 definito in precedenza => per PR2 = 99 => value = 49 Duty-cycle 50% - value = 35 Duty-cycle 35% - value = 80 Duty-cycle 80%

N.B. => value deve essere un numero intero. Per un duty-cycle del 50% si pu utilizzare sia 49 che 50 (il valore esatto deve essere 49,5 non ammesso); avremo comunque un segnale con un duty-cycle non perfettamente uguale al 50%.

na_PWM

http://www.mrscuole.net/anxapic/ 12

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il PIC 16F877

Generare segnali PWM

Es: Generare un segnale ad onda quadra TTL compatibile con frequenza di 10 KHz e Duty cicle del 50% 4. Il codice generato dal Pic wizard [Nota]

Set modulo CCP2 (pin RC1) in modalita PWM. Segnale generato con duty-cycle del 50%

Analizzando il codice generato con il CCS Pic wizard, si nota che il valore impostato per avere un duty-cycle del 50% non 49 (oppure 50) ma uguale a 200. In realt un valore pari a 200 imposta perfettamente un duty-cycle del 50% in quanto il valore utilizzato, per il duty-cycle del segnale generato, pari al valore impostato (200) diviso per 4 (200/4 = 50). Cerchiamo di fornire un chiarimento

na_PWM

http://www.mrscuole.net/anxapic/ 13

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il PIC 16F877

Generare segnali PWM

Es: Generare un segnale ad onda quadra TTL compatibile con frequenza di 10 KHz e Duty cicle del 50% 4. Il codice generato dal Pic wizard [Nota]
Analizzando il codice generato con il CCS Pic wizard, si nota che il valore impostato per avere un duty-cycle del 50% non 49 (oppure 50) ma uguale a 200. In realt un valore pari a 200 imposta perfettamente un duty-cycle del 50% in quanto il valore utilizzato, per il duty-cycle del segnale generato, pari al valore impostato (200) diviso per 4 (200/4 = 50). Cerchiamo di fornire un chiarimento

Il CCS Pic-C compiler per impostare il duty-cycle del segnale PWM utilizza dieci bit (2 registri a 8 bit di cui solo i 10 bit pi bassi vengono presi in considerazione). Di questi dieci bit solo gli 8 bit piu alti rappresentano il reale valore da associare al duty-cycle del segnale generato CCS_PWM 00 per i due bit inseriti CCS_PWM_PLUS_1 01 per i due bit inseriti CCS_PWM_PLUS_2 10 per i due bit inseriti CCS_PWM_PLUS_3 11 per i due bit inseriti mentre i due bit pi bassi vengono inseriti per una eventuale [?] compatibilit con le versioni precedenti del sistema di sviluppo.

Inserire 2 bit a destra del valore del duty-cycle del segnale come se lo stesso valore venisse moltiplicato per 4 (shift a sinistra di due posizioni)
na_PWM

http://www.mrscuole.net/anxapic/ 14

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il PIC 16F877

Generare segnali PWM

Es: Generare un segnale ad onda quadra TTL compatibile con frequenza di 10 KHz e Duty cicle del 50% 4. Il codice generato dal Pic wizard [Nota]
Per impostare il duty-cycle vi sono due possibili modi: a) Utilizzare come parametro della funzione set_pwm_duty() il valore suggerito dal Pic Wizard diviso per 4 ( nel

nostro caso 200/4 = 50). In questo caso si utilizza un valore int8 come parametro. b) Utilizzare come parametro della funzione set_pwm_duty() il valore suggerito dal Pic Wizard, In questo caso

si utilizza un valore int16 come parametro e bisogna indicare che il parametro utilizzato un int16 (opportuno casting del parametro della funzione set_pwm_duty()).

Casting

na_PWM

http://www.mrscuole.net/anxapic/ 15

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il PIC 16F877
5. Il codice completo

Generare segnali PWM


6. Il segnale generato

Es: Generare un segnale ad onda quadra TTL compatibile con frequenza di 10 KHz e Duty cicle del 50%

Il pin RC1 collegato in ingresso a un oscilloscopio digitale

f = 10KHz D = 50%

na_PWM

http://www.mrscuole.net/anxapic/ 16

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il PIC 16F877

Generare segnali PWM

Esercizi (Con eventuali commenti) Generare un segnale ad onda quadra di frequenza f = 10 KHz e Duty cicle D = 35% Generare un segnale ad onda quadra di frequenza f = 10 KHz e Duty cicle D = 80 % Generare un segnale ad onda quadra di frequenza f = 6 KHz e Duty cicle D = 60 %

na_PWM

http://www.mrscuole.net/anxapic/ 17

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il PIC 16F877

Generare segnali PWM

Vediamo ora dei semplici esercizi i cui risultati potrebbero essere utili in seguito! seguito!

In uscita del pin RC1 (CCP2-PWM) colleghiamo un filtro passa basso con frequenza di taglio inferiore almeno alla met della frequenza del segnale pwm applicatogli in ingresso (10 Khz). Generiamo segnali diversi con duty cycle variabile dal 12% al 98% e misuriamo la ddp ai capi del condensatore del filtro.
na_PWM

http://www.mrscuole.net/anxapic/ 18

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il PIC 16F877

Generare segnali PWM

Per il nostro filtro prendiamo i seguenti valori: R=10 K C=820 nF (680 nF)
RC1 R C

GND

GND

Il valore Vout misurato con lo strumento aumenta con l'aumentare del duty-cycle del segnale di ingresso al filtro.
Per D=12% => Vout=0,58V D=48% => Vout=2,56V - D=100% => Vout=5,02V

na_PWM

http://www.mrscuole.net/anxapic/ 19

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il PIC 16F877

Generare segnali PWM

V=1,73 V

Un semplice esercizio: segnale pwm con duty-cycle del 35%. In uscita del Pin RC1 del controllore un filtro Passa Basso con fT di circa 19 Hz

na_PWM

http://www.mrscuole.net/anxapic/ 20

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il PIC 16F877

Generare segnali PWM

Applicare in ingresso al canale 0 dellADC del nostro pic 16F877 [pin RA0] una tensione variabile tra 0 V e 5V e generare un segnale PWM con duty cycle proporzionale al valore digitale corrispondente alla tensione in ingresso allADC, per V = 0 V duty cycle pari a 0 e per V = 5 V duty cycle pari al 100%. Il problema sicuramente di facile soluzione e non merita eccessivi chiarimenti! Si consiglia di rivedere gli appunti dei precedenti corsi per approfondimenti e chiarimenti specialmente sulluso dellADC del nostro uC (PIC16F877). Per facilitare la soluzione si propone un possibile flow-chart con relativo codice sorgente; si consiglia comunque, possibili soluzioni personalizzate

na_PWM

http://www.mrscuole.net/anxapic/ 21

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il PIC 16F877

Generare segnali PWM


Flow-Chart PWM

Applicare in ingresso al canale 0 dellADC del nostro pic 16F877 [pin RA0] una tensione variabile tra 0 V e 5V e generare un segnale PWM con duty cycle proporzionale al valore digitale corrispondente alla tensione in ingresso allADC, per V = 0 V duty cycle pari a 0 e per V = 5 V duty cycle pari al 100%.

Leggi e converti il valore analogico in ingresso Valore letto maggiore o minore dei valori limite impostati? Set duty sul relativo valore limite. Set il duty-cycle del segnale pwm con il valore impostato

na_PWM

http://www.mrscuole.net/anxapic/ 22

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il PIC 16F877

Generare segnali PWM


Codice sorgente - Descrizione-Set system

Applicare in ingresso al canale 0 dellADC del nostro pic 16F877 [pin RA0] una tensione variabile tra 0 V e 5V e generare un segnale PWM con duty cycle proporzionale al valore digitale corrispondente alla tensione in ingresso allADC, per V = 0 V duty cycle pari a 0 e per V = 5 V duty cycle pari al 100%.

Codice semplice, lineare, di facile comprensione

La variabile duty (conterr il valore del duty-cycle del segnale generato) a 8 bit

Il duty-cycle viene impostato con un valore a 8 bit (non necessario Casting)

Il valore di PR2=250 Frequenza del segnale PWM generato di 4 KHz (clock di sistema di 4 MHz)

na_PWM

http://www.mrscuole.net/anxapic/ 23

http://www.mrscuole.net/anxapic/

http://www.mrscuole.net/anxapic/

Il PIC 16F877

Generare segnali PWM


Codice sorgente - Leggi ADC Sep_pwm_duty

Applicare in ingresso al canale 0 dellADC del nostro pic 16F877 [pin RA0] una tensione variabile tra 0 V e 5V e generare un segnale PWM con duty cycle proporzionale al valore digitale corrispondente alla tensione in ingresso allADC, per V = 0 V duty cycle pari a 0 e per V = 5 V duty cycle pari al 100%.

In questa seconda parte di codice, viene letto il valore dellADC e impostato il duty-cycle del segnale pwm generato. Notiamo che in questo caso il valore di duty a 8 bit, il duty-cycle del segnale pwm viene impostato direttamente senza alcun casting.

na_PWM

http://www.mrscuole.net/anxapic/ 24

http://www.mrscuole.net/anxapic/

Potrebbero piacerti anche