Go Down

Topic: ADC più preciso (Read 2347 times) previous topic - next topic

monty14

Salve a tutti mi ricordo di una libreria che permette di rendere la conversione analogico digitale di Arduino più precisa, in quanto calcola la giusta tensione di alimentazione della scheda. Non riesco più a trovarla. Qualcuno riuscirebbe a darmi il link??
Grazie
Monty

leo72

Se vuoi una lettura più precisa puoi utilizzare la tensione di riferimento interna a 1,1V: ovviamente dovrai con un partitore portare la tensione da legge nel range 0-1,1.
Con questa, la precisione è di 1,1/1024=0,001V.
http://arduino.cc/en/Reference/AnalogReference

monty14

Il mio problema è  dato dalla tensione di alimentazione che non è sempre 5V precisi. Quindi questo influisce nelle misurazioni, in quanto 1023 letto da analogRead() non corrisponde a 5V ma magari a 4.95. In alternativa come si può leggere la tensione di alimentazione in un dato istante?
Stefano

leo72

Hai letto la pagina che ti ho linkato? Probabilmente no perché altrimenti avresti visto che c'è la possibilità di usare come riferimento la tensione presente sul pin AREF  :P
Se colleghi quel pin alla linea di alimentazione poi hai come riferimente la tensione letta lì quindi se vai a 5V il valore di 1023 sarà per 5V, se sei a 4,95V il valore di 1023 sarà per 4.95V ecc..

monty14

Ho letto ho letto. Il mio problema è capire quanto vale la tensione di riferimento attraverso software.
Monty

leo72


Se colleghi quel pin alla linea di alimentazione poi hai come riferimente la tensione letta lì quindi se vai a 5V il valore di 1023 sarà per 5V, se sei a 4,95V il valore di 1023 sarà per 4.95V ecc..



monty14

Forse mi sono spiegato male io o non ho capito. A causa di vari fattori la tensione di alimentazione di Arduino può variare senza che io lo sappia quindi il valore 1023 non so mai a cosa corrisponda esattamente. Può corrispondere a 5V ma dopo un paio di secondo potrebbe essere 4.95 o 5.02 ecc ecc.. Questo problema è amplificato se Arduino viene connesso con l'USB al PC.
A questo punto io voglio fare una lettura di tensione con analogRead(). Leggo, ad esempio, il valore 345 lo devo dividere per 1023 e poi moltiplicare per 5? per 4.95? per 5.02? ecc ecc
Monty

leo72

Forse non ho capito io il problema ho forse non hai capito tu la spiegazione.

Vediamo di ricapitolare. Se colleghi la tensione di alimentazione al pin AREF il tetto MASSIMO che avrai, cioè 1023, sarà sempre legato alla tensione che circola nel circuito. Per cui se lavori a 5V, 1023 corrisponde a questo valore, se lavori a 4,95V allora 1023 corrisponde a quest'altro.
Ma devi: 1) collegare il pin AREF come detto; 2) impostare analogReference(EXTERNAL) per agganciare il comparatore al valore di AREF.

m_ri

#8
Sep 30, 2012, 04:48 pm Last Edit: Sep 30, 2012, 04:50 pm by m_ri Reason: 1
altra strada?abbassi la tensione del segnale da misurare ,con un partitore resistivo(di cui misuri precisamente gli ohm),alla massima tensione supportata dagli internal reference..questi sono poco dipendentii dalla tensione di alimentazione,se ricordo bene..

leo: forse il suo problema è che a priori non sa la tensione di alimentazione..quindi dovrebbe misurarla..oppure usare un internal reference,che dovrebbe essere stabile..

leo72

Sì, gliel'avevo già suggerito io nel 1° reply, oltretutto ha anche una risoluzione maggiore. Però sta spiegando che la tensione massima del segnale potrebbe oscillare.
Con l'AREF risolve: il massimo letto corrisponde sempre al valore massimo del segnale.

m_ri

si..all'aref dovrebbbe però collegarli una sorgente di tensione nota(tranne in alcuni casi..)

leo72

Se il max valore che può leggere corrisponde a Vcc, basta collegare Vcc ad AREF.
Se il valore da leggere ha una tensione massima diversa allora è un altro paio di maniche.

Michele Menniti

@ Monty: in parole povere se i 5V che alimentano Arduino (a prescindere dalla loro provenienza: USB o esterno) sono gli stessi che vengono applicati al sensore/partitore o addirittura direttamente al pin di Arduino, collegando ARef al pin +5V di Arduino, avrai sempre una lettura corretta in relazione all'alimentazione, senza che tu ti debba preoccupare di quant'è in realtà, perché in ogni istante il valore letto è RELATIVO al valore di alimentazione in quel momento. UN esempio pratico, immaginando di collegare l'alimentazione direttamente al pin ADC:
Istante A: alimentazione 5V esatti, lettura 512 = 50% di ARef = 2,50V
Istante B: alimentazione 4,95V, lettura 512 =  50% di ARef = 2,48V
Ciò significa che a partire dal SOLO valore di lettura ADC NON potrai MAI risalire alla tensione di alimentazione (e quindi a quella letta), ma soltanto al rapporto percentuale, quindi non potrai tradurre 512 in 2,50 o 2,48 ma in "50% della tensione di alimentazione".
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

monty14


@ Monty: in parole povere se i 5V che alimentano Arduino (a prescindere dalla loro provenienza: USB o esterno) sono gli stessi che vengono applicati al sensore/partitore o addirittura direttamente al pin di Arduino, collegando ARef al pin +5V di Arduino, avrai sempre una lettura corretta in relazione all'alimentazione, senza che tu ti debba preoccupare di quant'è in realtà, perché in ogni istante il valore letto è RELATIVO al valore di alimentazione in quel momento. UN esempio pratico, immaginando di collegare l'alimentazione direttamente al pin ADC:
Istante A: alimentazione 5V esatti, lettura 512 = 50% di ARef = 2,50V
Istante B: alimentazione 4,95V, lettura 512 =  50% di ARef = 2,48V
Ciò significa che a partire dal SOLO valore di lettura ADC NON potrai MAI risalire alla tensione di alimentazione (e quindi a quella letta), ma soltanto al rapporto percentuale, quindi non potrai tradurre 512 in 2,50 o 2,48 ma in "50% della tensione di alimentazione".


E' proprio questo il problema in quanto se io alimento tramite USB il risultato viene parecchio sballato. Ad esempio un sensore di temperatura mi rileva 3°C in meno rispetto a quando viene alimentato con un alimentatore.
Monty

uwefed

Ritornando all inizio:
Ci sono 2 tipi di sensori
1) quelli che cambiano la loro resistenza e quelli li metti in serie a una resistenza e ottieni un partitore. Quello lo colleghi ai 5V e a massa. La lettura con il AREF interno di 5V é sempre giusta perché entrambi cambiano la tensione nello stesso modo. Questo vale se le variazioni non hanno una frequenza troppo alta. per i 50Hz non ci sono problemi. Per qualche kHz ci sono problemi perche durante la misura cambia la tensione di riferimento.
2) Sensori che danno una tensione proporzionale al valore leddo indipendente dalla loro alimentazione. Un cambio della tensione di alimentazione/riferimento cambia la lettura. Soluzioni:
* attivare il riferimento interno da 1,1V e diminuire la tensione da leggere con un partitore resistivo.
* misurare con un entrata analogica i 3,3V presenti sull' Arduino e calcolarne la tensione di 5V correggere con quel fattore la misura del sensore.

Ciao Uwe


Go Up