Messina
Offline
Jr. Member
Karma: 0
Posts: 74
|
 |
« on: March 02, 2013, 04:56:48 pm » |
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
Brattain Member
Karma: 219
Posts: 16479
Don't know what I do
|
 |
« Reply #1 on: March 02, 2013, 05:06:29 pm » |
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... 
|
|
|
|
|
Logged
|
|
|
|
|
BZ (I)
Online
Brattain Member
Karma: 162
Posts: 15732
+39 349 2158303
|
 |
« Reply #2 on: March 02, 2013, 05:18:31 pm » |
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_separatoreCiao Uwe
|
|
|
|
|
Logged
|
|
|
|
|
Messina
Offline
Jr. Member
Karma: 0
Posts: 74
|
 |
« Reply #3 on: March 02, 2013, 05:28:46 pm » |
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"...  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...  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
Brattain Member
Karma: 219
Posts: 16479
Don't know what I do
|
 |
« Reply #4 on: March 02, 2013, 05:51:41 pm » |
La proporzione la devi fare sul valore letto, lascia stare le R  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: tensione = map(lettura, 0, 800, 0, 70);
|
|
|
|
« Last Edit: March 02, 2013, 06:25:21 pm by leo72 »
|
Logged
|
|
|
|
|
Messina
Offline
Jr. Member
Karma: 0
Posts: 74
|
 |
« Reply #5 on: March 02, 2013, 06:19:32 pm » |
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
Brattain Member
Karma: 162
Posts: 15732
+39 349 2158303
|
 |
« Reply #6 on: March 02, 2013, 06:22:34 pm » |
Sí, i 800 erano il valore letto dal convertitore presunto. Se il partitore porta i 70V a 3,22 V puoi anche scrivere: 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
Brattain Member
Karma: 219
Posts: 16479
Don't know what I do
|
 |
« Reply #7 on: March 02, 2013, 06:25:01 pm » |
@peppe: 800 era un valore indicativo, l'avevo specificato  Invece hai ragione tu sui 3,22V. Dovevo mettere 70.0V perché tu vuoi la lettura nell'intervallo 0-70V.
|
|
|
|
|
Logged
|
|
|
|
|
Messina
Offline
Jr. Member
Karma: 0
Posts: 74
|
 |
« Reply #8 on: March 02, 2013, 06:29:01 pm » |
si uwefed, ne sono consapevole, per l'applicazione in cui verrà utilizzato non sono importanti centesimi ecc...  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...  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
Brattain Member
Karma: 162
Posts: 15732
+39 349 2158303
|
 |
« Reply #9 on: March 02, 2013, 07:02:11 pm » |
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
Jr. Member
Karma: 0
Posts: 74
|
 |
« Reply #10 on: March 07, 2013, 08:16:43 pm » |
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: 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
Brattain Member
Karma: 219
Posts: 16479
Don't know what I do
|
 |
« Reply #11 on: March 08, 2013, 05:11:38 am » |
Devi specificare espressamente i float: 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
Faraday Member
Karma: 49
Posts: 3029
|
 |
« Reply #12 on: March 08, 2013, 08:43:25 am » |
per una risoluzione maggiore ponticella 3V3 con AREF e metti nel setup() analogReference(EXTERNAL) La formula diventa: 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: 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
Brattain Member
Karma: 162
Posts: 15732
+39 349 2158303
|
 |
« Reply #13 on: March 08, 2013, 01:39:21 pm » |
per una risoluzione maggiore ponticella 3V3 con AREF e metti nel setup() 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
Faraday Member
Karma: 49
Posts: 3029
|
 |
« Reply #14 on: March 08, 2013, 05:31:47 pm » |
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
|
|
|
|
|
|