Newsgroup: it.hobby.elettronica.digitale
Titolo: Un problema bizzarro con un ADC

Ciao a tutti.
Mi sta capitando una cosa abbastanza strana con un ADC e, finite le
idee, provo a chiedere aiuto ....
Sto realizzando un sistema di misura che utilizza un ADC a 16 bit (
AD976AN - Analog Devices ). I dati campionati vengono trasferiti ad un
PC via USB tramite il modulo DLP-USB245M della FTDI. Il controllo del
sistema e' demandato ad un PIC 16F887A. Lato PC un programma in VB6 si
occupa del trasferimento dati, visualizzazione e salvataggio su file.
PIC, ADC e modulo USB condividono un bus a 8 bit che viene impegnato
prima dall'ADC per il trasferimento al PIC ( mentre il modulo USB è ad
alta impedenza) e poi dal modulo USB per ricevere i dati da inviare dal
PIC ( mentre l'ADC e' ad alta impedenza)
Ho tenuto questa prima descrizione abbastanza generica per non
appesantire il post, ma posso fornire maggiori dettagli.
La strana cosa che succede e' la seguente : applicando in ingresso
all'ADC un valore DC, mi aspetterei di avere delle letture centrate sul
valore di campionamento, con una distribuzione gaussiana attorno a
questo valore a causa del rumore. Lo "spettro" della gaussiana dovrebbe
essere continuo.
Invece ottengo solo alcuni valori discreti.
Due valori spaziati di qualche unita' nel caso di un segnale con poco
rumore, un'intera gaussiana discreta (cioe' con valori mancanti) se il
rumore e' maggiore.
Le gaussiane di cui parlo sono realizzate con circa 500.000 punti
l'una, quindi la probabilita' statistica che un valore non ci sia
davvero e' praticamente nulla.
Escluderei problemi legati a interruzioni di piste, corti, difetti dei
componenti, perche' abbiamo realizzato in modo completamente autonomo
due prototipi di questa board e otteniamo lo stesso tipo di problema.
Vi e' mai successo niente di simile ? Vi viene qualche idea che possa
essere di aiuto ?
A presto,
Marco

 rumore e' maggiore.
Sembrerebbe un problema caratteristico di alcuni tipi di ADC chiamato
proprio "missing codes" cioe' il convertitore, per sue tolleranze interne,
non fornisce tutti i codici possibili. Hai verificato che gli errori non
siano
entro i limiti specificati nel datasheet?
Sarebbe interessante cercare l'esistenza di una relazione tra i problemi
e qualche pattern particolare dei bit. La causa potrebbe essere anche
molto banale, come uno scambio di pin o un errore nel software.
Dopo aver verificato tutto, inizierei a pensare a problemi
di rumore nell'alimentazione o rumore indotto nell'ingresso o nel
riferimento dall'ADC stesso o dai circuiti associati.16 bit sono tanti e
richiedono un layout molto curato.
Come ultima speranza, contatta il servizio tecnico della AD.

 Vi viene qualche idea che possa essere di aiuto ?
Mah, 16 bits sono  76µV di risoluzione su 5V di range.
Come ti ha già detto Valeria, le cause possono essere diverse.
Io farei la prova a 1V 2V 3V per vedere se si comporta sempre così, e se il
comportamento è comunque lineare all'interno dell' errore. (in ogni caso il
datasheet ti da un errore di 2 o 3 LSB)
Poi proverei a rallentare la frequenza di acquisizione per vedere se il fenomeno
si ripete o se cambia qualcosa.
Infine comunque controllerei il layout, perchè a questi livelli di sensibilità
qualche battimento di frequenza o rumore captato può fare molti danni.
--
ciao
  Stefano

Grazie per la risposta.
A proposito dei missing codes, che tipo di errore potrebbe generarli ?
Errori nel REF ? Nelle alimentazioni ? Nei componenti usati (in questo
caso i condensatori di by-pass) ? A dir la verita' nel datasheet sono
specificati condensatori al tantalio, mentre io ho usato dei normali
elettrolitici. Potrebbe dipendere da questo ??
A proposito di pattern particolari nei bit, in effetti ho trovato una
relazione di questo tipo : come dicevo nel post la gaussiana e'
interrotta da alcuni valori con occorrenza 0. In realta' l'occorrenza
non e' zero, ma molto bassa. Ad esempio se il valore 3820 e' presente
piu' di 3000 volte, il valore 3819 e' presente solo 19 volte. Facendo
quest'analisi per una cinquantina di valori consecutivi, ho notato che
il pattern occorrenze alte - occorrenze basse si ripete in modo
periodico. I valori non sono ovviamente sempre gli stessi, ma la
relazione tra le frequenze si. Il periodo di ripetizione e' pari a 16
(cioe' il pattern ha una lunghezza 16). Non mi pare un caso !
Ti suggerisce qualcosa ?
Ciao e grazie,
Marco

Stefano,
grazie per i suggerimenti.
In effetti il comportamento e' leggermente diverso cambiando il livello
del segnale di ingresso. Per valori di tensione piccoli ( es. 0,5 V di
ingresso ), la distribuzione dell'errore ha un andamento molto piu'
regolare. Ci sono alcuni valori con un numero di occorrenze minore
rispetto alla distribuzione gaussiana, ma la variazione e' inferiore
rispetto a tensioni piu' elevate.
Ciao,
Marco

 (cioe' il pattern ha una lunghezza 16). Non mi
pare un caso !
magari vai a campionare mentre compare uno spike
sull'alimentazione che ti rientra da qualche
controllo sincrono con l'ADC, allora puoi anche
spiegare la regolarita' della distribuzione.
Il fatto che hai rinunciato ai condensatori al
tantalio in favore di comuni elettrolitici
potrebbe influire nella purezza dell'alimentazione
(e credo che ci vogliano particolari attenzioni
specialmente se lavoriamo a queste risoluzioni)

 Ti suggerisce qualcosa ?
Prima di tutto prova a filtrare l'alimentazione e poi ne riparliamo.

Grazie dei suggerimenti : Valeria, alla fine avevi ragione tu !
Il problema era legato allo schifo di layout che avevo fatto per l'ADC
( ....tanto e' un prototipo ) , in cui prevedevo una sola traccia come
ritorno di massa per tutti i segnali (tra l'altro lunga anche parecchi
centimetri).
E' bastato moltiplicare i collegamenti a massa : ora ho una bellissima
gaussiana "continua".
A tutti ancora grazie per l'aiuto.
Ciao,
Marco