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:
-
programmare il modulo ADC per Vdd/Vss come tensioni di
riferimento per la misura
-
predisporre il modulo ADC per la lettura interna di FVR
-
attivare il modulo FVR
-
effettuare la conversione AD
-
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
|