Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Misura tensione di batteria

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

4
voti

[11] Re: Misura tensione di batteria

Messaggioda Foto UtentePaolino » 6 ott 2012, 19:17

Ciao Foto Utenterusty.
Hai ragione, sull'uso del tipo booleano. Unico accorgimento: quanti compilatori supportano il tipo bit?
In effetti, per come è stata gestita la funzione, l'intento è proprio quello di restituire un valore booleano, pertanto l'espressione:
Codice: Seleziona tutto
if (BatteryChargeMeasure)
{
/* do something +/
} else {
/* do something else */
}

è lecita è funziona anche con il codice proposto nell'articolo.

Comunque, grazie per la segnalazione :ok:

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

[12] Re: Misura tensione di batteria

Messaggioda Foto UtentePaolino » 11 ott 2012, 22:30

Su richiesta di Foto Utenteguidonetto, riprendo il discorso della misura della tensione quando questa scende sotto i 3V.

Ora, ammesso e non concesso che il PIC resti acceso (se il calo è rapido, troppo rapido, va a finire che il PIC si spegne ed è finita lì), per determinare il valore analogico proporzionale alla tensione di 3V, semplicemente si applica la formula:

Threshold = 1023\frac{V_{ref}}{V_{batt}}

dove:
V_{ref} = 0.6V
rappresenta la caduta di tensione ai capi del diodo (supposta appunto pari a 600mV)

V_{batt} = 3V
tensione di soglia

Sostituendo i valori, si ha:

Threshold = 1023\frac{0.6}{3}=204.6

A questo punto, il codice C diventa:

Codice: Seleziona tutto
#define Threshold 204

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


Ovviamente, se cambia qualche parametro in gioco, come ad esempio la caduta di tensione ai capi del diodo, il valore va ricalcolato. La formula rimane invariata.

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)

1
voti

[13] Re: Misura tensione di batteria

Messaggioda Foto Utenteguidonetto » 11 ott 2012, 23:06

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

2
voti

[14] Re: Misura tensione di batteria

Messaggioda Foto UtentePaolino » 12 ott 2012, 8:22

Prego :ok:

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)

2
voti

[15] Re: Misura tensione di batteria

Messaggioda Foto Utenterusty » 12 ott 2012, 11:24

Scusate se continuo a rompere :mrgreen:
Non capisco perché un tipo di ritorno dichiarato come char possa sposarsi con un return TRUE.

char BatteryChargeMeasure (void)
{
...
return TRUE;
}

Se proprio vogliamo ritornare TRUE/FALSE, non sarebbe meglio

#define TRUE 1
#define FALSE 0

int BatteryChargeMeasure(void)
{
return TRUE;
}

e poi controllarla nel main con un

if (BatteryChargeMeasure())

facendo fare un cast implicito da intero a booleano?

Voglio dire, se dichiaro la funzione con un valore di ritorno di tipo char, non posso scrivere return TRUE, al massimo return 'T' :-P

Grazie per gli eventuali chiarimenti O_/
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

1
voti

[16] Re: Misura tensione di batteria

Messaggioda Foto UtentePaolino » 12 ott 2012, 21:02

Certo Foto Utenterusty, hai perfettamente ragione. :ok:
Nel codice che ho proposto davo per scontate le definizioni di FALSE e TRUE, ma forse è meglio specificarli:

Codice: Seleziona tutto
#define TRUE 1
#define FALSE 0


Il fatto che la funzione restituisca char piuttosto che int è perché char è normalmente a 8 bit, mentre sulle macchine a 16 bit int è a 16bit. Così, per "risparmiare" un byte, ecco l'idea di utilizzare un char.

Grazie per la precisazione.

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)

1
voti

[17] Re: Misura tensione di batteria

Messaggioda Foto Utenterusty » 12 ott 2012, 23:03

Paolino ha scritto:Il fatto che la funzione restituisca char piuttosto che int è perché char è normalmente a 8 bit, mentre sulle macchine a 16 bit int è a 16bit.


Ecoo vedi a questo non avevo pensato, grazie a te per la spiegazione :ok:
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

Precedente

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti