Loading...
Pages: [1] 2   Go Down
Author Topic: Voltmetro con arduino e lettura su partitore di tensione  (Read 863 times)
0 Members and 1 Guest are viewing this topic.
Messina
Offline Offline
Jr. Member
**
Karma: 0
Posts: 74
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salve a tutti ragazzi, voglio costruire un voltmetro 0-70 VDC con partitore resistivo,
dove R1 = 560Kohm e R2 = 27Kohm
quindi in andata all'input analogico di arduino avremo un'uscita che varia da 0V a 3,220V
ovviamente non utilizzo un partitore che mi faccia andare direttamente all'input analogico 5V ma mi mantengo al di sotto per garantirne la sicurezza in modo che se la tensione dovesse superare i 70 volt non brucio il pin dell'arduino, il problema adesso sta nella "decodifica" del valore letto
come faccio a far visualizzare su un lcd la tensione letta?...l'lcd lo so gestire...è la parte di conversione che non riesco a fare....chiedo aiuto a voi....vi ringrazio in anticipo per le risposte. un saluto
Logged

Forum Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 219
Posts: 16479
Don't know what I do
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Devi usare l'analogRead per leggere la tensione sul pin e convertirla in un valore a 10 bit, cioè compreso fra 0 e 1023.
1023 equivale ovviamente alla lettura abbinata ai 5V dell'Arduino ma la tua lettura massima sarà inferiore visto che fornisci una tensione massima di 3,22V.
Letto il valore, devi fissare il massimo con dei test, fornendo al partitore il massimo di tensione (70V) e vedendo cosa ti "sputa" fuori la lettura analogica.
A quel punto, con una proporzione matematica converti la lettura in tensione.

C'è però il problema della risoluzione. Con 10 bit ed una tensione in ingresso compresa fra 0 e 3,22V hai una risoluzione minima non molto elevata. Se non ti interessa la precisione al millesimo di volt...  smiley-wink
Logged


BZ (I)
Online Online
Brattain Member
*****
Karma: 162
Posts: 15732
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Visto che serve una certa corrente per caricare il condensatore sample and hold interno del convertitore analogico digitale del ATmega il Tuo partitore ha un impedenza troppo alta. Usa un operazionale come inseguitore di tensione per alzare l'impedenza di entrata.
http://it.wikipedia.org/wiki/Amplificatore_separatore

Ciao Uwe
Logged

Messina
Offline Offline
Jr. Member
**
Karma: 0
Posts: 74
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

potrei anche ridurre l'impedenza mantenendo gli stessi valori di tensione in ingresso....ad esempio 56K e 2,7K o 560ohm e 27 ohm...sempre 3,22V erogano...il problema reale ce l'ho nella "proporzionale matematica"... smiley leo72, mi potresti far vedere qualche esempio utilizzando le resistenze del partitore come "resistenze ideali" e quindi esatte senza errori del 5% ecc...poi farò le varie prove confrontando con un multimetro per settare correttamente il tutto...a parte che in matematica non sono molto ferrato... smiley-lol comunque mi è più che sufficiente una lettura di xx,xx Volt anche se non è precisissima...ma in linea di massima...grazie intanto per l'aiuto...
Logged

Forum Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 219
Posts: 16479
Don't know what I do
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

La proporzione la devi fare sul valore letto, lascia stare le R  smiley-wink
Devi leggere con l'analogRead il valore che corrisponde ai 70V, questo è il valore max di riferimento.
Mettiamo che sia 800 per convenienza.
A questo punto sai che la lettura 0-800 indica una tensione 0-70V.
Usa la map e risolvi:
Code:
tensione = map(lettura, 0, 800, 0, 70);
« Last Edit: March 02, 2013, 06:25:21 pm by leo72 » Logged


Messina
Offline Offline
Jr. Member
**
Karma: 0
Posts: 74
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho letto il reference sulla map....non ho capito cos'è 800....forse ho intuito, ma preferisco una conferma da parte tua...dunque considerando sempre resistenze ideali 3,22V è il 64,4% di 5V quindi 775 è il 64,4% di 1024....intendevi questo con 800? quindi facendo:
tensione = map(lettura,0,755,0,3.22);
dovrei avere la corrispondente...adesso mi sorge un dubbio...così io sto specificando che il 3,22V è pari a 755 e 0 è pari a 0..giusto?...ma per la lettura di tensione come dovrei comportarmi? devo scrivere qualcosa che mi interpreti la lettura convertendomela nel mio valore in volts...in questo caso applicando la tensione di 3,22 all'input analogico avrei che la tensione fornita all'input fa valere la lettura analogica 755 e quindi il parametro lettura restituisce un valore di 3,22 giusto? ma se io utilizzassi
tensione = map(lettura0,755,0,70.00);
avendo la stessa tensione in ingresso (da 0 a 3,22 e quindi da 0 a 755), questa volta non avrei un valore che va da 0 a 70V?
intanto ho trovato anche questo che utilizza il partitore: http://arduinoprojects101.com/arduino-voltmeter/
grazie ancora per l'aiuto...
Logged

