Pagina 1 di 2

Misura tensione di batteria

MessaggioInviato: 18 set 2012, 13:59
da Paolino
Ricevo da Foto Utenteguidonetto, via MP, questo messaggio che vi propongo:

guidonetto ha scritto:Ciao, ho trovato interessante il tuo articolo: una tecnica per misurare la tensione della batteria con un PIC, per cortesia mi spieghi e midifichi il codice per far accendere un led al calare della tensione in modo che mi avverta quando la batteria è quasi scarica?


Codice: Seleziona tutto
char BatteryChargeMeasure (void)
{
    ADCON0bits.ADON = 1;
    ADCON0bits.GO = 1;
    while (ADCON0bits.DONE);
    ADCON0bits.ADON = 0;
    if (ADRESL>=0xA0)
    {
        return TRUE;
    } else {
        return FALSE;
    }
}
Perche capisca mi spieghi anche le varie strighe di codice?


Per rispondere non solo a Foto Utenteguidonetto, segnale che l'articolo citato lo si può trovare a questo link.

Lo schema di partenza è questo:



Dunque, parto dalla spiegazione delle righe di codice, che sono veramente poche e banali. Per meglio capire, ho commentato le rughe di codice.

Codice: Seleziona tutto
char BatteryChargeMeasure (void)
{
    /* Registro ADCON0: attivazione del modulo A/D */
    ADCON0bits.ADON = 1;

    /* Registro ADCON0: avvio della conversione A/D */
    ADCON0bits.GO = 1;

    /* Attesa che la conversione A/D sia ultimata */
    while (ADCON0bits.DONE);

    /* Registro ADCON0: spegnimento del modulo A/D */
    ADCON0bits.ADON = 0;

    /* Controllo del valore letto dal modulo A/D, lettura del solo
       registro ADRSEL (parte bassa del registro di conversione)
       e confronto con un valore di soglia "arbitrario (0xA0):
       se il valore letto supera la soglia, la funzione
       restituisce TRUE, viceversa restituisce FALSE */
    if (ADRESL>=0xA0)
    {
        return TRUE;
    } else {
        return FALSE;
    }
}


Ora, per accendere un LED se la batteria è scarica, si suppone che il LED sia collegato a RB0:



un possibile approccio potrebbe essere il seguente:
Codice: Seleziona tutto

#define LED_LOW_BATTERY LATBbits.LATB0

main ()
{
    /* Configurazione valore di TRISTATE per pin RB0 */
    TRISBbits.TRISB0 = 0;
/* ... */

    /* Controllo tensione batteria ed eventuale accensione LED */

    if (BatteryChargeMeasure == TRUE)
    {
       LED_LOW_BATTERY = 1;
    } else {
       LED_LOW_BATTERY = 0;
    }

/* ... */

}


Foto Utenteguidonetto, ti esorto a leggere anche questo articolo, relativo alla conversione analogico-digitale.

Ciao.

Paolo.

Re: Misura tensione di batteria

MessaggioInviato: 20 set 2012, 23:54
da guidonetto
Scusami R1 che valore deve avere?
Grazie per avermi risposto , bravo e chiaro.

Re: Misura tensione di batteria

MessaggioInviato: 21 set 2012, 9:10
da Paolino
Per risponderti, provo a fare un ragionamento. Per ridurre al minimo la corrente che circola in R1, è opportuno fare in modo che tale resistore abbia un valore abbastanza elevato. Facciamo quattro conti.

Immaginiamo che:
V_{batt}= 5V
V_{d}= 0.6V

Supponendo che la corrente che circola in AN0 sia trascurabile (nell'ordine di qualche pA),si ha che R1 e D1 sono in serie:



Applicando la Leggi di Ohm, si ha che la corrente che circola in I_{1} vale:

I_{1}= \frac{V_{batt}-V_{d}}{R_{1}} [1]

Se si impone che:
I_{1}=1\mu A

invertendo la [1] si ha:

R_{1}= \frac{V_{batt}-V_{d}}{I_{1}} [2]

Inserendo i dati nella [2], si ha:

R_{1}= \frac{5-0.6}{10^{-6}} = 4.4M\Omega

Il valore commerciale più vicino è 4.7M\Omega: con questo valore, la corrente effettiva è minore e vale circa 0.93\mu A

Ovviamente, puoi imporre valori differenti della corrente e determinare il valore della resistenza.

Ciao.

Paolo.

Re: Misura tensione di batteria

MessaggioInviato: 21 set 2012, 20:06
da guidonetto
Ciao, sei stato molto chiaro.
Grazie

Re: Misura tensione di batteria

MessaggioInviato: 28 set 2012, 19:34
da guidonetto
Ciao, puoi modificarmi il codice in modo che si accenda il led quando la tensione schende sotto i 3V?
Grazie

Re: Misura tensione di batteria

MessaggioInviato: 3 ott 2012, 22:49
da mros
buonasera a tutti

ho letto i messaggi...ma ho un piccolo dubbio
per la conversione devo utilizzare una tensione di riferimento.
Se la batteria si scarica diminuisce di conseguenza anche la suddetta tensione...di conseguenza la conversione viene inalterata...giusto?

grazie

Re: Misura tensione di batteria

MessaggioInviato: 4 ott 2012, 20:44
da guidonetto
Ciao, alimenti il PIC 18f4550 con tre batterie da 1.5 V (tot. 4.5V) tipo AA, come posso aiutarti per tensione di riferimento?
Grazie

Re: Misura tensione di batteria

MessaggioInviato: 5 ott 2012, 19:58
da guidonetto
Scusami, alimento il PIC

Re: Misura tensione di batteria

MessaggioInviato: 6 ott 2012, 10:44
da Paolino
Foto Utenteguidonetto, se hai letto l'articolo, il "trucco" sta proprio nel misurare una tensione fissa (quella ai capi del diodo), con una tensione di riferimento dell'ADC che diminuisce perché la batteria si scarica.
Il gioco è tutto lì.

Per il codice: prima cerca di capire il principio della misura, poi ti metto due righe di codice (è stata una settimana colma...)

Ciao.

Paolo.

Re: Misura tensione di batteria

MessaggioInviato: 6 ott 2012, 12:11
da rusty
Scusa Foto UtentePaolino, mi è venuto un dubbio. Non sarebbe meglio far ritornare un valore booleano alla funzione BatteryChargeMeasure ?

char BatteryChargeMeasure (void) -> bit BatteryChargeMeasure (void)

Tanto piu' che controlli la sua esecuzione con un

if (BatteryChargeMeasure == TRUE)

Essendo definito il tipo di ritorno come char non credo che un ==TRUE funzioni :roll:
Magari con un tipo di ritorno bit si potrebbe semplicemente ritornare 1 o 0 alla BatteryChargeMeasure e verificare nel main con un if (BatteryChargeMeasure). Se ho detto eresie scusate :mrgreen: