Misura tensione con resistenze

Salve a tutti, cercando in internet ho visto che e' possibile misurare la tensione con Arduino con le entrate analogiche. Io devo misurare la tensione delle batterie per i pannelli solari, tensione superiore ai 5V quindi ho dovuto fare un partitore di tensione. Ho a disposizione delle resistenze da 10kOhm, quindi ho calcolato la corrente, ho messo come tensione massima di 20V.
Calcolo:
I = 20/10000 = 2mA
Tensione massima sul pin analogico 5V,quindi: 5/0.002= 2.5 kOhm
di conseguenza l'altra resistenza sara da 7.5kOhm

Programma Arduino:

void setup() {
Serial.begin(9600);
}

void loop() {
float tensione = (analogRead(A0)*20)/1024.;
Serial.println(tensione);
delay(1000);
  
}

La tensione misurata e' tra i 9V e i 10V, come mai non misuro la tensione corretta di 12.5V?
i calcoli dovrebbero essere giusti,non capisco perché ho questa differenza.
Qualcuno mi può aiutare?

Perché per capire meglio non stampi il valore della analogRead() e ci mostri l'output?

void loop() {
  int lettura = analogRead(A0);
  float tensione = (lettura*20.0)/1024.0;
  Serial.print("lettura="); Serial.print(lettura);
  Serial.print(" tensione=");Serial.println(tensione);
  delay(1000);
}

PS: ma le due resistenze come le hai collegate esattamente? Ossia quale verso +12V e quale a GND?
PS2: hai messo i GND insieme, si?

mozzini97:
. . . Ho a disposizione delle resistenze da 10kOhm,. . .

Come hai fatto a fare 7,5kOhm e 2,5kOhm? Ci fai vedere lo schema elettrico?

Ciao,
P.

Per le resistenza da 2.5kohm ho preso 4 resistenze da 10kohm e le ho messe in parallelo, per quella da 7.5kohm ne ho prese 4 da 10kohm che fanno 2.5kohm e poi ne ho prese 2 da 10kohm cosi da avere quella da 5kohm che poi ho messo in serie a quella da 2.5kohm per realizzare in totale quella da 7.5kohm.
Per la parte delle resistenze dovrebbe essere giusto, non so se il programma e sbagliato oppure no...

mozzini97:
La tensione misurata e' tra i 9V e i 10V, come mai non misuro la tensione corretta di 12.5V?

La tolleranza delle resistenze potrebbe sballare la misura di un 10%
La tensione di riferimento dell'ADC se collegata a Vcc può non essere esattamente 5V, questo potrebbe far sballare di un altro mezzo volt.
Effettivamente però 9..10V mi sembrano bassini.

Segui il consiglio di docdoc.

Ciao,
P.

Statisticamente, più resistenze sono usate per raggiungere un valore, più si riduce l'errore complessivo.

Ti stavo suggerendo una cosa, ma vedo che la lettura della tensione qui è nel loop, perciò continua.
Se non fosse stato così, avresti dovuto mettere un delay(500); circa nel setup per aspettare che la tensione di alimentazione si stabilizzi all'accensione e un analogRead(A0); prima della lettura se questa non è continua.

Anche io di solito ho problemi di questo tipo quando cerco di usare arduino come voltmetro.
E in genere mi trovo sempre che l'alimentazione non è quella che mi aspettavo.
Ad es. alimentato con usb dal pc, mi trovo spesso valori più vicini ai 4V che ai 5V.
Sarà la usb del mio pc che è un po' ballerina anche se non sta erogando molta corrente perchè di attaccato c'è solo arduino e poco altro :frowning: .
Comunque, per non saper ne leggere ne scrivere, mi affido a dei riferimenti esterni di tensione come ad es. LM336 che sono più precisi dei miei strumenti di misura, quindi mi vanno più che bene.
Faccio una analogRead() di questi riferimenti e poi mi ricalcolo tutto il resto con delle normali proporzioni.
In questo modo mi riesco anche a calcolare il valore dell'alimentazione di Arduino.
Ho provato anche con il riferimento interno, ma non mi ci sono trovato molto bene, per cui preferisco con uno esterno anche se mi occupa un pin analogico in più ma mi da valori più precisi.
Facendo così sono arrivato a misure molto vicine a quelle che faccio con il tester, o meglio, entro le tolleranze del tester.
Non ho strumenti da laboratorio e su breadboard le letture sono comunque molto variabili, però per i miei scopi è sufficiente. Una volta saldato tutto sulle schede definitive le variazioni diminuiscono di parecchio, uno o due per mille (per mille e ventiquattro per l'esattezza :wink: ).
Tutti i test che ho fatto con il riferimento interno li ho fatti su breadboard, forse è per questo che non ne sono rimasto soddisfatto, la breadboard aggiunge molto casino ai segnali, per cui non sono mai stabilissimi. Per di più le mie breadboard sono di infima qualità, ma non mi tange più di tanto, perchè il circuito lo riesco a testare meglio e in condizioni più estreme, quando poi finisce saldato in basetta può solo migliorare.

Maurizio

Non credo che la tolleranza delle resistenze con cui ha fatto il partitore abbiano un errore cosí grande che é la causa del problema di misura. Comunquee facile a controllare. Misura la tensione della Batteria e la tensione che ese dal partitore. I Valori dovrebbero avere un rapporto di 1 a 4.

Darei la colpa alla tensione di alimentazione del Arduino che viene uasto anche come tensione di riferimento.
Se non sono 5V precise anche la misura ADC é errata. Misura la tensione di alimentazione del Arduino ( pin 5V e GND.

Ciao Uwe

Se la tensione visualizzata è più bassa del 25% circa, vorrebbe dire che la tensione di riferimento è più alta del 25%: 6V anziché 5V! Non può essere...

Salve a tutti e grazie mille per le numerose risposte e soluzioni proposte,sono riuscito ad avvicinarmi ai valori misurati con il tester, chiaramente non posso pretendere di avere delle misure esatte perché essendo un'impianto fotovoltaico casalingo non ho una grande precisione, per la misura probabilmente l'errore potrebbe essere dovuto anche ai carichi che collego, contenenti bobine e condensatori che disturbano le misurazioni. Misurando spesso la tensione e soprattutto non avendo una tensione stabile ma che continua ad oscillare alcune volte mi avvicino al valore misurato e altre volte sbaglia di molto ma va beh non mi serve una precisione assoluta. Penso che proverò ad adottare la soluzione di maubarzi se gentilmente puoi mandarmi lo schema elettrico cosi poter realizzare questo sistema. Grazie mille a tutti :slight_smile:

Allora, io faccio così, ad es. per l'LM336 che ha un riferimento fisso a 2,5V, se guardi il datasheet a pagina 2, trovi le typical applications

lm336.png

Occhio che ci sono anche altri schemi a seconda delle necessità, quindi non limitarti a quello che ho riportato io, ma dai un'occhiata anche agli altri se possono fare al caso tuo.

Uso due pin analogici, il primo per l'LM336 e il secondo per il partitore della tensione che mi interessa misurare.
Faccio due letture sequenziali, la prima sull'LM336 e la seconda sul circuito da monitorare.
Ora, la lettura analogica va da 0 a 1023, il 1023 corrisponde alla tensione di alimentazione del tuo arduino, quindi in teoria i 5V stabili.
Assumendo che l'alimentazione sia perfetta a 5V dovresti trovare una lettura dell'LM336 pari a 1023/2 visto che il riferimento è a 2,5V.
Se non è così, non hai Vcc = 5V.
Io ad es. mi trovato una Vcc = 4V (arrotondo per semplicità), quindi il mio 1023 corrispondeva a 4V e non a 5V, facendo la semplice proporzione 1023 : 4V = x : 2,5V ricavi il valore atteso della lettura analogica del tuo l'LM336 che diventa 639 invece dei 512 attesi per l'alimentazione a 5V.
Assumiamo che invece leggi 600, da questo ti ricavi una Vcc di 1023 : Vcc = 600 : 2,5 => Vcc = 4,26V
Ora, se al posto dei 600 metti la lettura del tuo campione da monitorare, trovi la sua tensione con lo stesso calcolo fatto per Vcc.

Se non ricordo male, l'alimentazione è da pannello solare, quindi potrebbe variarti nel tempo, mi sa che ci hai messo un condensatore un po' corposetto per livellare un pelo le varie fluttuazioni, qualche centinaio di uF, giusto?
Questo ti dovrebbe garantire abbastanza stabilità tra le due letture per rendere il calcolo sufficientemente affidabile perchè la Vcc non dovrebbe cambiare troppo repentinamente tra le due letture, che se fai in rapida successione sono vicinissime.
E comunque, per migliorare le cose, io suggerisco sempre di fare un tot di letture e prenderne la media per evitare picchi spuri.
Ad es. 10 letture alternate dell'LM336 e del tuo campione.

Altro voltage reference che uso è il TL431.
Questo ha una Vref variabile da 2,5V-36V e la puoi decidere in base ad un partitore fatto con resistenze.
Trovi i circuiti da pag. 25.

tl431.png

La sua Vref interna è di 2,5V, ma in base alla tensione di alimentazione e allo schema di pagina 25 (Figura 27) puoi avere un riferimento differente in base alla formula
Vo = (1 + R1/R2) * Vref
Ovviamente la tensione di alimentazione Vsupp deve essere maggiore della Vo che vuoi ottenere.
Leggi quanto scritto da 10.2.1.1 in poi, che spiega come dimensionare le varie resistenze per garantire una corretta polarizzazione, altrimenti il dispositivo non si comporta come atteso.

Dovresti poter ottenere lo stesso risultato con il riferimento interno a 1,1V, però, per farlo, devi impostare il range di misura a 1,1V, riducendo a 1/5 la tensione massima che puoi leggere, a me non piace perchè diventa più difficile fare i partitori di tensione per ridurre tutti i punti da misurare a questa tensione massima a cui i vari disturbi assumono un peso 5 volte maggiore. E' fattibile, ma si hanno meno tolleranze e io non mi ci trovo molto bene, per cui preferisco usare i riferimenti esterni facendo le misure a 5V di fondo scala.
Quando ho adottato questo approccio mi sono fatto scorta su AliExpres di questi componenti e con pochi euro me ne sono presi a decinaia.

Quando ho iniziato a studiarmi un po' Arduino, dalle varie letture fatte mi sono estratto l'elenco dei componenti più comuni e interessanti che potevano servirmi in futuro e con pochissima spesa mi sono fatto una dotazione preventiva di sopravvivenza e in un paio di mesi mi son ritrovato ben fornito per poter sperimentare un po' di tutto.

Maurizio

lm336.png

tl431.png

Leggo che ci attacchi carichi induttivi. Intendi relè o motori?
Se è così vedi di isolare bene questi carichi per non avere i vari disturbi di ritorno.
Per i motori ci sono i vari circuiti di pilotaggio che dovrebbero già fare del loro.
Comunque, ti consiglio di valutare anche gli EL817, sono degli accoppiatori ottici con cui puoi isolare completamente i circuiti con i carichi induttivi in modo da non avere i relativi disturbi sul circuito di comando.
Su molte schede prefatte per pilotare relè, ci sono già.
Dacci un'occhiata che male non fanno.
Qui il datasheet per darti un'idea.

Maurizio

mozzini97:
non avendo una tensione stabile ma che continua ad oscillare alcune volte mi avvicino al valore misurato e altre volte sbaglia di molto

Se fai una media di letture prendile in numero pari e distanziate esattamente 10ms l'una dall'altra, così elimini l'eventuale ronzio 50Hz.

Claudio_FF:
Se fai una media di letture prendile in numero pari e distanziate esattamente 10ms l'una dall'altra, così elimini l'eventuale ronzio 50Hz.

io non direi

se fai così, ammesso che si possa (ovvero che la frequenza dell'oscillatore di arduino sia stabile e sincrona con la frequenza di rete)
dicevo, ammesso che si possa prenderesti il ronzio sempre nello stesso "istante" della semionda, e quindi semmai lo enfatizzi, al massimo compensi eventuali distorsioni di armoniche pari, ma non ci conterei troppo

semmai devi prendere tante misure ben distribuite durante due semionde (per compensare eventuali armoniche pari), ma anche qui ....

io lascerei stare, salvo prova contraria

Non ho mai faticato tanto per leggere una tensione...

Grazie mille a tutti per le risposte e soprattutto grazie a
maubarzi
per la risposta dettagliata e molto ben spiegata, per livellare la tensione io personalmente non ho inserito un condensatore perché la carica e la scarica delle batterie e la gestione dei pannelli viene gestita separatamente. A me servirebbe solo misurare la tensione delle batterie per poi utilizzare questo valore per una pagina web, leggendo in rete ci sono molti schemi e molte idee per leggere la tensione, alcuni applicano dei sistemi molto rudimentali che a parer mio utilizzando delle resistenze non si potrà mai arrivare a un buon risultato dato che i loro valori sono influenzati da fattori esterni che non possiamo sempre controllare.Detto questo, non esiste un modulo da collegare ad arduino per fare una misurazione della tensione abbastanza precisa?
Mi sembra strano perché ci sono moduli per qualsiasi cosa,io personalmente non ne ho ancora trovato uno,magari voi che siete più esperti sapete dove trovarli.

Ringrazio ancora tutti per la disponibilità e auguro una buona serata

Standardoil:
ammesso che si possa prenderesti il ronzio sempre nello stesso "istante" della semionda

Ho scritto 10ms non 20 :wink: Il sincronismo non è indispensabile, si fa una misura, poi delay 10000µs e altra misura, somma e diviso due. Questo per un hum altenato costante sovrapposto al segnale continuo utile. Se i disturbi sono aleatori non serve a niente.

sinus.png

sinus.png

Boh...

Non è lavoro mio convincerti