Newsgroup: it.hobby.elettronica.digitale
Titolo: ADC: risultato variabile con l'alimentazione?

Domanda banale. Normalmente un ADC cambia il suo risultato digitale al 
variare della tensione di alimentazione?
Per esempio, se l'ADC è alimentabile da 4.5V a 5.5V ed in ingresso ho 
sempre una tensione analogica fissa, pari a 1V, il risultato digitale 
del campionamento cambia cambiando la tensione di alimentazione in quel 
range?
Immagino di sì ed è per questo che spesso c'è il pin di reference che 
serve proprio per creare una tensione di riferimento, indipendente 
dall'alimentazione e dalle sue fluttuazioni (e da altri parametri quali 
la temperatura).
Facciamo ora l'ipotesi che la tensione di alimentazione sia 5V e 0-5V 
sia il range della tensione analogica di ingresso. Il reference è 
proprio la tensione di alimentazione. Supponiamo un bel partitore della 
tensione di alimentazione per creare una tensione analogica di 2.5V.
Leggo un valore di 127 (supponiamo 8 bit) e ricavo, appunto, 2.5V (x/255*5).
Ora la tensione di alimentazione cambia e diventa 5.5V. Cambia anche la 
tensione di ingresso a 2.75V. Che valore ottengo come risultato della 
conversione? Se il reference è la tensione di alimentazione (5.5V), 
penso che ottengo sempre 127. Quindi, rifacendo i calcoli (x/255*5), 
riottengo 2.5V, che è un risultato errato.
Avessi utilizzato un reference serio (non la tensione di alimentazione), 
avrei potuto continuare ad ottenere il valore corretto. Una tensione di 
2.75V su un range 0-5V (il reference mi dà proprio 5V) sarà circa un 140 
e quindi (x/255*5) 2.745V.
E' giusto il mio ragionamento?

 E' giusto il mio ragionamento?
Tutto giusto.
Se il reference è la tensione di alimentazione, ed essa varia.. beh 
non la puoi proprio chiamare reference :-)
-- 
  _|/ Francesco Sacchi - Develer S.r.l., R&D dept.
   |\ 
http://www.develer.com/
 - 
http://www.bertos.org

 la puoi proprio chiamare reference :-)
Ok.
Quindi se volessi acquisire, per visualizzare su un display o un 
computer o memorizzare su una memoria, il valore della tensione d'uscita 
di un alimentatore (mediante un semplice partitore), dovrei usare un ADC 
con reference interno o esterno.
Quello che mi preoccupa è che la taratura del partitore (per compensare 
le tolleranze delle resistenze) fatta con una scheda ADC di test, possa 
non andare bene con una seconda scheda ADC. Infatti la seconda scheda 
ADC potrebbe avere un'alimentazione diversa dalla prima (quella di test) 
e darmi dei risultati sbagliati.
Utilizzando un voltage reference per l'ADC (da piazzare sulla scheda del 
partitore o sulla scheda dell'ADC?) dovrei risolvere il problema. Cioè 
cambio scheda ADC, ma il valore visualizzato a display sarà lo stesso, 
giusto?

 giusto?
Esatto.
L'importante è che il riferimento sia *davvero* stabile e che non 
dipenda dalla grandezza che devi misurare.


 riottengo 2.5V, che è un risultato errato.
a parte che 2^8 fa 256 e non 255....direi che la formula va modificata
tenendo conto del fatto che la V di rif. all' ADC è 5.5V....se questa
cambia non puoi tenere fissa a 5V. quindi se vuoi un valore preciso
nella conversione AD devi per forza avere costante la Vref.
emi

 non puoi prendere come reference la tensione di alimentazione stessa.
In realtà l'alimentazione dell'ADC non proviene dall'alimentatore di
cui voglio
misurare la tensione. Ma anche se il segnale da misurare non è un
derivato
della tensione di alimentazione dell'ADC, è bene utilizzare un
reference
che non sia l'alimentazione dell'ADC (che può variare).

 nella conversione AD devi per forza avere costante la Vref.
Sì, il problema è che la tensione nominale dell'ADC è 5V ed io lo
alimento in
quel modo. Però anche un banale 7805 garantisce in uscita una tensione
che può stare tra 4.8 e 5.2, ma tu non lo sai (magari il mio esempio
5.5V
è esagerato...)

 E' giusto il mio ragionamento?
Se leghi la Vref alla tensione di alimentazione ti svincoli dalla sua 
precisione; è la soluzione maggiormente usata.
Se, però, si volessero ottenere risoluzioni più elevate si ricorre a 
Vref inferiori che devono essere quanto più possibili stabili.

 precisione; è la soluzione maggiormente usata.
Preciso, a patto che la tensione analogica incognita sia proporzionale a 
quella di alimentazione (sistema di misura raziometrico, es. la tensione 
di un partitore alimentato a VCC=VREF).


Sì, ma questo va bene quando vuoi misurare per esempio una resistenza. 
In questo caso usare la VCC sia come riferimento per l'ADC che per il 
partitore elimina il problema di avere un riferimento stabile per entrambi.
Ma se invece vuoi misurare la tensione di alimentazione stessa o 
un'altra tensione indipendente, devi per forza avere un reference stabile.
-- 
  _|/ Francesco Sacchi - Develer S.r.l., R&D dept.
   |\ 
http://www.develer.com/
 - 
http://www.bertos.org/

 E' giusto il mio ragionamento?
Ripeto, ti svincoli dalla precisione di Vref se usi un sistema 
raziometrico (tensione da misurare proporzionale alla stessa tensione di 
alimentazione dell'ADC):
Qua te le dimostra con un esempio:
http://www.maxim-ic.com/appnotes.cfm/an_pk/1753

è esagerato...)
Non è esagerato, solo che non devi usare un 7805, ma ad esempio un ic come
questo
http://www.national.com/pf/LM/LM4140.html
4.096V con imprecisione massima di 1%, o questo:
http://www.national.com/mpf/LM/LM4050.html
di cui c'è anche la versione a 5V.
--
ciao
  Stefano

 è esagerato...)
usa un LM317 ed un trimmer ,e regoli la Vout esattamente a 5V

 devi avere 5Vin....
Hai ragione quando dici che la risoluzione si calcola in base al 2^n, ma
non quando dici che si deve aggiungere 1. Quando leggi 255 significa che in
ingresso hai un valore uguale o maggiore di Vref-1LSB, cioè in questo caso
4.9805 V.
-- 
emboliaschizoide.splinder.com

 4.9805 V.
credo che la soglia debba essere a meta' tra i livelli lsb: un adc 0_5v
da un_bit dovrebbe avere soglia a 2.5V .
adc = int(( Vin * conteggio_max / Vref ) + 0.5)
ad esempio un adc 5V 8bit dovrebbe scattare da 0 a 1 a Vin=1/2 lsb e da
0xfe a 0xff a Vin=5V-1/2 lsb
saluti
-- 
  lowcost

dalai lamah ha scritto:

e come faccio a leggere 5V? i datasheet parlano chiaro.....in un uC
con Vref=5V se dai 2.5V leggi 127 ma se dai 5V leggi 255, se applichi
la legge della risoluzione ,per far tornare i conti ,con la formula
indicata ,devi aggiungere uno ,altrimenti c'è un errore di 1LSB.
provato con una scheda a 12 bit su un PC, gli ho dato
10V (la Vref era 10V) ed ho letto 4096....ovvero 2^12. questo come lo
spieghi? in questo caso quando do 0V leggo 0, invece quando do 10V
leggo 4096.....provare per credere.

 0xfe a 0xff a Vin=5V-1/2 lsb
Tutti gli ADC che mi č capitato di vedere eseguono la transizione
esattamente su LSB, senza alcun offset (vedi anche le tabelle che ho
riportato nell'altra risposta). Poi puň esser vero che a un piů alto
livello possa essere a volte opportuno associare il codice con il valore
centrale (ossia ad esempio far corrispondere 0 con 1LSB/2, 1 con 1LSB*3/2,
e cosě via), ma questa č al limite solo una questione di rappresentazione,
non cambia il fatto che le soglie di decisione dell'ADC sono allineate
all'LSB.
-- 
emboliaschizoide.splinder.com

 spieghi?
La cosa mi sembra talmente ovvia e confermata da qualsiasi documento che
quasi non credo di star sostenendo una discussione su questo fatto. O non
capisco a cosa ti riferisci, o mi stai facendo una supercazzola. :)
-- 
emboliaschizoide.splinder.com

 esattamente su LSB, senza alcun offset
Oggi per puro caso ne ho trovato uno (che ho usato spesso in passato) che
ha la soglia sulla meta' dei LSB:
http://focus.ti.com/lit/ds/symlink/ads7844.pdf
Ovviamente resta il discorso che facevo nell'altra risposta; se la
transizione da 0 a 1 avviene a 1LSB/2 anziche' (come di solito) a 1LSB, la
transizione da 2^n-2 a 2^n-1 avverra' a FS-1LSB-1LSB/2 (quindi ancora piu'
indietro).
-- 
emboliaschizoide.splinder.com

 capisco a cosa ti riferisci, o mi stai facendo una supercazzola. :)
Concordo.
Fra l'altro, il valore 4096 non sta nemmeno in 12 bit, ce ne vogliono 13.
Quindi quello che non si spiega e come possa un ADC a 12 bit generare 
un risultato a 13...


 indietro).
sembra che sia proprio cosi'.
allegria
-- 
  lowcost