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.
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.
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.
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.
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.
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 |