Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Ricerca personalizzata
14
voti

LO HAI MAI REALIZZATO CON UN PIC? Una 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...

Indice

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:

La 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:

I 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;
    }
}

Riferimenti

PilloleDiMicrocontrolloriPIC.JPG

PilloleDiMicrocontrolloriPIC.JPG

12

Commenti e note

Inserisci un commento

di ,

C'è la possibilità di ridurre l'assorbimento... Con un "barbatrucco" :-)

Rispondi

di ,

Io ho sepre usato un Vref (e alcuni PIC ce l'hanno addirittura integrato). Come sistema è curioso, però consuma più corrente...

Rispondi

di ,

Va calcolato in modo che la corrente che circola in essa non sia tale da scaricare rapidamente la batteria. Un valore sufficientemente "alto" ti garantisce questo.

Rispondi

di ,

come devo determinare il valore della resitenza R?

Rispondi

di ,

Interessante, potrei suggerire il trucco ad un amico che si occupa di questo;-)

Rispondi

di ,

Bene, sono contento. Grazie.

Rispondi

di ,

Complimenti per l'articolo...appena ho un pò di tempo applico il tuo suggerimento ad un progetto che ho in mente..

Rispondi

di ,

Grazie davvero, io per adesso sto cercando di fare il grande salto dal assebly al C ed esempi semplici da convertire tra i due linguaggi mi aiutano davvero tanto :)

Rispondi

di ,

Grazie ragazzi! ;-)

Rispondi

di ,

Mi associo, l'articolo è molto utile, complimenti! Grazie Paolino!

Rispondi

di ,

Complimenti,altra perla per la raccolta di Articoli sui PIC by Paolino....anche se non sono esperto della materia apprezzo molto questo genere di articoli, ti fa vedere/conoscere i PIC da un'altra angolatura. Voto meritatissimo, purtroppo posso darne solamente uno...:-)

Rispondi

di ,

Bravo Paolino, ottimo articolo e bel trucchetto!

Rispondi

Inserisci un commento

Per inserire commenti è necessario iscriversi ad ElectroYou. Se sei già iscritto, effettua il login.