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à:
- Capture (input). Il contenuto del Timer1 viene trasferito in un apposito registro, quando in ingresso viene rilevato un fronte di salita o di discesa.
- Compare (output). Viene generato un interrupt oppure un variazione dello stato logico sul pin CCP, quando il Timer1 raggiunge un valore prefissato.
- 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.
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.
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.
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.
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.
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.
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.
Le forme d’onda risultanti sono mostrate in Figura 4.
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’.
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):
- La linea è portata al valore “1”.
- La linea è portata al valore “0”.
- La linea rimane invariata, scatta l’interrupt.
- 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.
Per selezione una delle suddette configurazioni bisogna impostare i bit del registro CCPxCON secondo quanto riportato in Tabella 6.
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:
- Impostare il prescaler del Timer1 ad 1, in modo da ottenere un overflow ogni 32.8ms.
- Impostare CCPR1 = 0.030 / (125ns · 4 · 1) = 6000 = 0xEA60.
- Impostare CCP1CON al valore ‘b00001011’.
- 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.
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:
- Il registro TMR2 è azzerato.
- Il pin CCP è portato al valore logico “1” (costituisce eccezione il caso in cui il duty-cycle è impostato a 0%).
- 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.
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.
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.
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:
- Utilizzare un prescaler 1 per il Timer2.
- Scrivere il valore FOSC / (FPWM · 4 · prescaler)- -1 = 249 nel registro PR2 (formula 2).
- Il numero di bit da usare per il duty-cycle è pari a 10 (formula 3).
- 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.
- 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).
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).
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 |
Dai primi pic fino a quelli attuali, la microchip ha visto diffondere molte funzionalita’ tanto da farli diventare i principali mcu utilizzati in vari mercati. L’acquisizione dell’atmel di tempo fa e’ anche una dimostrazione…
Ciao ottima spiegazione manca un’info fondamentale per chi sta cercando di imparare ovvero come deve essere settato il timer in base al segnale