Go Down

Topic: Errore misurazione grandezza analogica da batteria (Read 425 times) previous topic - next topic

mattiarainieri

Salve,

Ho realizzato il seguente schema che, in teoria, mi sarebbe stato utile a monitorare lo stato della batteria dal quale arduino prende la sua alimentazione.

Purtroppo però, l'arduino legge sempre il valore massimo (1023) quanto funziona alimentato a batteria, ma se passo ad alimentarlo tramite usb il tutto funziona.

Qualcuno sa spiegarmi questo strano comportamento e, se possibile, come risolverlo?

Grazie mille.


AndreAndre

Ciao, così misuri la tensione di R1, essendo 18k e 10k la seconda, la tensione che ti trovi sull'analogica sara (12/(R1+R2))*R1 = circa 7,7V quindi fuori range, puoi o cambiare le resistenze o invertirle così ti troverai circa 4,3V
Per il secondo discorso penso che sia un effetto del DC-DC ma non saprei dirti la causa anche se ho 2 ipotesi

mattiarainieri

Ciao, sei sicuro che così l'ordine delle resistenze non vada bene? Anche misurando col multimetro la misurazione risulta corretta (da 0 a 5v) quindi non penso che sia questo il problema.

Allo stesso tempo non so sei i problemi li genera lo step-down, ma non credo un quando i due negativi sono direttamente collegati e la tensione la prendo a monte del DC-DC.

Attendo vostre risposte
Buona giornata

pgiagno

#3
Sep 19, 2019, 08:04 am Last Edit: Sep 19, 2019, 08:05 am by pgiagno
Le resistenze vanno bene.
La tensione sull'analogica è 12/(R1+R2)*R2, quindi circa 4,3V. Posta il codice che usi.

Ciao,
P.

mattiarainieri

#4
Sep 19, 2019, 08:47 am Last Edit: Sep 19, 2019, 08:48 am by mattiarainieri
Posto la funzione qua sotto, con la speranza di capire il problema
Le "tacche"  andrebbero poi su un display LCD 20x4

Code: [Select]
void StatoBatteria(){
    tensione = map(analogRead(A0), 0,1023, 0, 13700);
    Serial.println (tensione);
    
    if (tensione > 12000 ){                                       //875
        Display.setCursor (19,3);
        Display.print ("|");
    }
    else {
        Display.setCursor (2,3);
        Display.print ("ALLARME BATTERIA");
        Display.setCursor (19,3);
        Display.print (" ");    
    }
          
    if (tensione > 12400){                                         //906
        Display.setCursor (19,2);
        Display.print ("|");
    }
    else {
        Display.setCursor (19,2);
        Display.print (" ");      
    }
        
    if (tensione > 12800){                                     //935
        Display.setCursor (19,1);
        Display.print ("|");
    }
    else {
        Display.setCursor (19,1);
        Display.print (" ");      
    }
                  
    if (tensione > 13200){
        Display.setCursor (19,0);
        Display.print ("|");
    }
    else {
        Display.setCursor (19,0);
        Display.print (" ");
    }            
}

pgiagno

Meti un Serial.println (tensione); sotto ogni if, Esempio:

Code: [Select]
    if (tensione > 12000 ){                                       //875
        Serial.print("> 12000 = ");          //==ISTRUZIONE INSERITA=================
        Serial.println(tensione);            //==ISTRUZIONE INSERITA=================
        Display.setCursor (19,3);
        Display.print ("|");
    }
    else {
        Serial.print("else > 12000 = ");     //==ISTRUZIONE INSERITA=================
        Serial.println(tensione);            //==ISTRUZIONE INSERITA=================
        Display.setCursor (2,3);
        Display.print ("ALLARME BATTERIA");
        Display.setCursor (19,3);
        Display.print (" ");   

e posta il risultato del Monitor seriale.

Ciao,
P.

docdoc

Ciao, sei sicuro che così l'ordine delle resistenze non vada bene? Anche misurando col multimetro la misurazione risulta corretta (da 0 a 5v) quindi non penso che sia questo il problema.
Ma la misurazione col multimetro la fai sul pin collegato ad Arduino, e alimentato a batteria?

Come sempre, cerco di capire per passi i problemi.

Prima di pensare al programma (tra l'altro le Serial.print non c'entrano nulla), se metti una batteria con meno di 12V (diciamo provi prima una 9V e poi una 6V ossia 4 stilo AA) sul pin di Arduino leggi col multimetro una tensione inferiore a 5V (in realtà il massimo è dettato dal partitore quindi 4.3V dovrebbero corrispondere ai 12V) ma Arduino legge sempre 1023?
Oppure cosa?

Una volta che col multimetro leggi i valori corretti, lascia stare per ora la map() e manda su seriale la lettura di analogRead(A0):

Serial.println(analogRead(A0));

e vedi cosa ritorna quando abbassi la tensione.
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

pgiagno

Meglio

  Serial.println(analogRead(A0));

Ciao,
P.;

docdoc

Eh, si, certo, A0 (lo avevo scritto prima, poi in quella riga ho messo il 9), tra l'altro A9 neanche esite... ;)
Ora correggo grazie.
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

mattiarainieri

Ciao e grazie per l'idea.
Facendo stampare tramite serial monitor, il tutto funziona correttamente perché l'arduino in questo caso si alimenta tramite USB. Il problema si verifica con alimentazione da batteria, infatti se invece di farlo scrivere sul seriale ma sul display, legge sempre il valore massimo (dai 1023 ai 1000 più o meno)

docdoc

Facendo stampare tramite serial monitor, il tutto funziona correttamente perché l'arduino in questo caso si alimenta tramite USB.
Eh, si, certo, scusa, ovviamente in quel caso dovresti avere un convertitore seriale.

Quote
Il problema si verifica con alimentazione da batteria, infatti se invece di farlo scrivere sul seriale ma sul display, legge sempre il valore massimo (dai 1023 ai 1000 più o meno)
Ok, quindi sempre per capire separando i problemi, fai 3 prove senza la USB ed usando il display per mostrare il valore grezzo della analogRead, ma devi anche collegare il multimetro in parallelo al pin per "vedere" esattamente cosa arriva tramite il partitore e quindi cosa legge Arduino come valore. Per dire:

Batteria carica (12V): multimetro: x.x V, Arduino: yyy
Batteria bassa (9V): multimetro: x.x V, Arduino: yyy
Batteria scarica (6V): multimetro: x.x V, Arduino: yyy

Quindi che valori abbiamo in queste 3 prove?

E se poi le ripeti con la USB collegata?
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Datman

Hi,I'm Gianluca from Roma.I play&work with electronics since I was16(1984).
After 25yrs of maintenance on cameras&video mixers,since 2013myJob is HDTVstudios design.
Since Jan2015 IPlayWith Arduino:bit.ly/2F3LPWP
Thanks 4 a Karma if U like my answer

pgiagno

...Batteria scarica (6V): multimetro: x.x V, Arduino: yyy...
Probabile che con 6V in ingresso lo step down non riesca a mantenere 5V in uscita, ma non si sa mai.

Ciao,
P.

uwefed


mattiarainieri

Eh, si, certo, scusa, ovviamente in quel caso dovresti avere un convertitore seriale.

Ok, quindi sempre per capire separando i problemi, fai 3 prove senza la USB ed usando il display per mostrare il valore grezzo della analogRead, ma devi anche collegare il multimetro in parallelo al pin per "vedere" esattamente cosa arriva tramite il partitore e quindi cosa legge Arduino come valore. Per dire:

Batteria carica (12V): multimetro: x.x V, Arduino: yyy
Batteria bassa (9V): multimetro: x.x V, Arduino: yyy
Batteria scarica (6V): multimetro: x.x V, Arduino: yyy

Quindi che valori abbiamo in queste 3 prove?

E se poi le ripeti con la USB collegata?
Ciao e scusa se ho impiegato un po' di tempo a risponderti ma in quesi giorni sono stato pieno di impegni, comunque tornando a noi.

Premesso che le misurazioni mi servono solo quando la batteria è sopra i 12v (da 12 a 13.8), il display mi mostra sempre il valore massimo 1023.

Ora ho provato anche ad alimentarlo bypassando lo step-down e alimentarlo da un ruspberry, il problema persiste ma mi è sorto un forte dubbio: potrebbe che il problema sia l'alimentazione che avvenga tramite il i pin di VIN E GND che bypassano il primo stadio?

Go Up