Il modulo CCP nei microcontrolori PIC

Il modulo CCP dei PICMicro® è davvero una miniera inesauribile di funzioni. Si tratta di un dispositivo integrato sui PICMicro, il cui interfacciamento con l’esterno è realizzato tramite il pin CCP. In questo articolo esamineremo le principali applicazioni pratiche in cui si possono sfruttare le tre modalità di questo modulo: Capture, Compare e PWM. Il CCP è utilizzato in generale per effettuare misure o per il controllo di dispositivi mediante segnali modulati PWM.

CHE COS’È IL MODULO CCP DEL PIC?

Il modulo è programmabile via software per operare in una delle tre seguenti modalità:

  1. Capture (input). Il contenuto del Timer1 viene trasferito in un apposito registro, quando in ingresso viene rilevato un fronte di salita o di discesa.
  2. Compare (output). Viene generato un interrupt oppure un variazione dello stato logico sul pin CCP, quando il Timer1 raggiunge un valore prefissato.
  3. PWM (output).  Genera un’onda quadra con frequenza e duty-cycle configurabili da programma. Consente in sostanza di eseguire la modulazione della larghezza dell’impulso

La Tabella 1 riassume tutti i registri che intervengono nella configurazione ed uso di questo modulo. Poiché alcuni modelli  di micro sono dotati  di due moduli CCP on-board, alcuni nomi di registro riportatono un ‘x’ per indicare indistintamente il modulo 1 o 2.

Tabella 1. Elenco dei registri usati per il modulo CCP

Tabella 1. Elenco dei registri usati per il modulo CCP

Si analizzerà  la struttura, il funzionamento, la configurazione ed i principali campi applicativi di ciascuna delle tre modalità  previste per il modulo CCP. Per il suo funzionamento è necessario usare le risorse riportate in Tabella 2.

Tabella 2. Risorsa richiesta dal CCP

Tabella 2. Risorsa richiesta dal CCP

Sia la modalità Capture che la Compare richiedono l’uso del Timer1 impostato come contatore sincrono (non è possibile il funzionamento se il Timer1 è configurato, invece, come contatore asincrono). La modalità PWM richiede, invece, l’ausilio del Timer2. Ciascuno del moduli opera indipendentemente dall’altro  e  contiene  un  registro  a  16bit  (CCPxL e CCPxH) che svolge funzioni diverse a seconda della modalità  impostata.  Inoltre,  per la configurazione esiste il registro ad CCPxCON di cui è specificato il nome di ogni bit ed il valore di default in Tabella 3. La descrizione dettagliata è riportata in Tabella 4.

Tabella 3. Nome dei bit del registro CCPxCON (R = lettura, W = scrittura, U = non implementato, -n = valore dopo il reset)

Tabella 3. Nome dei bit del registro CCPxCON (R = lettura, W = scrittura, U = non implementato, -n = valore dopo il reset)

 

Tabella 4. Registro CCPxCON

Tabella 4. Registro CCPxCON

IL MODULO CAPTURE

Funzionamento

In modalità Capture, il valore a 16bit  del Timer1 è trasferito nei registri CCPRxH:CCPRxL, quando si verifica un ben preciso evento sul pin CCP (configurato come ingresso). Gli eventi contemplati sono:

  • Ogni fronte di discesa sul pin CCP.
  • Ogni fronte di salita sul pin CCP.
  • Ogni 4 fronti di salita sul pin CCP.
  • Ogni 16 fronti di salita sul pin CCP.

La Figura 1 riporta lo schema a blocchi del modulo CCP nel caso in cui esso sia configurato in modalità Capture. I bit di controllo CCPxM3:CCPxM0, riportati in Tabella 5, permettono la selezione della modalità operativa.

Tabella 5. Configurazione Capture

Tabella 5. Configurazione Capture

Quando un evento di cattura si verifica, il bit di interrupt CCPxIF (PIRx<2>) è portato al valore logico “1” e provoca l’esecuzione della relativa routine di gestione. È compito di tale routine riportare tale bit a zero. È   importante  far  notare  che  i  registri  CCPRxH e CCPRxL  sono di  tipo  single level buffered, ossia è necessario salvarne il contenuto prima che il successivo evento di capture si verifichi. In caso contrario si perderà il vecchio valore. In questa modalità il pin CCPx deve essere configurato come ingresso e quindi il relativo bit del registro TRISx deve essere impostato ad 1. Se si imposta il pin come uscita, una operazione di scrittura su di esso provocherà una chiamata involontaria dell’interrupt. Quando  si modifica  la modalità  di  esecuzione del modulo CCP, portandola su Capture, può essere generato un falso interrupt.  Per evitare questo problema bisogna tenere il bit CCPxIE a 0, disabilitando in tal modo l’interrupt. Inoltre, è necessario portare a 0 il bit CCPxIF prima di ogni operazione con il modulo Capture. La presenza del blocco Prescaler, riportato in Figura 1, permette di incrementare il numero di fronti contati prima di far scattare l’evento di interrupt.

Figura 1. Schema a blocchi del modulo Capture

Figura 1. Schema a blocchi del modulo Capture

Ci sono 4 possibili configurazioni di prescaler, specificate tramite i bit  CCPxM3:CCPxM0. Esse  sono visibili in Figura 2, in cui le frecce blu indicano gli istanti in cui il modulo rileva l’evento e genera la chiamata all’interrupt.

Figura 2. Utilizzo della funzione prescaler

Figura 2. Utilizzo della funzione prescaler

Il passaggio da una condizione di prescaler all’altra può generare una chiamata indesiderata all’interrupt. In questo caso è consigliabile disattivare prima il modulo. Nel listato 1 è mostrata la tecnica consigliata per cambiare la condizione di prescaler, in linguaggio assembler.

CLRF CCP1CON             ;disattiva il modulo CCP
MOVLW NEW_CAPT_PS        ;carica il registro W con il nuova valore di prescaler
ed attiva il CCP
MOVWF CCP1CON            ;carica CCP1CON con il valore di W
Listato 1

Quando e come usare la modalità Capture?

Il tipico utilizzo della funzione Capture è la misura del tempo che separa due eventi. Come già ricordato un evento è, in generale, caratterizzato da una variazione  del   segnale  di   ingresso  (fronte   di salita/discesa). Un tipico campo applicativo è la lettura di un accelerometro. Si tratta di uno strumento in grado di rilevare l’accelerazione di un oggetto. Negli ultimi anni l’importanza di questi sensori è cresciuta sempre più, diffondendosi oltre che in campo scientifico e spaziale, anche in  molti  settori  civili come automotive, testing e analisi meccanica. Un’altra applicazione in cui risulta molto utile disporre di un CCP in modalità Capture è la misura della velocità di rotazione RPM (Revolutions Per Minute) di un oggetto. Essa può essere stimata tramite l’uso di  un  sensore ottico  oppure  ad  effetto Hall. Nel primo  caso si rileva la presenza di una sorgente di luce (generalmente all’infrarosso) attraverso una ruota dentata montata sull’organo rotante. Un meccanismo simile è sfruttato nei mouse con la rotellina per lo scroll. Un metodo alternativo consiste nello fruttare l’effetto Hall: il passaggio di magneti  permanenti,  fissati sull’organo rotante, in corrispondenza del sensore creano una differenza di tensione proporzionale alla velocità. Un esempio è rappresentato dai tachimetri elettronici utilizzati per le biciclette. In entrambi  i  casi si ottiene  un’onda  quadra con impulsi proporzionali alla velocità di rotazione. L’aumento della velocità provoca una riduzione sia del periodo che del duty-cycle. La misura della velocità  può,  dunque,  essere effettuata  sia tramite  il periodo che tramite il duty-cycle. Tuttavia, per ottenere la massima risoluzione è consigliabile effettuare tale misura direttamente sul periodo. Esiste la possibilità di misurare sia il singolo periodo che la media di un certo numero di forme d’onda. Il secondo metodo è più efficiente per due motivi:

  • Si evitano un gran numero di interruzioni prodotte dal modulo CCP.
  • Si elimina eventuale rumore che può “sporcare” il segnale da misurare.

Le misure descritte fino a questo punto sono basate su segnali di ingresso digitali. La modalità Capture è in grado di effettuare, anche, stime del periodo di segnali analogici. Il concetto consiste nel trasformare tale segnale in uno digitale, tramite un comparatore. La Figura 3 mostra un possibile schema di principio. Tale schema può essere implementato interamente con un PIC, senza l’uso di componenti  esterni. Basta usare un micro con il comparatore integrato, come il modello PIC16F684.

Figura 3. Misura del periodo di un segnale analogico

Figura 3. Misura del periodo di un segnale analogico

Le forme d’onda risultanti sono mostrate in Figura 4.

Figura 4. Forme d’onda per la misura un segnale analogico

Figura 4. Forme d’onda per la misura un segnale analogico

All’ingresso del modulo  CCP si ottiene un onda quadra, il cui valore logico è “1” se il segnale analogico supera il livello di soglia. A questo punto non resta che misurare il tempo tra due fronti consecutivi di salita per ottenere il periodo del segnale. È  anche possibile impiegare la tecnica precedente per effettuare una misura mediata. Una applicazione molto utile da implementare nei sistemi che usano la comunicazione seriale asincrona è il cosiddetto autobaud della RS-232. La comunicazione seriale può avvenire a diverse velocità e sarebbe utile che il micro adattasse la sua velocità automaticamente, misurandola tramite una carattere di test. Per realizzare questo, il modulo CCP può essere configurato in modalità Capture per rilevare la velocità della trasmissione. Per la fase iniziale di decisione è necessario un carattere di calibrazione, su cui effettuare la misura. Il carattere scelto, Figura  5,   può   essere ‘b00000000’.

Figura 5. Carattere di calibrazione per l’autobaud della RS232

Figura 5. Carattere di calibrazione per l’autobaud della RS232

Il listato 2 mostra, in linguaggio  assembler, un esempio di configurazione del PIC in modalità capture.

; ***INIZIALIZZAZIONE Capture Mode
CLRF CCP1CON    ; Modulo CCP spento
CLRF TMR1H            ; Azzeramento Timer1, High byte
CLRF TMR1L            ; Azzeramento Timer1, Low byte
CLRF INTCON           ; Disabilitazione interrupts e azzeramento T0IF
BSF STATUS, RP0       ; Bank1
BSF TRISC, CCP1       ; Pin CCP impostato come ingresso
CLRF PIE1             ; Disabilitazione interrupt
BCF STATUS, RP0       ; Bank0
CLRF PIR1             ; Azzeramento Flags interrupts
MOVLW 0x06            ; Modalità Capture, ogni 4 fronti di salita
MOVWF CCP1CON ;
BSF T1CON, TMR1ON     ; Timer1 inizia il conteggio
;
; Interrupt del CCP è disabilitato,
; bisogna eseguire il polling sul flag dell’interrupt;
;
Evento_Capture
BTFSS PIR1, CCP1IF
GOTO Evento_Capture
;
; evento capture si è verificato
;
BCF PIR1, CCP1IF ; Questa istruzione deve essere eseguita prima del successivo
evento di capture
Listato 2

IL MODULO COMPARE

Funzionamento

In modalità Compare, il valore del registro a 16bit  CCPRx è costantemente  confrontato con il registro TMR1. Quando i due valori risultato  uguali,  sul pin  CCPx (configurato come uscita) si verifica uno dei seguenti eventi (in base ai valori configurati nel registro di controllo):

  1. La linea è portata al valore “1”.
  2. La linea è portata al valore “0”.
  3. La linea rimane invariata, scatta l’interrupt.
  4. La linea rimane invariata, scatta un evento speciale.

Contemporaneamente a tale evento il micro genera un interrupt. La Figura 6 mostra lo schema a blocchi del modulo CCP in modalità Compare.

Figura 6. Schema a blocchi del modulo Compare

Figura 6. Schema a blocchi del modulo Compare

Per selezione una delle suddette configurazioni bisogna impostare i bit del registro CCPxCON secondo quanto riportato in Tabella 6.

Tabella 6. Configurazione Compare

Tabella 6. Configurazione Compare

In questo caso il pin CCPx deve essere configurato  come uscita, mediante il relativo bit del registro TRISx. Impostando i bit CCPxM3:M0 al valore binario 1011 si seleziona la modalità special event che consente di avviare una determinata azione a seconda del modulo CCP. Lo special event per il modulo CCP1 azzera il registro TMR1. Invece, lo special event del modulo  CCP2 azzera il registro del Timer1 e avvia una conversione A/D nel caso in cui quest’ultimo sia abilitato. Solo per il PIC16C72, tale evento è presente anche sul modulo CCP1.

Quando e come usare la modalità Compare?

Questa modalità è utile in tutti  i casi in cui si vuole generare un’azione ad intervalli ben precisi. Apparentemente, la stessa funzione si potrebbe realizzare con un timer  configurato  come stopwatch.  In questo caso, però, sarebbe necessario caricare il timer ogni volta. Inoltre, la modalità compare altera automaticamente lo stato del pin CCPx e soprattutto permette di ottenere intervalli temporali più precisi. Si supponga di  dover controllare  un  display LCD mediante un PIC16F684, la cui frequenza di clock è 8MHz. Si supponga inoltre  di  dover aggiornare il display 5 volte al secondo (ogni 0.2s). Se si utilizzasse l’overflow  del Timer1 ed un valore di prescaler pari  ad 8  si otterrebbe  un interrupt ogni TOSC· 4· 65536·8 = 0.25s. La formula da utilizzare per impostare correttamente il CCP è di seguito riportata:

CCPR1 = Intervallo temporale/  (TOSC·4·presaler) = =0.2 / (125ns·4·8) = 5000 = 0xC350 (1) Quindi si scriverà 0x50 nel registro CCPR1L e 0xC3 nel registro CCPR1H. Infine, bisogna configurare il modulo in modalità Special Event e scrivere nel registro CCP1CON il valore ‘b00001011’. In questo caso, però, oltre alla generazione dell’interrupt sarà avviata la conversione A/D; se tale funzione non è desiderata allora  bisogna  scrivere  il   valore  CCP1CON  = ‘b00001010’.  In tal caso il Timer1 deve essere azzerato da programma. Un altro possibile impiego è la generazione del tick rate nei sistemi RTOS.  Infatti,  un  Real Time Operative System richiede un interrupt  periodico, che è la base per effettuare lo scheduling dei vari task. La generazione di  un  segnale periodico  di interrupt  può essere utilmente  sfruttato nella conversione A/D. Impostando la modalità special event è possibile avviare la conversione da parte dell’ADC. Prendendo sempre come riferimento il PIC16F684 (frequenza 8MHz), si supponga di voler effettuare la lettura in sequenza dei segnali analogici ai pin AN0, AN1 e AN2 ad intervalli di 30ms. I passi da seguire sono:

  1. Impostare il prescaler del Timer1 ad 1, in modo da ottenere un overflow ogni 32.8ms.
  2. Impostare CCPR1 = 0.030 / (125ns · 4 · 1) = 6000 = 0xEA60.
  3. Impostare  CCP1CON al  valore  ‘b00001011’.
  4. Ogni volta che è generato l’interrupt CCP, modificare il canale successivo dell’ADC nel registro ADCON0.

Il listato 3 mostra, in linguaggio assembler, un esempio di configurazione del PIC in modalità compare.

;**** Inizializzazione Compare Mode
CLRF CCP1CON    ; Modulo CCP spento
CLRF TMR1H           ; Azzeramento Timer1, High byte
CLRF TMR1L           ; Azzeramento Timer1, Low byte
CLRF INTCON          ; Disabilitazione interrupt e azzeramento T0IF
BSF STATUS, RP0      ; Bank1
BCF TRISC, CCP1      ; Pin CCP output
CLRF PIE1            ; Disabilitazione interrupt periferiche
BCF STATUS, RP0      ; Bank0
CLRF PIR1            ; Azzeramento flags degli interrupt
MOVLW 0x08           ; Modalità Compare, pin CCP1 portato ad 1 sul compare
MOVWF CCP1CON ;
BSF T1CON, TMR1ON    ; Avvio Timer1
;
; Interrupt del CCP1 è disabilitato,
; effettuare il polling sul bit CCP1IF
;
Evento_compare
BTFSS PIR1, CCP1IF
GOTO Evento_compare
;
; Compare si è verificato
;
BCF PIR1, CCP1IF ; Eseguire questa operazione prima di effettuare un nuovo compare
Listato 3

IL MODULO PWM

Funzionamento

L’uscita del Pulse Width Modulation è un segnale digitale periodico, che rimane al valore alto per una certa frazione del suo periodo. Il rapporto tra questo tempo (W) ed il periodo  (T)  prende  il  nome  di  duty-cycle. Si definisce risoluzione del PWM la precisione con cui il duty-cycle può essere variato. La Figura 7 riporta lo schema a blocchi di tale modulo.

Figura 7. Schema a blocchi del modulo PWM

Figura 7. Schema a blocchi del modulo PWM

A differenza del Compare e  del  Capture,  il  PWM utilizza il Timer2. Il periodo è specificato scrivendo il registro PR2. La formula da utilizzare è la seguente:

Dove  FOSC è  la  frequenza  del  clock  principale, Prescale  il valore utilizzato per il Timer2, FPWM il periodo da impostare per il PWM. Quindi l’unica incognita  nella formula è il valore del registro PR2. Quando  il  Timer2  è uguale  a PR2 si verificano  i seguenti tre eventi:

  1. Il registro TMR2 è azzerato.
  2. Il pin CCP è portato al valore logico “1” (costituisce eccezione il caso in cui il duty-cycle è impostato a 0%).
  3. Il valore del duty-cycle è caricato da CCPR1L in CCPR1H.

Il valore del duty-cycle è impostato tramite il registro CCPR1L ed i bit CCP1CON<5:4>. Quindi è possibile una risoluzione massima di 10bit. La risoluzione del PWM (numero di bit), in corrispondenza di una ben precisa frequenza, è data dalla formula:

Il registro CCPR1L contiene gli 8bit più significativi, mentre i bit  CCP1CON<5:4> sono i meno significativi. È interessante notare che in modalità PWM, il registro CCPR1H è di sola lettura e funge da latch per il valore del  duty-cycle.  Quando  il  valore del  Timer2  e di CCPR1H coincidono, allora il pin CCP è portato  al valore logico “0”. Ad esempio, se si vuole ottenere una frequenza
FPWM = 78.125kHz, con una FOSC = 20MHz ed un prescaler 1, allora si scrivere nel registro PR2 il seguente valore: 1/78.125kHz = [(PR2) +1] · 4 ·1/20MHz · 1; 12.8µs = [(PR2) + 1] · 4 · 50ns · 1; PR2 = 63.

Il numero di bit da utilizzare per il duty-cycle si ricava con la relativa formula:

In questo esempio, dunque, non si possono utilizzare più di 8bit, ossia 0 g CCPR1L:CCP1CON<5:4> g 255. Qualunque valore superiore a 255 provocherebbe un duty-cycle del 100%. Un duty-cycle pari a 25%, ad esempio, si avrà scrivendo il valore 255 · 25% = 63 = = 0x3F. Per ottenere risoluzioni più alte è necessario ridurre la frequenza del PWM. La Tabella 7 riporta alcuni esempi di frequenza e risoluzione del PWM con un quarzo di 20MHz.

Tabella 7. Esempi di frequenze e risoluzione PWM

Tabella 7. Esempi di frequenze e risoluzione PWM

Quando e come usare la modalità PWM?

Il PWM è ampiamente utilizzato nel controllo dei motori BDC (Brushed DC) grazie alla elevata efficienza del pilotaggio switching rispetto a quello lineare. Il metodo  tradizionale (lineare) prevede, infatti,  di inserire una resistenza variabile in serie al motore, per variarne la velocità. Lo schema di funzionamento di un motore a due poli è mostrato in Figura 8.

Figura 8. Schema di un motore BDC

Figura 8. Schema di un motore BDC

Aumentando il valore del duty-cycle si aumenta proporzionalmente la potenza fornita al carico e quindi la sua velocità. La frequenza usata è un parametro critico. Infatti, la sensibilità del motore alle variazioni del duty-cycle aumenta con la frequenza. Come al solito si deve trovare un compromesso poiché frequenze elevate comportano  maggiori correnti e quindi consumi più alti. Un altro problema da considerare è il suono generato dal motore, quando questo è pilotato con frequenze nel range audio (20Hz ÷ 4kHz). Per questo motivo  è consigliabile pilotare il motore  con  frequenze superiori a tale banda. Lo schema elettrico per il controllo di un motore mediante un PWM è mostrato in Figura 9.

Figura 9. Schema di controllo di un motore BDC

Figura 9. Schema di controllo di un motore BDC

Il FET utilizzato nello schema serve per fornire la corrente richiesta dal motore, che il pin CCP non riuscirebbe a dare. Poiché un motore presenta sempre un carico induttivo,  tramite il diodo posto in parallelo si eliminano eventuali effetti fly-back. Il micro utilizzato in Figura 9 è il PIC16F628, con una frequenza di 20MHz. Si supponga di voler utilizzare una frequenza del PWM pari a 20kHz ed un duty-cycle del 50%. I passi da seguire sono i seguenti:

  1. Utilizzare un prescaler 1 per il Timer2.
  2. Scrivere il valore FOSC / (FPWM · 4 · prescaler)- -1 = 249 nel registro PR2 (formula 2).
  3. Il numero di bit da usare per il duty-cycle è pari a 10 (formula 3).
  4. Il massimo valore possibile per il duty-cycle (100%) è 0x3FF. Se si vuole un valore pari al 50% si deve dividere per 2 e quindi 0x1FF. Gli 8 MSB devono essere scritti nel registro CCPR1L, mentre i 2 LSB  saranno scritti in CCP1CON<5:4>. In definitiva, si avrà CCPR1L = 0x7F e CCP1CON<5:4> = 3.
  5. Scrivere in CCP1CON il valore ‘b00111100’.

Il modulo PWM può essere utilizzato come un economico convertitore Digitale/Analogico, con l’aggiunta di pochi componenti  esterni. Esiste un  gran  numero  di  applicazioni  per microcontrollori  che necessitano di una uscita analogica, senza però  richiedere elevate risoluzioni. In tutti  questi casi il PWM può essere utilmente impiegato. La conversione  di un segnale digitale (PWM) in analogico richiede l’uso di un filtro analogico passa-basso. Per comprendere l’utilità di tale filtro è utile analizzare il tipico spettro di un segnale PWM (Figura 10).

Figura 10. Spettro di un segnale PWM

Figura 10. Spettro di un segnale PWM

Oltre  al segnale in  banda base, si nota  la presenza della componente spettrale a frequenza FPWM = 1/T  e delle altre armoniche posizionate a multipli interi K/T. Tali componenti  sono, ai fini  del  segnale analogico, rumore indesiderato e devono essere eliminate.  Ecco spiegata la necessità del  filtro passa-basso. In generale, deve essere FPWM> FBW (FBW è la banda del segnale analogico). In realtà, se si sceglie FPWM = FBW sarebbe richiesto un  filtro  ideale per  estrarre il  segnale in banda base. Ovviamente, questo non è realizzabile nella realtà. Perciò, quello  che si cerca di ottenere, nella pratica, è FBW  << FPWM oppure FPWM= K · FBW (con K >> 1). Quanto più si vuole attenuare la frequenza FPWM, tanto più grande dovrà essere K. Ad esempio, si voglia progettare un filtro RC per ottenere in uscita al modulo  CCP un segnale analogico con banda 4kHz (Figura 11).

Figura 11. Filtro RC in uscita al modulo CCP

Figura 11. Filtro RC in uscita al modulo CCP

Si sceglie K pari a 5. Allora sarà FPWM   = 4kHz · 5 = =20kHz. Scegliendo la frequenza di taglio (-3dB) del filtro  pari a 4kHz ed utilizzando la relazione RC = =1/(2·π·f),  si ottiene R = 4ko  ponendo C = 0.01µF. Poiché la frequenza del PWM è stata scelta a 20kHz, allora la reiezione dell’armonica fondamentale sarà pari a:

Per molte applicazioni una attenuazione di 14dB risulta insufficiente. Quindi, al posto di un semplice filtro RC, è necessario un  filtro  con  ordine  superiore al primo.  Oppure,  se il micro  lo permette  è possibile aumentare la FPWM. Ad esempio, usando il PIC17C42 si può arrivare ad una frequenza di 62.5kHz. L’attenuazione in questo caso è pari a -24dB. Le possibili applicazioni di un PWM non si esauriscono qui. Un’altra possibilità di impiego è la variazione dell’intensità luminosa dei LED o altre sorgenti luminose. Modulando  il  segnale sul LED, si varia la corrente media che lo attraversa e quindi la sua intensità luminosa. In questi casi è necessario usare una frequenza FPWM superiore a 100Hz per evitare eccessivo flicker. Il pulse width modulation gioca un ruolo chiave anche nel progetto di alimentatori di tipo boost, che consentono cioè di incrementare la tensione di alimentazione La Figura 18 mostra il tipico schema elettrico in cui è possibile impiegare un PWM per incrementare la tensione di alimentazione.   Durante il livello alto del segnale sul CCP, il transistor Q1 porta a massa l’induttanza L1. Questo causa un incremento della corrente in L1. Quando il segnale passa al valore basso, l’energia immagazzinata in L1 viene trasferita su C2 e sul carico, tramite  D1. La tensione di  uscita (VOUT) e quella di ingresso (VIN) sono legati dalla relazione:

Dove D è il duty-cycle. Il valore dell’induttanza L1 è scelto in base alla massima corrente (IOUT) richiesta dal carico, secondo la relazione:

Dove T è il periodo del PWM. Lo schema di Figura 18 prevede anche un percorso di retroazione per stabilizzare la tensione ed evitare fluttuazioni della tensione sul carico. La tensione sul carico, opportunamente partizionata, è inviata ad un ingresso analogico del PIC, dal quale può essere misurata.  Se la tensione è troppo alta si ridurrà il duty-cycle. In caso contrario il valore di D verrà aumentato. In questo modo la tensione di uscita rimane stabilizzata. Il listato 4 riporta un esempio di configurazione del modulo PWM, in linguaggio assembler.

;*** inizializzazione PWM Mode
CLRF CCP1CON          ; Modulo CCP spento
CLRF TMR2             ; Azzeramento Timer2
MOVLW 0x7F            ;
MOVWF PR2             ; Periodo 64Ìs con FOSC=8MHz
MOVLW 0x1F            ;
MOVWF CCPR1L          ; Duty Cycle è il 25% del periodo
CLRF INTCON           ; Disabilitazione interrupt e azzeramento T0IF
BSF STATUS, RP0       ; Bank1
BCF TRISC, PWM1       ; Make pin output
CLRF PIE1             ;
BCF STATUS, RP0       ; Bank0
CLRF PIR1             ; Azzeramento flags dell’interrupt
MOVLW 0x2C            ; Modalità PWM, 2 LSBs del Duty cycle = 10
MOVWF CCP1CON ;
BSF T2CON, TMR2ON     ; Avvio Timer2
;
; L’interrupt del CCP1 è disabilitato,
; eseguire il polling sul flag TMR2
;
PWM_Period_Match
BTFSS PIR1, TMR2IF
GOTO PWM_Period_Match
;
;
;
BCF PIR1, TMR2IF
Listato 4

 

 

STAMPA     Tags:, , ,

Una risposta

  1. Maurizio Di Paolo Emilio Maurizio Di Paolo Emilio 7 gennaio 2017

Scrivi un commento

ESPertino è la nuova scheda per IoT compatibile ARDUINO.
Scopri come averla GRATIS!