Pagina 1 di 4

Ridurre instabilità ADC

MessaggioInviato: 14 lug 2012, 10:01
da dany192
Salve a tutti ragazzi! Sto lavorando su un firmware per un 18F4550 che si occupa, in breve, di eseguire semplicemente delle letture di tutti gli ingressi analogici e digitali in maniera continua, mostrandole su un programma scritto in vb sul PC (comunico via USB). Per quanto riguarda gli I\O digitali, sto utilizzando i primi 5 canali dell'ADC (10 bit) con dei potenziometri da 10K ma ho notato che le letture sono un po' instabili.
Ho scelto quindi di effettuare una serie di letture e di calcolarne il valore medio (per ogni canale ovviamente) utilizzando le poche righe di codice seguenti:

Codice: Seleziona tutto
while(1){
    for(count=0;count<=255;count++){
                   ch1 += Adc_Read(4);
                   ch2 += Adc_Read(0);
                   ch3 += Adc_Read(1);
                   ch4 += Adc_Read(2);
                   ch5 += Adc_Read(3);
       }
       ch1 /= count;
       ch2 /= count;
       ch3 /= count;
       ch4 /= count;
       ch5 /= count;

      ......
}



Eseguo quindi 256 letture per ogni canale ma il problema è che noto un oscillazione dei valori letti di circa +/-1 unità nonostante il numero di letture sia bello consistente. Ho provato anche a farne 512,1024 e anche 2048 ma il problema del +/-1 rimane ed ovviamente il tempo di risposta e la fluidità delle letture in realazione alla rotazione dei potenziometri diminuisce sensibilmente. Ho pensato di filtrare gli ingressi dell'adc collegando un condensatore tra l'ingresso e la massa ma nulla da fare. A questo punto mi chiedevo se posso intervenire via software per attenuare (o meglio evitare) questo fenomeno.

Grazie anticipatamente!!

Re: Ridurre instabilità ADC

MessaggioInviato: 14 lug 2012, 10:08
da TardoFreak
Puoi eliminare i disturbi di rete a 50Hz campionando ogni 20ms. esatti.
In questo modo elimini il 50Hz e tutte le sue armoniche.
Il +/-1 te lo tieni comunque, è normale averlo.

Re: Ridurre instabilità ADC

MessaggioInviato: 14 lug 2012, 10:53
da dany192
Possono esserci delle componenti a 50 Hz anche se l'alimentazione proviene dalla presa USB di un PC?

Re: Ridurre instabilità ADC

MessaggioInviato: 14 lug 2012, 10:57
da DirtyDeeds
TardoFreak ha scritto:Puoi eliminare i disturbi di rete a 50Hz campionando ogni 20ms. esatti.


Non proprio: se per esempio campioni sui picchi ti becchi un errore sistematico. Meglio prendere più campioni ogni 20 ms e poi mediare.

Re: Ridurre instabilità ADC

MessaggioInviato: 14 lug 2012, 13:50
da dany192
Il problema è che a me serve molta rapidità. Avete presente quando muovete un joystick da PC? I movimenti sono fluidi e vengono subito registrati...il dispositivo deve comportarsi esattamente così per quanto riguarda la parte degli ingressi analogici.

Re: Ridurre instabilità ADC

MessaggioInviato: 14 lug 2012, 14:10
da Paolino
Potresti fare anche dithering.

Ciao.

Paolo.

Re: Ridurre instabilità ADC

MessaggioInviato: 14 lug 2012, 19:45
da dany192
Dunque, ho fatto varie prove nel pomeriggio per cercare di ridurre questo problema ma non ho avuto risultati. Ho provato ad applicare un semplice algoritmo che consisteva nel salvare in un array di n elementi le varie letture di ogni canale, ordinare ogni array con un bubble sort e fare la media aritmetica in una finestra "centrale" di ogni array ma purtroppo il problema rimane, quindi sono tornato alla mia soluzione iniziale (256 campionamenti per ogni canale e successiva media).

Paolino ha scritto:Potresti fare anche dithering.

Ciao.

Paolo.


Premetto che non conoscevo il dithering fino a quando non ho letto il tuo post. Ho fatto una ricerca in merito ed ho capito in linea di massima il funzionamento ma non come potrei implementarlo nella mia applicazione :mrgreen:

Re: Ridurre instabilità ADC

MessaggioInviato: 14 lug 2012, 19:46
da TardoFreak
Per fare la media non hai bisogno di ordinare i valori.

Re: Ridurre instabilità ADC

MessaggioInviato: 14 lug 2012, 20:02
da dany192
TardoFreak ha scritto:Per fare la media non hai bisogno di ordinare i valori.


Lo so, mi serviva ordinarlo solo per poter escludere i valori "esterni" dal calcolo della media. Esempio: su 16 campioni escludo i primi 4 e gli ultimi 4...comunque non ha funzionato ugualmente...ho provato tante altre varianti ma quel maledetto valore continua ad oscillare sempre di +/- 1 unità

Re: Ridurre instabilità ADC

MessaggioInviato: 14 lug 2012, 20:48
da Paolino
Oggi sono un po' telegrafico: puoi provare con una media mobile.

Ciao.

Paolo.