Home

BatteriaUna tecnica di misura della tensione di batteria

Spesso, le applicazioni a microcontrolore si trovano a dover effettuare misure analogiche sulla tensione di batteria, per cercare di determinarne lo stato di carica. Nei casi più generali, la misura di per sé non rappresenta un particolare ostacolo; si tratta sostanzialmente di dare in pasto al modulo ADC del microcontrollore la tensione da misurare (opportunamente condizionata, qualora superi il massimo valore sopportabile dal convertitore analogico-digitale). La lettura della tensione, comparata nel firmware con una soglia limite, farà dichiarare la batteria carica o scarica, con conseguente invito alla sostituzione. Sembra tutto facile, certo. Ma a volte...

 

 

Misura della tensione di alimentazione

L'esempio che segue è impiega un PIC18F4520 ed il firmware è scritto in C, ma con un minimo sforzo è adattabile tanto ad altri PIC di qualunque famiglia (purché dotati di convertitore A/D) ed è facilmente traducibile in assembly. Proviamo a dare un'occhiata al seguente circuito:

 

Misura di una tensione analogicaLa batteria è l'unica fonte di alimentazione del circuito, non sono previste altre sorgenti. Con poche righe di codice si va ad impostare il modulo ADC del PIC:

// ADC Setup
// ANALOG INPUT: solo RA0 è impostato come ingresso analogico
    ADCON1 = 0x0E;
    CMCON = 0x07;
    ADCON0 = 0x00;
    ADCON2 = 0x92;
    ADCON0bits.ADON = 1;

 

Andando a misurare il valore letto da AN0, si ha la sorpresa (che però non deve stupire) che il valore misurato è costante anche al variare del valore di Vbatt. Come superare questo ostacolo? Possibile che il PIC non si accorga che la tensione di batteria sta calando? Perché questo comportamento "strano"del modulo ADC?

Osservando attentamente come è stato configurato il modulo ADC del PIC si nota che la tensione Vref del convertitore conicide con la tensione di batteria. Pertanto, diminuendo la tensione, diminuisce anche Vref che, in questo caso, rappresenta il fondo scala della misura. Il firmware assocerà sempre il valore 0x3FF alla massima tensione che può convertire. Con questa strategia (Vref = Vbatt) il PIC viene "ingannato" e non è in grado di vedere la variazione in diminuzione della tensione di batteria.

 

Una modifica hardware

Ci sono diverse strade percorribili per aggirare l'ostacolo; una di queste è l'adozione di un dispositivo in grado di generare una Vref indipendente dalla Vbatt. Ma c'è un modo più semplice: andare a misurare una tensione costante. La tensione che cade ai capi del diodo è nell'intervallo 600-700 mV ed è costante fintanto che il diodo resta polarizzato. In prima approssimazione è possibile affermare che la Vd è costante per un intervallo molto ampio di Vbatt. Grazie a questa osservazione, possiamo tentare di andare a misurare Vd portando il segnale direttamente al convertitore A/D del PIC. Lo schema diventa pertanto il seguente:

 

Caduta di tensione ai capi di un diodoI vantaggi di questa soluzione sono presto detti. Quando Vbatt scende di valore, facendo diminuire anche Vref, il PIC "vede" il valore di Vd crescere; questo è dovuto al fatto che la Vref diminuisce portandosi sempre più a valori bassi.

Le condizioni operative sono le seguenti: Vd = 600mV Risoluzione modulo A/D: 10 bit

La relazione che lega la lettura analogica al valore reale è:

Vda = Vd * 0.6 / 1023

Ecco allora nella tabella che segue cosa accade alla misura di Vd quando Vbatt assume valori man mano decrescenti:

 

Vbatt[V] Vd_a
5.0 122
4.9 125
4.8 127
4.7 130
4.6 133
4.5 136
4.4 139
4.3 142
4.2 146
4.1 149
4.0 153
3.9 157
3.8 161
3.7 165
3.6 170
3.5 175

 

Quattro righe di codice

A questo punto la routine che legge il valore di tensione di batteria e che restituisce un valore logico VERO o FALSO è la seguente:

 

char BatteryChargeMeasure (void)
{
    ADCON0bits.ADON = 1;
    ADCON0bits.GO = 1;
    while (ADCON0bits.DONE);
    ADCON0bits.ADON = 0;
    if (ADRESL>=0xA0)
    {
        return TRUE;
    } else {
        return FALSE;
    }
}

 

Licenza

Questo articolo ed il software rilasciato rientrano nell'ambito della licenza CREATIVE COMMONS BY-NC-ND Italia 3.0, secondo quanto indicato nelle note legali qui riportate.

 

  Sintesi delle note legali (italiano)
Creative Common License Note legali (italiano)
  Legal Code (international)
  Commons deed (international)

 

Riferimenti

Licenza Creative Commons
Questa opera viene distribuita con licenza Creative Commons Attribuzione - Non commerciale - Non opere derivate 3.0 Unported.
ShoppingASEhandelASErhvervIndexDKServiceIndexDK