Misura tensione di batteria
Ricevo da
guidonetto, via MP, questo messaggio che vi propongo:
Per rispondere non solo a
guidonetto, 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.
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:
guidonetto, ti esorto a leggere anche questo articolo, relativo alla conversione analogico-digitale.
Ciao.
Paolo.
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?Perche capisca mi spieghi anche le varie strighe di codice?
- 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;
}
}
Per rispondere non solo a
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;
}
/* ... */
}
Ciao.
Paolo.


, è opportuno fare in modo che tale resistore abbia un valore abbastanza elevato. Facciamo quattro conti.

),si ha che R1 e D1 sono in serie:
vale:
[1]
[2]
: con questo valore, la corrente effettiva è minore e vale circa 