Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Misura tensione di batteria

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

6
voti

[1] Misura tensione di batteria

Messaggioda Foto UtentePaolino » 18 set 2012, 13:59

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.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[2] Re: Misura tensione di batteria

Messaggioda Foto Utenteguidonetto » 20 set 2012, 23:54

Scusami R1 che valore deve avere?
Grazie per avermi risposto , bravo e chiaro.
Avatar utente
Foto Utenteguidonetto
13 1 5
Frequentatore
Frequentatore
 
Messaggi: 124
Iscritto il: 8 mag 2011, 21:08

3
voti

[3] Re: Misura tensione di batteria

Messaggioda Foto UtentePaolino » 21 set 2012, 9:10

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.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[4] Re: Misura tensione di batteria

Messaggioda Foto Utenteguidonetto » 21 set 2012, 20:06

Ciao, sei stato molto chiaro.
Grazie
Avatar utente
Foto Utenteguidonetto
13 1 5
Frequentatore
Frequentatore
 
Messaggi: 124
Iscritto il: 8 mag 2011, 21:08

0
voti

[5] Re: Misura tensione di batteria

Messaggioda Foto Utenteguidonetto » 28 set 2012, 19:34

Ciao, puoi modificarmi il codice in modo che si accenda il led quando la tensione schende sotto i 3V?
Grazie
Avatar utente
Foto Utenteguidonetto
13 1 5
Frequentatore
Frequentatore
 
Messaggi: 124
Iscritto il: 8 mag 2011, 21:08

0
voti

[6] Re: Misura tensione di batteria

Messaggioda Foto Utentemros » 3 ott 2012, 22:49

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
Avatar utente
Foto Utentemros
10 1 5
Frequentatore
Frequentatore
 
Messaggi: 131
Iscritto il: 28 giu 2010, 9:23

0
voti

[7] Re: Misura tensione di batteria

Messaggioda Foto Utenteguidonetto » 4 ott 2012, 20:44

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
Avatar utente
Foto Utenteguidonetto
13 1 5
Frequentatore
Frequentatore
 
Messaggi: 124
Iscritto il: 8 mag 2011, 21:08

0
voti

[8] Re: Misura tensione di batteria

Messaggioda Foto Utenteguidonetto » 5 ott 2012, 19:58

Scusami, alimento il PIC
Avatar utente
Foto Utenteguidonetto
13 1 5
Frequentatore
Frequentatore
 
Messaggi: 124
Iscritto il: 8 mag 2011, 21:08

2
voti

[9] Re: Misura tensione di batteria

Messaggioda Foto UtentePaolino » 6 ott 2012, 10:44

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.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

3
voti

[10] Re: Misura tensione di batteria

Messaggioda Foto Utenterusty » 6 ott 2012, 12:11

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:
Avatar utente
Foto Utenterusty
4.075 2 9 11
Utente disattivato per decisione dell'amministrazione proprietaria del sito
 
Messaggi: 1578
Iscritto il: 25 gen 2009, 13:10

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti