Partitore di tensione e batteria

Ciao a tutti, ho bisogno del vostro supporto

Sto utilizzando un microcontrollore, wemos d1 mini lite, il cui pin analogico a0, ammette una tensione massima di 3.2v. Devo monitorare una batteria al litio da 3.7 nominale, la cui tensione a carica massima è di 4.27v ( utilizziamo il valore 4,22v che quello che ho al momento nella batteria )

Utilizzo due resistenze da 100k per fare un partitore di tensione e applicando la formula ( Vr2 = V * R2 / (R1+R2)) mi aspetto che che la tensione che arrivi al pin sia di 2,11v. 4,22 * 100000/200000 = 2,11

Faccio le misurazioni in un circuito senza il microcontrollore ed effettivamente la misura sulla seconda resistenza mi da 2,09v ( direi che ci siamo ); poi faccio le misurazione sul pin a0 (collegando il pin a0 con il punto in cui si uniscono le due resitenza e ed il gnd ) e mi da 1,815v e già questo non me lo spiego.

In cascata anche il codice utilizzato mi restituisce una tensione non corretta

  int r1 = 100000;
  int r2 = 100000;
  float calc_res = (r1 + r2) / r2;
  int valPinBatt = analogRead(pinBatteria);
  float tensione_scalata = map(valPinBatt, 0, 1023, 0, 320);
  float Vbatt = tensione_scalata * calc_res / 100;
  Serial.print("Lettura = ");
  Serial.print(valPinBatt);
  Serial.println();
  Serial.print("Tensione scalata = ");
  Serial.print(tensione_scalata);
  Serial.println();
  Serial.print("Batteria = ");
  Serial.print(Vbatt);
  Serial.println(" V");

Se controlli lo schema elettrico del Wemos, puoi vedere che sull'ingresso analogico c'è già un partitore di tensione 220k/100k (quindi con 3,3V hai 1V su A0) di cui devi tenere conto se aggiungi altre resistenze esterne.

Per fare quello che chiedi, ti basta aggiungere in serie al segnale una resistenza da 100k in modo che il partitore alla fine diventi 320k/100k in modo che con il tuo fondo scala di 4,3V hai un livello massimo su A0 di 1V.

Intanto grazie per la risposta.
Ho messo in serie la resistenza da 100k, collegando quindi il polo positivo della batteria con un capo della resistenza e l'altro capo della resistenza al pin a0 ed il capo negativo della batteria al gnd.

La lettura sul pin a0 mi da

  • 1024 nel caso di una batteria che ha voltaggio 4,22
  • 739 nel caso di una batteria che ha voltaggio 2,87

se nello sketch di prima imposto R1 a 320000 ricevo

  • il valore 12,80v per la prima
  • il valore 9,24v per la seconda

quindi il calcolo non va, allora ho pensato di farlo più semplice e fare

  float tensione_scalata2 = map(valPinBatt, 0, 1023, 0, 4220);
  Vbatt = tensione_scalata2 / 1000;

che mi restituisce

  • 4,22V per la prima batteria ( quindi OK )
  • 3.05V per la seconda, a fronte di una misurazione con il tester di 2,87

Secondo te, si riesce ad essere più precisi, visto il risultato della seconda batteria ?

ilmagowalter:
Secondo te, si riesce ad essere più precisi, visto il risultato della seconda batteria ?

Invece di usare il map, prova a fare una semplice moltiplicazione.
Tu hai un fondo scala di 4220mV ed una risoluzione di 10bit == 1024 valori discreti 0 compreso.
Questo significa che puoi apprezzare una variazione minima di 4220/1023 = 4,125122 mV

double Vbatt = analogRead(A0) * 4.125122L;

Edit:
Rifacendo meglio i conti però.... con una livello di tensione di 2,87V dovresti leggere sul pin analogico un valore di circa 700 e non 739.

Facendo

float rapporto = 4220/1023;
float voltaggio = valPinBatt * rapporto / 1000;

Tensione batteria con il tester 2.86v
Tensione al pin con il tester 2.15v
Lettura pin ( facendo stavolta una media tra 100 letture ) -> 734
Voltaggio calcolato 2.93v

Tensione batteria con il tester 4.16v
Tensione al pin con il tester 3.14v
Lettura pin ( facendo stavolta una media tra 100 letture ) -> 1024
Voltaggio calcolato 4.10v

anche se ci siamo avvicinati direi che c'è qualcosa che non va nel codice
se io faccio con la calcolatrice
caso 1 -> 734 * (4220/1023) / 1000 = 3,02V
caso 2 -> 1024 * (4220/1023) / 1000 = 4,22V

Dovrebbe essere un problema dovuto al casting, se fai un *Serial.println(*rapporto) probabilmente ottieni un intero senza virgola a monitor.

prova cosi:

float rapporto = 4220.0/1023.0;
float voltaggio = valPinBatt * rapporto / 1000.0;

P.S.
"voltaggio" non si può sentire, ti prego cambia nome alla variabile :grinning: :grinning: :grinning:

rinominata la variabile in tensione :wink: :slight_smile:

Tensione batteria con il tester 2.85v
Tensione al pin con il tester 2.15v
Lettura pin ( facendo stavolta una media tra 100 letture ) -> 732
Voltaggio calcolato 3.02v

Tensione batteria con il tester 4.16v
Tensione al pin con il tester 3.15v
Lettura pin ( facendo stavolta una media tra 100 letture ) -> 1024
Voltaggio calcolato 4.22v

Praticamente siamo tornati ai valori del map.

Osservo la cosa da un altro punto di vista

se al pin a0, rilevo con il tester una tensione di 2.15v, se faccio la proporzione ( considerando che il pin ammette valori 0-3.2v )

2,15 : 3,2 = x : 1023
x = 2,15*1023/3,2 = 687 circa

con 687, il calcolo mi darebbe 2.83v
con la batteria più carica invece mi darebbe 1007 ed il calcolo 4.15v

se la lettura mi da 732 c'è qualcosa che non va, che ne pensi?

ilmagowalter:
se la lettura mi da 732 c'è qualcosa che non va, che ne pensi?

Si è la stessa cosa che ti avevo scritto qualche post più su, qualcosa non torna nella conversione AD.
Possibile che il partitore a bordo del tuo wemos non sia quello indicato nello schema elettrico? Magari ci sono valori diversi di resistenze (ma stesso rapporto) e quindi stiamo sballando tutti i conti con la resistenza in serie.

Questa è la foto della scheda, sto cercando di capire quali sono le due resistenze .. cmq è un clone, non è una wemos originale, purtroppo la pagina di aliexpress dove l'ho presa non esiste più

la resistenza accanto ad a a0 il tester mi dice 0,218MOhm, quindi da 218k, e quella subito accanto 94,8k

Le resistenze sono quelle nei pressi del pin A0 e sono come nello schema (224 -> 220K, 01D -> 100K).
A questo punto ho esaurito le ipotesi :confused:

misurandole con il tester sono da 218k, e 94,8k

può darsi che sono queste differenze che fanno la "differenza" ?

ilmagowalter:
rinominata la variabile in tensione :wink: :slight_smile:
...

Per quello non va ... il nome corretto e' "differenza di potenziale", se sbagli nome si offende :stuck_out_tongue:

(scusa, non ho resistito :D)

Scherzi a parte, considera che se sono comuni resistenze con tolleranza 5%, puoi avere piu o meno 5% del valore indicato, poi c'e' la tolleranza del tester (che secondo il modello puo essere anche piu elevata del tipico 1 o 2 % ), qualche possibile contatto proprio non al 100% fra puntali e componenti, possibile ossidazione dello stagno, derive termiche, imprecisione dei riferimenti per l'ADC ... metti tutto assieme ... e comunque stai parlando di pochi millivolt di differenza fra un valore calcolato a tavolino ed uno misurato dal vero ... ci puo anche stare ...

Etemenanki:
Per quello non va ... il nome corretto e' "differenza di potenziale", se sbagli nome si offende :stuck_out_tongue:

(scusa, non ho resistito :D)

hai ragione, ma il nome della variabile è troppo lungo così... magari posso scrivere deltaV :smiley:
tornando all'argomento a questo punto mi faccio un coefficiente di correzione che applico sempre
attesa=1007, effettiva=1024 ---> 1024 : 1007 = 1 : x ---> x = 1007*1/1024 = 0,9834
con questo metodo
per la batteria scarica ottengo 2.94v
per quella carica 4.15V

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.