BZ (I)
Online Online
Brattain Member
*****
Karma: 162
Posts: 15732
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sí, i 800 erano il valore letto dal convertitore presunto.

Se il partitore porta i 70V a 3,22 V puoi anche scrivere:
Code:
tensione = map(lettura0,755,0,70.00);

comunque sei consapevole che riesci solo a leggere i decimi di V?

Ciao Uwe


Logged

Forum Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 219
Posts: 16479
Don't know what I do
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@peppe:
800 era un valore indicativo, l'avevo specificato  smiley-wink
Invece hai ragione tu sui 3,22V. Dovevo mettere 70.0V perché tu vuoi la lettura nell'intervallo 0-70V.
Logged


Messina
Offline Offline
Jr. Member
**
Karma: 0
Posts: 74
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

si uwefed, ne sono consapevole, per l'applicazione in cui verrà utilizzato non sono importanti centesimi ecc... smiley quindi va benissimo così grazie 1000;)
leo grazie 1000 ancora per l'aiuto, e grazie soprattutto per avermi fatto scoprire la funzione map...a me ignota e a quanto pare ignota anche ai manuali su arduino letti fino ad ora... smiley-wink un saluto e un sincero grazie a tutti voi che mi avete aiutato... buonanotte.
« Last Edit: March 02, 2013, 06:34:05 pm by peppe91 » Logged

BZ (I)
Online Online
Brattain Member
*****
Karma: 162
Posts: 15732
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

su http://arduino.cc/en/Reference/HomePage trovi un bel po di funzioni C. Tanti altri sono del C e percui devi consultare un Tutorial o libro di C.

Ciao Uwe
Logged

Messina
Offline Offline
Jr. Member
**
Karma: 0
Posts: 74
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

salve ragazzi, ho quasi finito, ma ho un problema...mi sono accorto con il map che va con i numeri interi....ma io vorrei visualizzare almeno il mezzo volt ecc... quindi ho deciso di fare così ad esempio:
Code:
const int partitore = A0;
float voltage = 0.00;

void loop(){
lettura = analogRead(partitore);
voltage=(50/1024)*lettura //50 sono i volts di soglia che utilizzo...l'ho abbassata per aumentare la precisione
}
presumo sia corretto...ma non capisco perchè mi visualizza solo numeri interi con la virgola tipo 20.00 ....come posso fare per fargli visualizzare anche i decimali con una discreta precisione? grazie in anticipo...un saluto

edit by mod:
per favore usa gli appositi tag per includere il codice
« Last Edit: March 08, 2013, 05:07:13 am by leo72 » Logged

Forum Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 219
Posts: 16479
Don't know what I do
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Devi specificare espressamente i float:
Code:
voltage=(50.0/1024.0)*(float)lettura
Il ".0" dice che il numero è un float, mentre il casting di lettura lo fai da (float)

Logged


Cagliari
Online Online
Faraday Member
**
Karma: 49
Posts: 3029
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

per una risoluzione maggiore ponticella 3V3 con AREF e metti nel setup()
Code:
analogReference(EXTERNAL)

La formula diventa:
Code:
const int partitore = A0;
float voltage = 0.00;

void loop(){
lettura = analogRead(partitore);
voltage = (3.3 * lettura / 1024.0); // restituisce i volt letti dall'ingresso analogico
voltage = voltage * (50 / 3.3) + 0; // scala il valore nell'intervallo 0-50V

Naturalmente i passaggi possono essere contratti e diventa:
Code:
voltage = lettura / 20.48; // restituisce i volt

Che diventa insensibile al riferimento usato ma in base ad esso aumenta la risoluzione della scala.
Logged


BZ (I)
Online Online
Brattain Member
*****
Karma: 162
Posts: 15732
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

per una risoluzione maggiore ponticella 3V3 con AREF e metti nel setup()
Code:
analogReference(EXTERNAL)

Non capisco come un cambio del riferimento potrebbe cambiare la risoluzione.
Se con un partitore resistivo porti i 50 V a 5 o a 3,3V e usi come riferimento 3,3V  la risouzione non cambia.
Cambia la precisione perché i 3,3V sono piú precisi rispetto ai 5V e una sovvratensione puó essere maggior prima di rompere l'Arduino. L' entrata analogica resiste sempre fino a ca 5V. con un partitore 50/5 c'é poco gioco. Con un partitore 50/3,3  la tensione puó arrivare fino a 75V.

Ciao Uwe
Logged

Cagliari
Online Online
Faraday Member
**
Karma: 49
Posts: 3029
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Io intendo per risoluzione la minima differenza misurabile. Quindi se passi da un fondo scala di 5V ad un fondo scala di 3V3, sempre dividendo in 1024 step, avrai una maggiore risoluzione perché diventa più piccolo l'intervallo misurabile. Aumenti la sensibilità dello strumento.
La precisione, invece, indica quanto ci si avvicina al valore della misura, ovvero più preciso è una lettura minori saranno le differenze tra i vari valori misurati.
Logged


Pages: [1] 2   Go Up
Print
 
Jump to: