Autocalibrazione del clock su PIC12F6xx

Le moderne esigenze di riduzione degli spazi e di riduzione dei costi delle apparecchiature, portano molti progettisti a scegliere microcontrollori dotati di clock interno. Spesso questo clock, per vari motivi, deve anche essere di una certa precisione: ecco alcuni consigli su come ottimizzare la calibrazione del clock interno in un dispositivo PIC12F6xx.

Nelle moderne applicazioni, i progettisti richiedono una sempre maggior integrazione dei dispositivi a semiconduttori, per soddisfare le richieste del mercato di dispositivi finali sempre più compatti ed economici. Un passaggio molto importante degli ultimi anni è stata l’integrazione a bordo dei microcontrollori dei dispositivi di generazione del timing, ossia dei quarzi o degli oscillatori. Microchip è stata fra le primissime aziende produttrici di microcontrollori  a recepire questa esigenza e ad integrare nei propri microcontrollori ad 8 e 16 bit dispositivi di timing. In questo articolo verrà preso in esame il dispositivo PIC12F683, al fine di capire le possibilità offerte dall’oscillatore interno e la massima precisione ottenibile attraverso la procedura di autocalibrazione.

L’oscillatore del PIC12F683

Il dispositivo ad 8 bit e 8 pin PIC12F683 è dotato di due oscillatori interni, selezionabili via software. Il primo lavora ad una frequenza di 8MHz, mentre il secondo lavora ad una frequenza di 32KHz. Attraverso il registro OSCCON è possibile selezionare quale frequenza costituirà  il vero e proprio clock di sistema, dal momento che è possibile utilizzare un prescaler dedicato per dividere il riferimento  ad 8MHz per ottenere le frequenze di 4 MHz, 2 MHz, 1 MHz, 500 KHZ, 250 KHz e 125 KHz, come si può vedere in figura 1.

Figura 1. Struttura del clock di sistema nel PIC12F683

Figura 1. Struttura del clock di sistema nel PIC12F683

Il registro OSCCON, infatti, è costituito da alcuni importanti bit necessari al settaggio e al trimmeraggio del clock di sistema, in particolare, i due bit IRCF1 e IRCF2 consentono di selezionare la frequenza di lavoro fra le varie citate in precedenza. Il bit OSTS consente invece di selezionare fra la fonte di clock esterna oppure interna. Tramite i bits HTS e LTS è possibile definire se la sorgente di clock interno è stabile, mentre tramite il bit SCS si può definire se la sorgente di clock interna è utilizzata come clock di sistema oppure come semplice sorgente di funzione temporale. In tabella 1 si può osservare lo schema di questo registro tratto dal Data Sheet del dispositivo in esame. Per quanto riguarda la precisione delle sorgenti di clock interno, l’oscillatore HFOSC opera appunto ad 8 MHz e viene calibrato internamente in fabbrica da Microchip,  mentre invece il LFOSC opera a 32KHz e non viene calibrato in fase di produzione del microcontrollore, dal momento che chi intende utilizzare una fonte di tempo stabile può fare uso della sorgente ad alta frequenza eventualmente abbinata al prescaler. Qualora la precisione fornita dal costruttore non sia però sufficiente, oppure qualora si desideri ricalibrare il clock per centrare la campana gaussiana che ne descrive la precisione attorno ad una temperatura diversa da quella di calibrazione (+25°C), si può lavorare con il registro OSCTUNE. Questo registro, al momento della produzione del dispositivo,  assume il valore binario 00000, da considerare come frequenza centrale di lavoro, ma può appunto essere modificato da un valore minimo di 10000 ad un valore massimo di 01111. Chiaramente questi valori vanno considerati in aritmetica binaria secondo la logica del “complemento ad uno”, per cui il primo bit assume il significato di segno (0 per il positivo ed 1 per il negativo) mentre i restanti valori devono essere complementati nel caso in cui il valore sia negativo. Il risultato che si ottiene è quello di poter calibrare ben 32 livelli diversi di frequenza di lavoro attorno a quella ricavata in fase di trimmeraggio di fabbrica. In tabella 2 la porzione di Data Sheet in cui si riportano i possibili settaggi del registro OSCTUNE.

Tabella 1. Il registro OSCCON

Tabella 1. Il registro OSCCON

Tabella 2. Il registro OSCTUNE

Tabella 2. Il registro OSCTUNE

Stabilità dell’oscillatore

Le prestazioni delll’oscillatore interno, anche a seguito di eventuali trimmeraggi effettuati operando sul registro OSCTUNE, sono comunque legate a molteplici fattori, quali la tensione di lavoro e la temperatura. Ad esempio, la precisione di + -1% è garantibile solamente quando l’oscillatore  lavora ad una tensione di 3.5 Volt e ad una temperatura di 25°C. Oltre questi valori, la precisione decade al 2%, portandosi infine al 5% in condizioni operative come  temperature  sotto  lo  0°C  e  superiori  a +85°C. In figura 2 una utilissima tabella per individuare la precisione dell’oscillatore interno in funzione della tensione e della temperatura.

Figura 2. Tabella tensione-temperatura per la precsione dell’oscillatore interno

Figura 2. Tabella tensione-temperatura per la precsione dell’oscillatore interno

PROCEDURA DI AUTOCALIBRAZIONE NEL PIC12F6XX

Utilità nella autocalibrazione dell’oscillatore

Come  visto  nel  precedente  paragrafo,  vi  sono molte possibilità di settaggio e di tuning dell’oscillatore interno, a volte anche difficili da ottenere, se si pensa di avere una grande serie di oggetti da produrre e quindi un gran numero di settaggi per calibrare ogni singolo oscillatore. Microchip stessa, attraverso la Application Note AN250, fornisce alcune utili indicazioni per far si che l’oscillatore possa essere autocalibrato, durante la procedura di programmazione-collaudo. Tale procedura, evidentemente, costituisce un enorme vantaggio in termini di tempo risparmiato e di efficienza di lavoro. Si pensi  ad  esempio  al  caso  in  cui  si abbia una applicazione a batteria, in cui la tensione di lavoro varia al variare della carica residua della batteria. In un tal  caso,  si ha un degrado  della calibrazione dell’oscillatore, dovuta ad uno spostamento verso sinistra nelle ascisse del grafico di figura 3.

Figura 3. Circuito di test per la autocalibrazione

Figura 3. Circuito di test per la autocalibrazione

Si pensi anche ad una applicazione elettronica installata all’aperto, per cui la board in cui è utilizzato il microcontrollore può operare a temperature anche molto diverse fra loro. Per questi motivi dunque una procedura in grado di autoadattare la calibrazione del microcontrollore risulta davvero essenziale ed estremamente utile. L’apparecchiatura di test può essere schematizzata come in figura 3.

Procedura di autocalibrazione

Prendendo ad esempio il circuito di figura 3, la autocalibrazione avviene come di seguito. Innanzitutto, allo startup, si verifica se la procedura di autocalibrazione era già avvenuta in precedenza, andando a verificare una opportuna locazione in EEPROM. Qualora la procedura non fosse mai avvenuta, si andrà a monitorare una sorgente di onda quadra con Duty Cycle pari al 50% (al pin 7 in figura 3). Se il conteggio che avviene internamente al microcontrollore porta un risultato inferiore a quello stimato, significa che il microcontrollore sta andando “troppo veloce”, ragion per cui si andrà a decrementare il valore contenuto nel registro OSCCAL, viceversa tale valore sarà aumentato nel caso in cui i conteggi siano troppo elevati. Tale procedura può essere meglio compresa osservando l’algoritmo di figura 4.

Figura 4. Algoritmo di autocalibrazione

Figura 4. Algoritmo di autocalibrazione

Tramite questo semplice ma efficace algoritmo, sarà possibile avere ad ogni istante una calibrazione efficace del proprio oscillatore, a patto di avere una fonte a 5KHz stabile che funzioni da frequenza campione.

;*****************************************
;Calibrate() - Measures A Period From The
;Input(GP0) Reference Signal
;- Updates Osccal Value and Updates E^2
CALIBRATE
movlw CALIBRATIONTIME
movwf COUNTER ;Calibration Counter
LOW0
btfsc INPUT0
goto LOW0
HIGH1
btfss INPUT0
goto HIGH1
clrf TMR0 ;Start Timer
LOW1
btfsc INPUT0
goto LOW1
HIGH2
btfss INPUT0
goto HIGH2
movf TMR0,W ;Stop Timer
addlw .2
call CHECKPERIOD
LOW2
btfsc INPUT0
goto LOW2
decfsz COUNTER,F
goto HIGH1
call UPDATE_EE
;*****************************************
;Update_EE - This routine Updates
;Calibration Flag & Calibration Value
UPDATE_EE
BANKSEL EEDATA ;BANK1
movlw 0x5A ;Update Calibration Flag
movwf EEDATA
movlw CALFLAGADR
call EEWRITE
movf OSCCAL,W
movwf EEDATA
movlw CALVALADR
call EEWRITE
BANKSEL GPIO ;BANK0
return
;*****************************************
;CheckPeriod(W) - This routine computes
;the difference between the
;REFERENCEPERIOD and MEASUREDPERIOD
;(contained in W)
CHECKPERIOD
sublw REFERENCEPERIOD
btfsc STATUS,Z
return
btfsc STATUS,C
Oscillator Could Be Too Fast
goto RUNNINGSLOW
RUNNINGFAST
xorlw 0xFF ;Two's Complement Value
addlw .1
sublw TOLERANCE
btfsc STATUS,Z
return
goto ADJUSTDOWN
RUNNINGSLOW
sublw TOLERANCE
btfsc STATUS,Z
return
goto ADJUSTUP
ADJUSTDOWN
BANKSEL OSCCAL ;BANK1
movlw .4
subwf OSCCAL,F
BANKSEL GPIO ;BANK0
return
ADJUSTUP
BANKSEL OSCCAL ;BANK1
movlw .4
addwf OSCCAL,F
BANKSEL GPIO ;BANK0
return
Listato 1

 

 

Scrivi un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *