Partitore di tensione - Voltage divider

Salve raga.. Ho bisogno ancora del vostro aiuto. Vecchio scheletro...
In un progetto che sto portando avanti da un po (senza entrare nel dettaglio è un radiocomando bluetooth con uno schermo 0,96" ecc ecc) voglio implementare la possibilità di leggere la carica della batteria.
Un passo indietro.
Il progetto prevede la possibilità di poterlo alimentare sia con una lipo 2s che con una 3s (non contemporaneamente). Tramite un ACS712 non ho problemi con la lettura degli assorbimenti (cosa che mi serve per "calcolare" indicativamente quanto tempo ancora di autonomia rimane avendo il dato iniziale che è la capacità della batteria stessa). A questo punto vorrei implementare dei partitori di tensione per calcolarne (con una certa precisione anche perchè parliamo di valori come ben sapete vanno da 4,2v a 3,7v ) la tensione di ogni singola cella (quindi in totale dovrei tirar su 3 partitori).
Sul pcb finale sono previsti un ams1117 5v ed un ams1117 a 3.3v opportunamente "condensati" :smiley:
I miei scheletri
Ho capito la formula (intesa come operazione matematica) per calcolare il valore delle due resistenze. Ma non ho una misura per rapportare le resistenze a dovere. Se ho una Vin da 15v (anche se è impossibile con una 3s) ed Ra = 680 ohm ed Rb = 330 ohm avrò una Vout = 4.901v (calcolatore Pighixxx grazie :wink: )
Il fatto è che se io utilizzo una 6k8 e 3k3 sempre 4.901v avrò. Quindi qual'è la differenza? (immagino sicuramente in potenza dissipata, la butto li).
Secondo quesito. Come posso utilizzare gli ams1117 (o il 5v o il 3.3v) come comparatore di tensione e quindi come Aref external?
Ho letto vecchi forum (2016 :confused: ) qui, ma nessuno che mi da le informazioni che cerco (o meglio, solo in parte).
perdonatemi se ho detto castronate quantistiche supergalattiche, sto imparando a camminare :smiley:

Grazie in anticipo.
PS: vado a nanna adesso, domani inizia il corso per la patente delle moto dell'amministrazione :smiley: :smiley: :smiley:

Normalmente non cambia niente, perché nel partitore di tensione conta solo il rapporto tra le due resistenze.

... tuttavia...

Nel tuo caso, la corrente che alimenta quel circuito va essenzialmente sprecata e ti scarica la batteria, per cui deve assolutamente essere il più bassa possibile! Di conseguenza, devi scegliere le resistenze più grandi che puoi.

In un caso come il tuo, io uso 1M e 330k (vedi R4/R5 poco sotto il centro). Questo dovrebbe portare la tensione in un range misurabile col riferimento interno (1.1V). Nota che in teoria Arduino non può misurare un ingresso con un'impedenza così alta col suo ADC, per questo ho aggiunto il condensatore da 100n (C5) in parallelo.

Ok, ma lato sw ti limiti a mappare l'analogRead sull'analagico collegato al partitore?

Come posso utilizzare gli ams1117 (o il 5v o il 3.3v) come comparatore di tensione e quindi come Aref external?

::slight_smile:

EDIT: aspetta che aggiorno, sto googlando un po e forse ne vengo a capo da solo. :wink:

EDIT 2: allora, mi è più chiaro adesso Aref grazie a questa googlata, ma mi sorgono un paio di dubbi ancora.

1 - dice l'articolo che il valore minimo come voltaggio di riferimento è 1.1v. Vale anche con la tensione di riferimento esterna? (quindi leggendo un valore al di sotto di 1.1v restituisce 0)

2 - avendo un joystick sul mio progetto, ponendo l'Aref esterna dal ams1117 3.3v, dovrei alimentare anche lui (joystick) a 3.3v poiché in via teorica restituirebbe, in alcune posizioni, valori di tensione superiori a 3.3v. Se fosse così sarebbe più sensato Aref a 5v e joystick a 5v.

Sono a tutt'orecchie...

tenendo sempre a mente che le resistenze che ci "rifilano" sono resistenze con tolleranza +/- 5%,
se si vuole precisione bisogna tenerne conto,

Sposto il mio edit qui a seguito della risposta di elrospo (grazie) salvo qualcuno interessato salti la lettura del mio edit

EDIT 2: allora, mi è più chiaro adesso Aref grazie a questa googlata, ma mi sorgono un paio di dubbi ancora.

1 - dice l'articolo che il valore minimo come voltaggio di riferimento è 1.1v. Vale anche con la tensione di riferimento esterna? (quindi leggendo un valore al di sotto di 1.1v restituisce 0)

2 - avendo un joystick sul mio progetto, ponendo l'Aref esterna dal ams1117 3.3v, dovrei alimentare anche lui (joystick) a 3.3v poiché in via teorica restituirebbe, in alcune posizioni, valori di tensione superiori a 3.3v "se collegato a 5v". Se fosse così sarebbe più sensato Aref a 5v e joystick a 5v.

Sono a tutt'orecchie...

  • dice l'articolo che il valore minimo come voltaggio di riferimento è 1.1v. Vale anche con la tensione di riferimento esterna? (quindi leggendo un valore al di sotto di 1.1v restituisce 0)

Ora non ricordo che tensione minima puoi applicare al Vref, comunque è il valore max di riferimento. Ovvero leggi una tensione da 0 al valore max del Vref.
Se dai ad esempio un Vref a 1.1V e applichi una tensione di 0.55V su un pin analogico, ti darà come lettura 512

2 - avendo un joystick sul mio progetto, ponendo l'Aref esterna dal ams1117 3.3v, dovrei alimentare anche lui (joystick) a 3.3v poiché in via teorica restituirebbe, in alcune posizioni, valori di tensione superiori a 3.3v. Se fosse così sarebbe più sensato Aref a 5v e joystick a 5v.

Se dai sul Vref 3.3V, ottieni un valore di 1023 se leggi una tensione di 3.3V. Puoi anche dare una tensione maggiore sull' input analogico, ( ma non deve mai superare la VCC ) ma leggerai sempre 1023

miky_police:
Se ho una Vin da 15v (anche se è impossibile con una 3s) ed Ra = 680 ohm ed Rb = 330 ohm avrò una Vout = 4.901v (calcolatore Pighixxx grazie :wink: )

Questo nel mondo ideale.

Nella realtà le resistenze hanno una tolleranza (le più comuni 5%), quindi la tensione del partitore avrà una tolleranza doppia di quella delle resistenze, alias un possibile errore del 10% sul PighiRisultato.

E peggio ancora, due partitori identici possono dare misure differenti.

Quindi dovrà essere effettuata (per ogni partitore) una apposita calibrazione controllando cosa riporta analogRead in presenza di una tensione campione ai capi del partitore.

Ma a questo punto se aref non è preciso e indipendente dalla tensione di alimentazione, la precisione delle letture può variare anche al variare della tensione di alimentazione invalidando la calibrazione.

Ho tralasciato l'eventuale captazione di ronzio 50Hz (che richiederebbe due misure distanziate esattamente 10ms) e il rumore di quantizzazione (che richiederebbe la media di più coppie).

Fare le cose bene richiede sempre fatica :slight_smile:

NOTA: l'unico caso in cui la precisone di aref non conta molto è la lettura di un potenziometro/joystick alimentato dalla stessa tensione di aref (anche non stabilissima), in quanto in ogni caso la posizione percentuale del cursore viene riportata paro paro come percentuale sul range 0..1023

Claudio_FF:
Ho tralasciato l'eventuale captazione di ronzio 50Hz (che richiederebbe due misure distanziate esattamente 10ms) e il rumore di quantizzazione (che richiederebbe la media di più coppie).

Qua c'è da prendere appunti :o

Raga scusatemi ma mi sto perdendo un attimo per strada.

Parto da alcuni concetti chiave che a volte do per scontato, ma se errati mi sballa tutto il ragionamento.
Come spiegato qui con il comando analogRead() non si fa altro che chiedere all'mcu di mappare un voltaggio che può andare da 0 e +5v in un valore che va da 0 a 1023.

Ovviamente deve avere un voltaggio di comparazione stabile per avere una lettura attendibile, ed ecco qui l'adc a 10 bit 5v interno all'mcu abilitata di default dalla stessa {analogReference(DEFAULT)}

Siccome la tensione dell'adc potrebbe non essere perfettamente +5v ovviamente potremmo andar incontro a delle letture pressoché reali ma non precisissime.

Come risolvo il problema? Uso una tensione esterna stabile (+5v o +3.3v) come riferimento {analogReference(EXTERNAL)}.

Di qui penso: se la tensione esterna è a 3.3v l'mcu mappa valori di tensione sugli I/O analogici da 0 a 3.3v in valori da 0 a 1023 (e qui aggancio la domanda di prima inerente alle letture sotto 1.1v... vengono lette? 0.85v riesce a leggerli?)

Poi mi chiedo. Se il mio potenziometro da 10k è collegato alla +5v i valori in tensione che potrà darmi saranno da 0 a +5v... ma se ho un Aref esterno a +3.3v tutti i valori che andranno sopra a quel voltaggio verranno mappati a 1023 (per logica)...

Domanda per il partitore.
Se uso un Aref a 3.3v devo obbligatoriamente calcolarne uno che stia nei +3.3v out.

PS: pensadoci bene non ho una Vin da +15v, ma avrò una Vin da +4,2v x 3 con una lipo 3s o x2 con una lipo 2s. I +12.6v totali con una 3s a batteria carica dovrebbe essere la somma teorica dei 3 partitori letti...

Sono pronto ad incassare... :cold_sweat: :zipper_mouth_face:

PS: intanto leggo a pagina 305 del datasheet 328
Prima castronata: l'internal reference è 1.1v non 5v... andiamo avanti...

Sintesi: l'ADC mappa le tensioni comprese tra 0 e il riferimento nel range 0..1023, qualsiasi sia il riferimento, con il vincolo che comunque non può superare l'alimentazione.

Quindi un riferimento 1.1V mappa le tensioni tra 0 e 1.1V nel range 0..1023

Non capisco la somma dei partitori, vuoi monitorare singolarmente ogni cella?

Claudio_FF:
Non capisco la somma dei partitori, vuoi monitorare singolarmente ogni cella?

Colpito e affondato...

Allora la somma totale la ottieni già dal partitore collegato tra massa e la tensione più alta. Casomai ottieni la tensione delle celle "superiori" dalla differenza tra le misure.

In alternativa si usa un doppio amplificatore differenziale per misurare direttamente la tensione delle singole celle nel range 0..4.2V: