PIC

 

La misura di Vdd con FVR


Come valutare la Vdd nei PIC18F e Enhanced Midrange

Si presenta in molte applicazioni la necessità di valutare la tensione di alimentazione Vdd. 
Uno dei casi più comuni è quello dei sistemi alimentati a batteria, dove occorre tenerne sotto controllo la tensione per richiedere la sostituzione quando scarica oppure, nel caso di accumulatori, per evitarne una scarica eccessiva.

Questo è facilmente implementabile in tutti i chip che dispongono di modulo ADC, utilizzandone un canale e un ingresso. La soluzione è evidente, ma occupa un pin e solitamente ne richiede uno ulteriore per una tensione di riferimento esterna, dato che non si può utilizzare la Vdd come riferimento perchè essa è variabile con lo stato di scarica delle batterie. 

Si potrà anche utilizzare il comparatore, soluzione analoga alla precedente; in genere, con i chip più recenti dotati di comparatore c'è pure un modulo di generazione della tensione di riferimento, il che è un vantaggio.
Alcuni chip hanno anche un modulo HLVD che ha proprio lo scopo di tenere sotto controllo una tensione esterna. Anche qui, però, è richiesto l' uso di un pin dedicato e di un partitore esterno e il modulo non è disponibile in tutti i chip. Da notare che, per risolvere questo problema, in alcuni chip a basso numero di pin, come 18F1320, Microchip ha modificato il modulo HLVD in modo da non richiedere ingresso dedicato, ma utilizzare direttamente l' alimentazione Vdd.

Attualmente (sett.2013) per i PIC18FxxK e J, gli Enhanced Midrange 16F, oltre 12F1822 e 12F1840 che dispongono di modulo ADC e di comparatore, esiste una ulteriore via per la valutazione della Vdd: quella data dalla presenza del modulo di generazione della tensione di riferimento FVR.

FVR viene integrato per fornire una tensione di riferimento alle conversioni ADC e al comparatore, oltre che al DAC, dove presente.

Nel caso del PIC16F1824, ad esempio, il modulo FVR è doppio e consente di generare due tensioni differenti, una per l' ADC e una per il DAC e il comparatore.
in altri chip, l' uscita è singola.

Il riferimento vero e proprio è a 1.024V ed è possibile generare anche 2.048V e 4.096V, ovvero i tipici multipli di 2, adatti ad ottenere valori interi per gli step della conversione  che lavora con numeri binari multipli di 2.

In questi modelli, il modulo ADC consente di accedere, oltre ai soliti canali di ingresso analogici, anche alla misura della tensione generata dall' FVR.

A lato, lo schema di principio del modulo ADC di un 18F1xK22.

Il classico multiplex di ingresso è a 16 canali, di cui  i primi sono collegati a pin esterni e gli ultimi due fanno capo all' uscita del DAC integrato e del modulo FVR.
Questo schema è comune ai più recenti PIC18F e Enhanced Midrange, con poche modifiche dipendenti principalmente dal numero di pin del package e dai canali di ingresso ad essi collegati.

Ci interessa puntare l' attenzione su due particolari; osserviamo che la tensione di riferimento positiva per la conversione può essere derivata:

  • dalla Vdd
  • dal pin Vref+
  • dal modulo FVR

Inoltre, il canale Fh (1111) del multiplexer di ingresso del convertitore non è diretto ad un pin esterno, ma alla tensione di uscita del modulo FVR.

In queste condizioni:

  • non occorre alcun elemento esterno per una valutazione della tensione Vdd
  • e neppure l' uso di un pin esterno di ingresso
  • ne tanto meno di una tensione di riferimento.

Per utilizzare il modulo FVR si procede in questo modo:

  1. programmare il modulo ADC per Vdd/Vss come tensioni di riferimento per la misura

  2. predisporre il modulo ADC per la lettura interna di FVR

  3. attivare il modulo FVR

  4. effettuare la conversione AD

  5. il risultato della conversione indicherà la tensione Vdd.

A prima vista ci si può chiedere come questo sia possibile, dato che stiamo misurando la tensione di riferimento interna che è, si deve supporre, assai stabile e costante ed indipendente dalla Vdd.
Ma è proprio su questo punto che si basa la misura, perchè la Vref è sempre costante, ma la Vdd è la variabile.

Quando effettuiamo una conversione AD, il risultato è pari a:

risultato conversione = valore da convertire / (Vref / numero degli step)

Ad esempio, se abbiamo disponibile una conversione a 10bit, sono possibili 1024 step. Con una tensione di riferimento di 5V, questo vuol dire che ogni step vale 5/1024 = 4,882 mV per step.
Ovviamente, per una misura molto precisa, si cercherà di avere disponibile una tensione di riferimento ben stabile, magari multiplo del numero degli step. Ad esempio, con una Vref da 4096mv ogni step vale 4096/1024 = 4 mV.
Se la conversione rende 64h (100 decimale), il valore letto è di 100 * 4 = 400mV.

Ma osserviamo la cosa da un diverso punto di vista, ovvero quello di avere il valore da convertire stabile e la tensione di riferimento variabile. 
Ad esempio, abbiamo come Vref+ la Vdd a 5V (impostando NVCFG<1:0> = 00 e PVCFG<1:0> = 10) e misuriamo la tensione dell' FVR settato a 1.024V (CHS<3:0> = 111), si ha:

Vref/step = 5000/1024 = 4.882 mV/step

e la conversione rende:

 risultato = valore / mV/step = 1024 /4,882 = 209,75 decimale -> D1h.


Poniamo ora che la Vdd, usata con Vref+, scenda a 4V; di conseguenza la risoluzione sarà:

Vref / step =  4000/1024 = 3,906 mV/step. 

Quindi la lettura del riferimento interno, che resta costante a 1024mV renderà:

risultato = valore / mV/step = 1024 / 3,096 = 330,74 -> 14Ah

Se la tensione Vdd scende a 3V:

 Vref / step =  3000/1024 = 2,929 mV/step. 

Quindi la lettura di 1024mV renderà:

risultato = valore / mV/step = 1024 / 2,929 = 349,60-> 15Dh

In generale:

Vdd= (step ADC / risultato conversione) * Vfvr

e, nel caso del convertitore AD a 10 bit e la tensione di riferimento a 1.024V:

Vdd= (1024 / risultato conversione) * 1.024 = 1/ risultato conversione

Per l' esattezza dovremmo calcolare:

Vdd= (FVR  * ((2n- 1) / risultato conversione)) 

ma all' atto pratico possiamo dire che, con il variare della tensione usata come riferimento per la misura, il risultato della conversione di un valore costante, minore della tensione di riferimento, dà un valore inversamente proporzionale alla tensione di riferimento stessa.

Quindi, usando la Vdd come tensione di riferimento variabile per misurare la FVR costante, dal risultato della conversione possiamo valutare il valore della Vdd. 

In questo modo, con una semplice conversione ADC e senza utilizzare alcun pin esterno addizionale, è possibile risalire al valore della Vdd e determinare azioni dipendenti da essa.

Possiamo stendere una tabella per l' area di valori che ci interessano. Ad esempio, con un FVR di 1.024V abbiamo i seguenti rapporti tra la Vdd usata come Vref+ e il risultato della conversione AD (in hex):

Vdd ADC   Vdd ADC   Vdd ADC
5.5 BE   4.2 F9   3.3 13D
5 D1   4.1 FF   3.2 147
4.9 D5   4.0 106   3.1 152
4.8 DA   3.9 10C   3.0 15D
4.7 DF   3.8 113   2.9 169
4.6 E3   3.7 11B   2,8 176
4.5 E9   3.6 123   2.7 184
4.4 EE   3.5 12B   2.6 193
4.3 F3   3.4 134   2.5 1A3

E' possibile apprezzare variazioni di 10mV senza operare calcoli complessi o tarature. Migliori precisioni sono possibili implementando una valutazione dei risultati con calcoli in virgola mobile ed una qualche taratura.

Moduli FVR come quelli presenti in 18F1xK22 o 16F1540 sono programmabili su tre valori (1,024/2,048/4,096V); altri chip, come 16F690, hanno un riferimento di tensione a 0,6V e/o possono misurare la CVref del comparatore. Dove la tensione è programmabile, si sceglierà un valore tale da consentire al modulo FVR di rendere una tensione ben stabilizzato per tutti la gamma di variazione della Vdd.
Ad esempio, il foglio dati indica 2.5V la minima Vdd al chip per ottenere una Vref interna da 1,024V, mentre basta una tensione molto minore per i riferimenti a 0.6V.

Utilizzando un foglio di calcolo è facile tracciare una tabella che relazioni la Vdd con il valore ottenuto dalla conversione nella misura della Vref. Utilizzando questa tabella si potrà derivare una lookup table per la misura della Vdd o il valore limite sotto il quale non si deve scendere. In alternativa si potrà implementare un algoritmo di calcolo, ma solitamente la tabella è la via più semplice, anche considerando che una misura indiretta di questo genere tipicamente ha lo scopo di monitorare lo stato della tensione delle batterie che alimentazione il circuito e segnalare lo stato di scarica.

Questa misura "inversa" ha una precisione limitata rispetto a quella ottenibile con un metodo "diretto", ma per l' impiego previsto, è più che adeguata e consente di valutare differenze di una decina di millivolt o minori sulla Vdd.  Inoltre, rispetto ad una misura "diretta" con il convertitore ADC, presenta notevoli vantaggi:

  • non viene utilizzato un pin esterno, cosa indispensabile per chip con basso numero di pin

  • non richiede un partitore esterno che, nelle applicazioni low power, è una aggiunta poco gradita

  • non richiede una tensione di riferimento esterna per la precisione della misura, dato che essa è "intrinseca" al metodo di misura stesso

Per quanto riguarda questo ultimo punto, la precisione della tensione fornita dall' FVR, come detto, è minore di quella che potrebbe dare un voltage reference esterno, genere LM4040, REF-01; il foglio dati indica una dipendenza dalle caratteristiche costruttive e dalla temperatura con una variazione massima tra -8 e +6%.
Però, utilizzando una calibrazione, si potrebbe avere una precisione migliore dell' 1%, mentre quella non calibrata potrebbe oscillare mediamente entro il 3-5%.


Esempi di programma.

Dal punto di vista pratico, la tensione fornita da FVR sarà proporzionale alla tensione di alimentazione; il foglio dati indica i seguenti limiti per l' FVR di 18F13K22 (param. D003):

FVR Vdd
1.024 >= 2.5V
2.048 >= 2.5V
4.096 >= 4.75V

In ogni caso, la scelta del riferimento a 1.024V è la migliore, tenendo presente che, al di sotto dei 2.5V di alimentazione, il costruttore non garantisce il corretto funzionamento di FVR. Questo può essere un problema per i chip LF che possono funzionare anche con soli 1.8V.
In questa direzione, la scelta di un chip con riferimento a 0.6V (ad esempio 16F890) consente di arrivare al limite della tensione di alimentazione ammessa (2.0V) 

Ecco un semplice listato Assembly per 18F:

readVbatt:                       ;check Vdd by FVR
;FVR=1.024V
       bsf   VREFCON0, FVR1S0    
      
bcf   VREFCON0, FVR1S1
; enable FVR
      
bsf   VREFCON0, FVR1EN
; check for stability
      
btfss VREFCON0, FVR1ST
      
bra   $-2
;setup ADC for read FVR
       movlw b'10111110'         ;right, Fosc/64, 20TAD
      
movwf ADCON2
       movlw 0                   ;Vref from Vdd
       movwf ADCON1
       movlw b'00111101'         ;FVR in, ADC on
       movwf ADCON0
;start conversion
       bsf   ADCON0, GO
adcl   nop
       btfsc ADCON0, GO          ; check for conversion's end
       bra   adcl
       movff ADRESL, adc_valL    ; done - save result
       movff ADRESH, adc_valH    
       return

E un breve esempio di algoritmo in XC8; utilizzando una calibrazione e una valutazione in virgola mobile della conversione, si dovrebbe migliorare la precisione.

VREFCON0bits.FVRS = 0b01; // Internal 1.024v ref
FVREN =
1;                // Enable FVR module
while(!FVR1ST);           // Wait for FVR to be stable

ADCON2bits.
ADFM = 1;      // Right justify result
ADCON0bits.
CHS = 0b11111; // FVR is ADC input
ADCON1bits.
PVCFG = 0b00;  // Positive ref is Vdd (default)
ADCON1bits.
NVCFG = 0b00;  // Negative ref is GND (default)
ADCON0bits.
ADON = 1;      // Turn on ADC module

int adc_val = 0;

ADCON0bits.GO =
1;        // Start a conversion
while (!ADCON0bits.DONE);
// Wait for it to be completed

adc_val = (ADRESH <<
8);  // Store the result in adc_val
adc_val |= ADRESL;


Bibliografia

Per una trattazione dettagliata degli algoritmi utilizzabili per la calibrazione e la lettura di precisione della Vdd attraverso FVR è utile consultare l' AN1072 di Microchip

 


 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 23/09/13.