na PWM.ppt [modalità compatibilità] -  · 2008-11-26 · Il CCS Pic-C compiler per impostare il...

24
na_PWM 1 Corso introduttivo sui microcontrollori PIC PWM Generare segnali PWM con il PIC16F877 Tecniche e consigli Nicola Amoroso [email protected] http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/ http://www.mrscuole.net/anxapic/

Transcript of na PWM.ppt [modalità compatibilità] -  · 2008-11-26 · Il CCS Pic-C compiler per impostare il...

na_PWM 1

Corso introduttivo sui microcontrollori PIC

PWMGenerare segnali PWM con il PIC16F877

Tecniche e consigli

Nicola [email protected]

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

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

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

na_PWM 2

uC Pic – PWM• Un segnale PWM (Pulse Width Modulation ovvero modulazione a

variazione della larghezza d'impulso) è un'onda quadra di duty-cyclevariabile che permette di controllare l'assorbimento (la potenzaassorbita) 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 dellafrequenza: T=1/f) ne segue che un duty cycle del 50% corrisponde ad un'onda quadra che assumevalore alto per il 50% del tempo, un duty cycle dell'80% corrisponde ad un'onda quadra che assumevalore alto per l'80% del tempo e basso per il restante 20%, un duty cycle del 100% corrisponde ad unsegnale sempre alto e un duty cycle dello 0% ad un segnale sempre basso (come vedremo anchequesti ultimi due casi non sono del tutto inutili).

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

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

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

na_PWM 3

Esistono due modi per generare segnali PWM con i Pic:

• Il primo (emulazione PWM software) consiste nello scrivere delcodice che generi un'onda quadra, di opportuna frequenza eduty cycle, assegnata su un certo piedino di uscita,

• Il secondo (PWM hardware) consiste nell'utilizzare delleperiferiche apposite dei PIC, i moduli CCP (capture comparePWM), per generare l'onda.

• Risulta ovvio che il secondo metodo è il migliore (con il primo lagenerazione dell'onda quadra può essere difficile e comunquetoglie preziosi cicli di clock al resto dell'applicazione) tuttavianon tutti i microcontrollori PIC sono dotati delle opportuneperiferiche hardware.

Il PIC 16F877 – Generare segnali PWMhttp://www.mrscuole.net/anxapic/

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

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

na_PWM 4

• Il PIC16F877 dispone di ben due moduli CCP (CCP1 e CCP2) peril PWM: tali moduli si appoggiano al timer 2 e sono quindivincolati ad avere la stessa frequenza mentre il duty cycle puòessere variato indipendentemente per ogni modulo andando ascrivere opportuni valori in appositi registri.

• I Pin RC2 (CCP1) e RC1 (CCP2) sono i piedini interessati perl’utilizzo di questi moduli.

• Per l’uso di un modulo CCP bisogna eseguire i seguentisteps:

1. Definire il periodo del segnale PWM generato andando a scrivere un opportuno valore nelregistro PR2 del PIC

2. Definire il modulo CCPx come modulo PWM

3. Abilitare il timer Tmr2 con opportuno prescaler

4. Definire il Duty cycle del segnale generato

Il PIC 16F877 – Generare segnali PWMhttp://www.mrscuole.net/anxapic/

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

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

na_PWM 5

Per generare questo segnale scelgo di utilizzare il modulo Hw CCP2 (Pin RC1del Pic 16f877) da impostare in modalità PWM. E’ importante definire questafase di impostazione in quanto [cfr.16f877 Microchip DataSheets] i moduli CCPxpossono funzionare in modalità capture, compare e pwm. Tralasciamo le primedue modalità di funzionamento (non interessano il nostro problema) e invececonsideriamo il modo pwm.

Per poter generare questo segnale dobbiamo conoscere il periodo (inverso dellafrequenza) 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 è l’inverso 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]

Il PIC 16F877 – Generare segnali PWMEs: Generare un segnale ad onda quadra TTL compatibile con frequenza di 10 KHz e Duty cycle del 50%

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

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

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

na_PWM 6

Per il nostro esempio si ha:Periodo PWM = 1/10.000 = 10 ms 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 l’abilitazione 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 l’interrupt non viene abilitato e questo valore lo mettiamo a 1

Il PIC 16F877 – Generare segnali PWMEs: Generare un segnale ad onda quadra TTL compatibile con frequenza di 10 KHz e Duty cicle del 50%

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

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

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

na_PWM 7

• - 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 vieneanalizzato alcun flow-chart.

Il PIC 16F877 – Generare segnali PWMEs: Generare un segnale ad onda quadra TTL compatibile con frequenza di 10 KHz e Duty cicle del 50%

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

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

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

na_PWM 8

Con il pic wizard del CCS PCWH impostiamo le modalità di funzionamento del nostro sistema

1. Impostazioni generali

Il PIC 16F877 – Generare segnali PWMEs: Generare un segnale ad onda quadra TTL compatibile con frequenza di 10 KHz e Duty cicle del 50%

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

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

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

na_PWM 9

2. Abilito il modulo CCP2 in modalità PWM [Sezione “Other” del CCS Pic Wizard]

Il PIC 16F877 – Generare segnali PWMEs: Generare un segnale ad onda quadra TTL compatibile con frequenza di 10 KHz e Duty cicle del 50%

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

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

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

na_PWM 10

Il PIC 16F877 – Generare segnali PWMEs: 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

L’overflow period di Timer2 viene impostato a 99

Il prescaler (Resolution) di Timer2 viene impostato a 1

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

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

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

na_PWM 11

4. Il codice generato dal Pic wizard

Il PIC 16F877 – Generare segnali PWMEs: Generare un segnale ad onda quadra TTL compatibile con frequenza di 10 KHz e Duty cicle del 50%

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

Set modulo CCP2 (pin RC1) inmodalita PWM. Segnale generatocon duty-cycle del 50%

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

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

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

na_PWM 12

4. Il codice generato dal Pic wizard [Nota]

Il PIC 16F877 – Generare segnali PWMEs: Generare un segnale ad onda quadra TTL compatibile con frequenza di 10 KHz e Duty cicle del 50%

Riprendiamo in considerazione quanto affermato in precedenza riguardo alle tre funzioni interne,

del CCS PCWH, che permettono di impostare l’uso 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%.

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

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

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

na_PWM 13

4. Il codice generato dal Pic wizard [Nota]

Il PIC 16F877 – Generare segnali PWMEs: Generare un segnale ad onda quadra TTL compatibile con frequenza di 10 KHz e Duty cicle del 50%

Set modulo CCP2 (pin RC1) inmodalita PWM. Segnale generatocon duty-cycle del 50%

Analizzando il codice generato con il CCS Pic wizard, si nota che il valore impostato per avere un duty-cycle del50% non è 49 (oppure 50) ma uguale a 200. In realtà un valore pari a 200 imposta perfettamente un duty-cycledel 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

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

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

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

na_PWM 14

4. Il codice generato dal Pic wizard [Nota]

Il PIC 16F877 – Generare segnali PWMEs: Generare un segnale ad onda quadra TTL compatibile con frequenza di 10 KHz e Duty cicle del 50%

Analizzando il codice generato con il CCS Pic wizard, si nota che il valore impostato per avere un duty-cycle del50% non è 49 (oppure 50) ma uguale a 200. In realtà un valore pari a 200 imposta perfettamente un duty-cycledel 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

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)

mentre i due bit più bassi vengono inseriti per una

eventuale [?] compatibilità con le versioni precedenti

del sistema di sviluppo.

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 inseritiCCS_PWM_PLUS_1 01 per i due bit inseritiCCS_PWM_PLUS_2 10 per i due bit inseritiCCS_PWM_PLUS_3 11 per i due bit inseriti

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

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

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

na_PWM 15

4. Il codice generato dal Pic wizard [Nota]

Il PIC 16F877 – Generare segnali PWMEs: Generare un segnale ad onda quadra TTL compatibile con frequenza di 10 KHz e Duty cicle del 50%

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

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

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

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

na_PWM 16

Il PIC 16F877 – Generare segnali PWMEs: Generare un segnale ad onda quadra TTL compatibile con frequenza di 10 KHz e Duty cicle del 50%

5. Il codice completo 6. Il segnale generato

Il pin RC1 collegato in ingresso a un oscilloscopio digitale

f = 10KHz

D = 50%

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

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

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

na_PWM 17

Esercizi (Con eventuali commenti)

• Generare un segnale ad onda quadra di frequenza f = 10KHz e Duty cicle D = 35%

• Generare un segnale ad onda quadra di frequenza f = 10KHz e Duty cicle D = 80 %

• Generare un segnale ad onda quadra di frequenza f = 6KHz e Duty cicle D = 60 %

Il PIC 16F877 – Generare segnali PWMhttp://www.mrscuole.net/anxapic/

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

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

na_PWM 18

VediamoVediamo oraora deidei semplicisemplici eserciziesercizi ii cui cui risultatirisultatipotrebberopotrebbero essereessere utiliutili in in seguitoseguito!!

In uscita del pin RC1 (CCP2-PWM) colleghiamo un filtro passa basso con

frequenza di taglio inferiore almeno allametà 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.

Il PIC 16F877 – Generare segnali PWMhttp://www.mrscuole.net/anxapic/

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

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

na_PWM 19

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

– Il valore Vout misurato con lo strumentoaumenta 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

R

C

RC1

GND GND

Il PIC 16F877 – Generare segnali PWMhttp://www.mrscuole.net/anxapic/

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

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

na_PWM 20

Il PIC 16F877 – Generare segnali PWM

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

V=1,73 V

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

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

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

na_PWM 21

Il PIC 16F877 – Generare segnali PWM

Il problema è sicuramente di facile soluzione e non merita eccessivi chiarimenti!

Si consiglia di rivedere gli appunti dei precedenti corsi perapprofondimenti e chiarimenti specialmente sull’uso dell’ADC del nostrouC (PIC16F877).

Per facilitare la soluzione si propone un possibile flow-chart con relativocodice sorgente; si consiglia comunque, possibili soluzionipersonalizzate

Applicare in ingresso al canale 0 dell’ADC del nostro pic 16F877[pin RA0] una tensione variabile tra 0 V e 5V e generare un segnalePWM con duty cycle proporzionale al valore digitalecorrispondente alla tensione in ingresso all’ADC, per V = 0 V dutycycle pari a 0 e per V = 5 V duty cycle pari al 100%.

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

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

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

na_PWM 22

Il PIC 16F877 – Generare segnali PWMApplicare in ingresso al canale 0 dell’ADC del nostro pic 16F877 [pin RA0] una tensione variabile tra 0 V e 5V e generare un segnale PWM con duty cycleproporzionale al valore digitale corrispondente alla tensione in ingresso all’ADC, per V = 0 V duty cycle pari a 0 e per V = 5 V duty cycle pari al 100%.

Flow-Chart PWM

Valore letto maggiore o minore dei valori limite impostati? Set duty sul relativo valore limite.

Leggi e converti il valore analogico in ingresso

Set il duty-cycle del segnale pwm con il valore impostato

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

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

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

na_PWM 23

Il PIC 16F877 – Generare segnali PWMApplicare in ingresso al canale 0 dell’ADC del nostro pic 16F877 [pin RA0] una tensione variabile tra 0 V e 5V e generare un segnale PWM con duty cycleproporzionale al valore digitale corrispondente alla tensione in ingresso all’ADC, per V = 0 V duty cycle pari a 0 e per V = 5 V duty cycle pari al 100%.

Codice sorgente - Descrizione-Set system

Codice semplice, lineare, di facile comprensione

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

Il valore di PR2=250 Frequenza del segnale PWM generato è di 4 KHz (clock di sistema di 4 MHz)Il duty-cycle viene impostato con un valore a 8

bit (non necessario Casting)

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

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

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

na_PWM 24

Il PIC 16F877 – Generare segnali PWMApplicare in ingresso al canale 0 dell’ADC del nostro pic 16F877 [pin RA0] una tensione variabile tra 0 V e 5V e generare un segnale PWM con duty cycleproporzionale al valore digitale corrispondente alla tensione in ingresso all’ADC, per V = 0 V duty cycle pari a 0 e per V = 5 V duty cycle pari al 100%.

Codice sorgente - Leggi ADC – Sep_pwm_duty

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

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

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

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