Leggere la tensione della batteria consumando poco IoT

Buon giorno,

ho un piccolo problema: uso aTmega328P standalone 8MHz interno e lo alimento attraverso un regolatore LDO 3.3V collegato ad una batteria 12V.

Dovrei calcolare la percentuale di batteria e per fare questo ho fatto un partitore di tensione (i valori delle resistenze devo ancora perfezionarli) con ingresso sul Pin analogico A5.

Il mio problema è che sto facendo in modo di consumare il meno possibile dato che sarà una scheda completamente a batteria e finora quando mando in sleep l’MCU arrivo a 2uA che non è niente male ma da quando ho messo il partitore ho un consumo di 2mA fissi. Ho provato a fare il circuito che vi ho schematizzato qua sotto ma ottengo ancora un pessimo risultato, ovvero quando non do alimentazione al Transistor ho sempre 500uA di consumo.

Vi chiedo: come posso staccare completamente la tensione che arriva al partitore?

Grazie mille

Prima di tutto ... hai considerato che un LDO e' comunque un regolatore lineare, quindi un minimo consuma anche lui ? ...

Vero, ci sono i micropower, ma danno correnti molto ridotte in uscita ... a te quanta corrente serve con TUTTO in funzione ?

Secondo, puoi benissimo usare anche partitori con valori molto elevati ... il valore consigliato di 10K sugli ingressi analogici si riferisce al poter fare letture abbastanza veloci, se invece ci devi controllare solo il livello di una batteria (che non sei li a leggerlo ogni decimo di secondo, puoi impiegare anche 10 o 20 secondi per leggerlo) puoi usare un valore di, ad esempio, 1M per la R verso massa e 3.9M verso il +12, che ti darebbe un consumo di circa 2.5uA ;)

puoi usare un valore di, ad esempio, 1M per la R verso massa e 3.9M verso il +12

Giusto, ma è meglio aggiungere una piccola capacità (es. 1000 pF) in parallelo alla resistenza bassa, ho fatto giusto poco tempo fa un esperienza pratica in tal senso, e senza la lettura era piuttosto 'random'...

Ciao, Ale.

Etemenanki:
Prima di tutto … hai considerato che un LDO e’ comunque un regolatore lineare, quindi un minimo consuma anche lui ?

Ho un consumo di 2uA senza carico sul MCP1702 direi che va benone, inoltre il carico massimo è di 3mA circa se hai soluzioni migliori sono aperto a suggerimenti.

Etemenanki:
Secondo, puoi benissimo usare anche partitori con valori molto elevati …

Ok ho fatto dei test e ho messo le resistenze R1(Vin)= 2.7M e R2(GND)=1M cosicché quando ho 13V in ingresso ottengo 3.514V in teoria
ma in pratica misurando con un multimetro ottengo 0,23V e di conseguenza l’MCU legge quel valore…

Inoltre non ho capito se mi stai dicendo di mantenere il transistor o se toglierlo e collegare il partitore perennemente al pin analogico.

ilguargua:
Giusto, ma è meglio aggiungere una piccola capacità (es. 1000 pF) in parallelo alla resistenza bassa, ho fatto giusto poco tempo fa un esperienza pratica in tal senso, e senza la lettura era piuttosto ‘random’…

Ciao, Ale.

Ok capisco, io però ho solo Condensatori ceramici nell’ordine di uF esattamente questa scatola https://www.amazon.it/gp/product/B07PP7ZKTJ/ref=ppx_yo_dt_b_asin_title_o04_s00?ie=UTF8&psc=1

Quale di questi mi consigli?

Grazie

Quello di valore più basso, 0.1 uF, perlomeno prova, aspetta qualche secondo per stabilizzare la lettura, con una resistenza 3 Mega gli ci vuole del tempo per caricarsi.

Ciao, Ale.

Provato ma il valore che ho misurando con il voltmetro tra GND e il punto centrale del partitore è sempre di 0.23V.... Se rimetto le resistenze nell'ordine dei kilo invece ho dei valori più alti... tipo a 13.5V ho 3.4V che a me va bene.

Con quel consumo puoi anche lasciarlo sempre connesso, senza il transistor …

A proposito, come misuri quelle correnti ? … i normali tester non sono molto precisi con correnti cosi piccole, a meno di non avere strumenti da laboratorio, tipo Fluke o simili … oppure un micro-nanoamperometro specifico (si puo anche autocostruire, volendo, quelli commerciali non sono esattamente economici)

Te lo chiedo perche’ se il tester e’ buono, che tu usi resistenze da 10K-39K o da 1M-3M9 non dovresti avere grosse differenze di lettura ai capi della resistenza verso massa … se invece il valore di resistenza di ingresso del tester e’ troppo basso, le letture vengono falsate (succede a volte con multimetri “cinesata” da 3 o 4 Euro) … ed il fatto che ti dia cosi tanta differenza mi fa venire dei dubbi …

Provato ma il valore che ho misurando con il voltmetro tra GND e il punto centrale del partitore è sempre di 0.23V....

Provato anche a leggerlo con l'Arduino? Poi il transistor non va bene, come minimo si perde la Vce, se proprio vuoi metterlo a comando usa un fet tra la resistenza bassa ed il GND, un BS170 dovrebbe andare bene per lo scopo, anche se resta valido quello che dice Etem, è sostanzialmente inutile.

Ciao, Ale.

Buona sera a tutti.

Allora mi sono messo qui a fare dei test sta sera ed effettivamente ho scoperto che il tester che usavo io (analogico autocostruito da mio padre più di 30 anni fa della Radio Elettra Torino) ha un bel assorbimento di corrente e in più non segnava preciso preciso.

Ho fatto delle misure invece con il mio Fluke 115 che uso per lavoro ed effettivamente non cambia nulla aumentando da K a M ohm… Si, cambia che con resistenze nell’ordine dei mega consumerà si e no 2uF come diceva Etema.

Quindi ora quando ho 3.3V sul pin analogico mi legge 1023
mentre quando ho 7.0V sul pin analogico mi legge 564

Ora vorrei mappare questi valori e fare in modo che mi restituisca la percentuale della batteria.
Ho cercato nei vari topic online sul forum Arduino sia Italiano sia International ma non riesco a trovare qualcuno che alimenta l’MCU a 3.3V come me e quindi non riesco a capire come fare (sarà che sono le 23:53 :sleeping: ).

Qualcuno sà come aiutarmi?

Ancora grazie

Collega sul +12v un alimentatore variabile e segnati i valori letti da arduino in base alla tensione In uscita dall'alimentatore.

Avevo pensato anche io cosi ma speravo ci fosse un metodo più matematico

ma speravo ci fosse un metodo più matematico

Il metodo matematico non mi sembra poi così difficile : hai 1024 valori per una scala che va da 0 a 3.3 V, quindi vuoi sapere quanto vale ogni unit dell'adc? 3300 / 1024 = 3,22265625 mV , quindi la tua lettura sopra 564 varrà 564x3,2265625 = 1817,578125 mV, ovvero 1,817 V e spiccioli. L'ingresso era 7 V, quindi il partitore ha un rapporto di 7 / 1,817 = 3, 852 (e spiccioli..). Quindi la tensione all'ingresso del partitore dalla lettura sarà (3300/1024) * adcVal * scalaPartitore. Perlomeno in teoria...

Ciao, Ale.

Fai attenzione alle tensioni, se stilizzi una batteria al piombo-acido la tensione a piena carica è quasi 13.8v.

ilguargua: Il metodo matematico non mi sembra poi così difficile : hai 1024 valori per una scala che va da 0 a 3.3 V, quindi vuoi sapere quanto vale ogni unit dell'adc? 3300 / 1024 = 3,22265625 mV , quindi la tua lettura sopra 564 varrà 564x3,2265625 = 1817,578125 mV, ovvero 1,817 V e spiccioli. L'ingresso era 7 V, quindi il partitore ha un rapporto di 7 / 1,817 = 3, 852 (e spiccioli..). Quindi la tensione all'ingresso del partitore dalla lettura sarà (3300/1024) * adcVal * scalaPartitore. Perlomeno in teoria...

Ciao, Ale.

Ciao Ale (ho quotato tutto perchè c'è un ragionamento matematico) ho provato con la calcolatrice a fare (3300/1024)*564*3,852 e risulta 7.001,3109375 mentre io mi aspettavo 7V

Ho provato a ragionare sul tuo ragionamento e sono giunto alla conclusione che forse al posto di 3300/1024 dovrei fare 3.3/1024 no?

Ho provato a fare come pensavo io ed effettivamente: 0.00322265625*546*3.852 = 7,0013109375V

Sbaglio qualcosa io? (Devo ancora testare la tua formula su codice)

abinformatica:
Ho provato a ragionare sul tuo ragionamento e sono giunto alla conclusione che forse al posto di 3300/1024 dovrei fare 3.3/1024 no?

… hai notato che lui NON parla di V ma di mV? Ossia un fattore mille :smiley:

3300 / 1024 = 3,22265625 mV = 0.003222 V

Guglielmo

Si ok capito, diciamo che mi ero focalizzato sui volt e non vedevo la cosa in maniera diversa :roll_eyes:

Grazie a tutti

Buon giorno,

ho fatto dei test con la formula suggerita da Ale ed effettivamente va bene.

L'unica cosa ho dovuto mettere a VCC il pin Aref e metterci un condensatore da 0.1uF di disaccopiamento per renderlo più stabile. Ora legge esattamente la tensione.

Altro problemino, vorrei ottenere la percentuale e ho fatto cosi

flat percentualeBatt = map (Vbatteria, 7, 12, 0, 100);

Vbatteria me la legge con due decimali esempio: 10.79

Ho messo i valori 7, 12 perchè per me il 7V deve essere a 0% e 12v 100%

Variando l’alimentazione d’ingresso mi fa la percentuale in 5 scalini diciamo, nel senso: 0.00, 20.00, 40.00, 60.00, 80.00 e 100.00.

Come posso ottenere dei valori più minuziosi?

Grazie

Credo il map funzioni solo per interi (ma non mi ricordo, controlla) ... prova moltiplicando i V per 10 e facendo il map 70 120 ... o numeri simili, devi provare tu ...

La map() funziona SOLO con interi, ma … la cosa era già stata risolta con l’ottimo lavoro di standardoil in QUESTO thread :smiley:

Guglielmo