Errore misurazione grandezza analogica da batteria

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.

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

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

Le resistenze vanno bene.
La tensione sull'analogica è 12/(R1+R2)*R2, quindi circa 4,3V. Posta il codice che usi.

Ciao,
P.

Posto la funzione qua sotto, con la speranza di capire il problema
Le "tacche" andrebbero poi su un display LCD 20x4

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 (" "); 
    }             
}

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

    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.

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.

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.

Meglio

Serial.println(analogRead(A0));

Ciao,
P.;

Eh, si, certo, A0 (lo avevo scritto prima, poi in quella riga ho messo il 9), tra l'altro A9 neanche esite... :wink:
Ora correggo grazie.

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)

mattiarainieri:
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.

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?

Che step down è?...

docdoc:
...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.

Che step down é?

docdoc:
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?

uwefed:
Che step down é?

Datman:
Che step down è?...

Ho messo in allegato l'immagine, anche se bypassandolo il problema persiste. Pensavo che il problema potesse essere l'alimentazione tramite i pin di VIN E GND.

mattiarainieri:
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.

Con QUEL partitore se Vin che ti interessa va da 12 a 13.8V dovresti avere sul pin una tensione che va da 4.29 a 4.93, non un gran intervallo ma non dovrebbe darti fisso 1023 ma tra 870 e 1008 se non ho fatto male i conti.

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?

Non ho capito come hai alimentato Arduino con un Raspberry (?), comunque sia per il discorso alimentazione ricordiamo che Arduino lo si può alimentare in 4 modi:

  1. tramite porta USB
  2. tramite connettore di alimentazione
  3. tramite pin Vin
  4. tramite pin 5V

Ora, con 1) hai detto che funziona bene, mentre con la 3) ti dà sempre 1023 (intanto con la 2 hai provato a vedere cosa succede?).

Per cui ora la mia perplessità: il pin Vin passa per il regolatore interno ed in questo è analogo all'ingresso col connettore di alimentazione, per cui vanno portati tra 6.5 e 12 Volt. Se tu ce ne metti solo 5, abbassi tutta la tensione di Arduino, compreso Vref, per cui credo che sia possibile che 4.29 V siano superiori a Vref e quindi A0 ti dà sempre 1023!

Per cui se tu hai a valle dello step down una tensione di 5Volt la dovresti collegare ai 5V di Arduino. Lì puoi mandare una tensione che deve assolutamente stare tra 4.5 e 5.5 V, e deve essere stabilizzata. Inoltre non hai nessuna protezione quindi occhio a non invertire le polarità che friggi Arduino.

Secondo me se fai così (con le dovute accortezze, come detto sopra) dovresti leggere valori corretti, tra 870 e 1008 circa.

PS: Ma a te interessa sapere quando supera una certa soglia (o scende al di sotto) oppure devi per forza misurare il valore? Perché altrimenti se ti basta la soglia credo che sarebbe più affidabile un comparatore fatto con un operazionale (es. VM358) nel quale regoli la soglia via trimmer, e l'uscita del comparatore la mandi ad un normale pin digitale...

docdoc:
... Perché altrimenti se ti basta la soglia credo che sarebbe più affidabile un comparatore fatto con un operazionale (es. VM358) nel quale regoli la soglia via trimmer, e l'uscita del comparatore la mandi ad un normale pin digitale...

emmm ... Arduino ha un comparatore analogico integrato in grado anche di alzare un interrupt al superamento del valore di soglia :wink:

Datasheet pagina 243.

Guglielmo

gpb01:
emmm ... Arduino ha un comparatore analogico integrato in grado anche di alzare un interrupt al superamento del valore di soglia :wink:

Grazie, buono a sapersi, non lo sapevo ed è sempre utile imparare qualcosa di nuovo! :slight_smile:

Comunque sia in questo caso se ha i livelli di riferimento sballati (o almeno questo è il dubbio) non risolve molto, io mi affiderei più al buon vecchio hardware che con un operazionale mi dà direttamente l'esito della comparazione su un pin digitale :wink:

docdoc:
Comunque sia in questo caso se ha i livelli di riferimento sballati (o almeno questo è il dubbio) non risolve molto, io mi affiderei più al buon vecchio hardware che con un operazionale mi dà direttamente l'esito della comparazione su un pin digitale :wink:

Non cambia asolutamente nulla ... se hai un riferimento sbagliato, che l'operazionale lo metti tu fuori o che sia integrato nella MCU ... comunque avrai valori sballati !

Guglielmo