ADC del PIC rumoroso

Sto facendo delle prove di acquisizione con l'ADC interno di un 16F877A. Campiono a 7 kHz circa un segnale analogico di prova (un trimmer), e trovo un rumore di 5-6 bit, come in figura

formatting link
Guardando con l'oscilloscopio trovo una quasi sinusoide (se volete faccio una foto) a 120 Khz, con un Vp di 40 mV (il che torna, in termini di ampiezza). E' normale? Da dove viene tutto 'sto rumore? Devo mettere una capacità all'ingresso dell'ADC, che magari funga anche da filtro anti aliasing? Quale, però? Io ora campiono a 7Khz, ma la frequenza che utilizzerò in futuro varierà dai 15 Khz a qualche Hz, via software.

Olivier.

Reply to
Olivier
Loading thread data ...

con

Khz,

Mi rispondo mezzo da solo e faccio un'ipotesi. Ho visto che nonostante il tutto sia alimentato a batteria e che ci sia un regolatore di tensione con tutti i condensatori necessari, l'alimentazione *a micro acceso* ha delle oscillazioni molto simili a un'onda quadra a 120 KHz. Evidentemente anche se il segnale è costante, la tensione di riferimento dell'ADC, che è appunto la tensione di alimentazione, oscilla e questo produce gli errori. Cosa faccio? metto un riferimento di tensione esterno? Non c'è piuttosto un modo per far smettere questa oscillazione nell'alimentazione (120 Khx, 40 mV)? Ma sopratutto: PERCHE' OSCILLA?

Olivier.

Reply to
Olivier

modo

potrebbe essere un sottomultiplo della frequanza di clock del PIC

il filtraggio e' adeguato ? c'e' un 100nF __vicino__ all'ingresso della VCC del PIC ?

ci sono altri integrati o componenti che lavorano intorno a quella frequenza ?

puoi tranquillamente passare ad un riferimento esterno , anche un tl431 va bene e non costa nulla

in una applicazione ho un setup simile e non avevo alcun problema

Reply to
mmm

L'ho messo, non cambia nulla!

C'è un MAX 233, non so a che frequanza lavora il suo convertitore di tensione...

Ho messo un riferimento esterno (REF02A della Ti). Le cose sono drasticamente peggiorate! Ho anche usato il riferimento per generare il segnale di prova (un trimmer da 10K), niente! Con l'oscilloscopio il segnale e il riferimento ora sono stabilissimi, ma convertendo in digitale ho degli errori di 15 bit! Non so più che fare!

Olivier.

Reply to
Olivier

tensione...

??? errore di 15 bit da un ADC a 10 bit e' un po' troppo :-)

no, ho capito cosa intendi hai una escursione dei valori letti di 15 unita' , e' esagerato, francamente non ho mai avuto problemi di questo tipo ....

il problema a questo punto e' da qualche altra parte potrebbe essere un problema SW

su cosa e' montato il circuito ?

prova a levare il '233 e vedi se sparisce il ripple sulla 5 V

Reply to
mmm

Tanto per dare un'idea, questo è quello che succede dando in pasto sia all'ingresso che al riferimento i 5v (stabilissimi) del REF02A.

formatting link
Dovrebbe dare un 1024 fisso immobile, eppure...

olivier

Reply to
Olivier

E' troppo sì!!!

Il SW è semplicissimo, e rispetta tutte le specifiche del datasheet. Seleziono il canale, accendo l'ADC, aspetto 50us, faccio partire la conversione, polling finchè è finita, spengo l'ADC, leggo il risultato.

Breadboard, alimentato tutto a batteria.

Sparisce, ma a questo punto non mi sebra quello il problema...

Olivier.

Reply to
Olivier

fai un po' di misure con l'ingresso a meta' scala rispetto al riferimento e se puoi prova anche con un riferimento inferiore ( tipo

2.5 o 4 V )

non mi piace il fatto che stai 'troppo' vicino alla tensione di alimentazione del PIC

se per breadboard intendi quelle senza saldature potrebbe essere un problema di falsi contatti se puoi prova almeno su di una millefori saldando tutto ( a meno degli zoccoli degli integrati :-) )

prova come ultima cosa a tenere l'ADC ed il suo multiplexer sempre abilitato

ancora : hai collegato tutte le masse del pic ?

Reply to
mmm

Olivier ha scritto:

con

Khz,

Forse 7Khz di campionamento sono un po' troppi per l'adc del PIC, hai provato a rallentare il campionamento per vedere se migliora?

ciao

Reply to
Giuss

"Olivier" ha scritto nel messaggio news:fNGOe.26745$ snipped-for-privacy@twister2.libero.it...

Ehm, è impossibile avere 15 bit di errore su un ADC a 10 bit... Fai confusione tra distanza dal valore atteso e bit di errore.

Hai selezionato il giusto pin di riferimento? Perchè per usare un riferimento esterno devi selezionarlo via software. Se l'hai fatto ok. :) Se usi come riferimento il pin vdd prova ad usare un filtro LC sul pin di riferimento per renderlo il più stabile possibile.

Occhio ad eventuali loop che fungono da antenne.

--
  Redentore
Reply to
Redentore

"Olivier" ha scritto nel messaggio news:lAFOe.27038$ snipped-for-privacy@twister1.libero.it...

Abbassa la frequenza di campionamento e fai un bel po' di medie sulle letture... non ho mai visto fare una lettura su un ADC e prenderla per buona! Inoltre gli 877 (non so la versione A) avevano anche dei problemi con il mux analogico, per cui la prima lettura dopo aver cambiato pin di ingresso all'ADC veniva sballata!

J.

Reply to
Regae

Provato, ma anche se campiono a interzalli maggiori, la durata del campionamento è la stessa, quindi per il PIC non fa differenza...

Olivier.

Reply to
Olivier

Intendo che quando dovrei vedere un valore fisso, la mia lettura salta di 7-8 bit sia in su che in giù...

Certo! =)

Fatto!

Ma un disturbo generato da una pseudo-antenna dovrei vederlo anche con l'oscilloscopio, no? E cmq 40mV mi sembrano tantini per un disturbo del genere...

Olivier.

Reply to
Olivier

Ho provato con un riferimento a 4v (il REF02 con un partitore di tensione), ma non cambia nulla!

Si, intendo quelle. Però mi sembra tutto ok. La versione millefori cmq è imminente!

Provato, non cambia nulla...

Ancora una volta: provato, non cambia nulla...

Per oggi basta, domani proverò a disaccoppiare gli stadi di alimentazione mettendo un regolatore per ogni integrato, speriamo...

Olivier.

Reply to
Olivier

Non ne ho il tempo. Mi serve un campionamento molto veloce!

Bella notizia! =( Cmq per ora sto usando sempre lo stesso ingresso.

Olivier.

Reply to
Olivier

di 7-8 unita' in su o in giu' , se idealmente dovessi leggere 512 ( 1/2 del riferimento ) tu leggi valori compresi tra 504 e 520 ( +-8 ) questi sono 'solo' 3 bit d'erore

7 bit d'errore vorrebbe dire che la tua lettura e' compresa tra 512-128 e 512+128

non e' per essere pedanti ( e dal contesto si capiva cosa intendevi ) ma un minimo di precisione e chiarezza nel linguaggio e' importante

P.S: sto rimettendo su un circuito col 18f1320 che era precisissimo vedremo nei prossimi giorni

Reply to
mmm

Ciao Oliver ...

Sicuramente è "l'interruttore del Sample-Hold".

Dipende dall'impedenza che utilizzi all'ingresso dell'ADC, e dalla velocità con cui effettui i campionamenti.

Non sempre risolvi soprattutto con campionamenti veloci.

Io utilizzo il campionamento a velocità di riga video (64uS), per il controllo AGC (di potenza) su un Trasmettitore Video da 10Watt. Ti spiego come faccio io:

- Utilizzo un PIC18F8720, ADC sempre a 10 bit come il tuo.

- Frequenza di clock 10 x 4 PLL (40MHz).

- Controlla bene il selettore velocità di campionamento 64/32/16/8 Tosc dell'ADC, è influenzato dal Main Clock che utilizzi. Se sbagli a selezionarlo hai errori in campionamento.

- Utilizzare un ingresso a bassissima impedenza (un trimmer al 50% normalemente può essere considerato alta impedenza) magari un Amp-OP in configurazione ad inseguitore (LM324, UA741, ecc).

- trovando un giusto tempo di ritardo tra selezione canale e start ADC (che oltrettuto può essere calcolato con il datasheet).

- Utilizzando timer tra selezione canale e start ADC.

Se vuoi scoprire se il problema è "l'impedenza di ingresso", prova ad aumentare il tempo tra selezione canale e start adc.

Gabriele.

Reply to
Kappa

Hai ragione. Intendevo un errore di 7-8 "unità ADC".

Olivier.

Reply to
Olivier

In realtà ho trovato che quel ripple sull'alimentazione era provocato dal MAX232.

La frequenza di lavoro dell'ADC è adeguata, prverò cmq ad abbassarla ulteriormente.

Proverò anche ad aumentare il tempo di acquisizione e vedere cosa succede. Perchè un timer? Non va benissimo una routine di delay?

Olivier.

Reply to
Olivier

Ciao ...

Un timer perchè il delay manda in STOP la CPU, un timer con interrupt ti permette di proseguire il programma ... usi il TMRx per far partire l'ADC ogni x usec, quando arriva interrupt ADC end, salvi il campione e selezioni nuovo canale, il timer successivamente fara partire l'acquisizione e così via ... l'interrupt del timer dovrà essere +/- il tempo di acquisizione tra selezione canale e start ADC.

Gabriele.

Reply to
Kappa

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.