Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Ridurre instabilità ADC

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[11] Re: Ridurre instabilità ADC

Messaggioda Foto UtenteTardoFreak » 14 lug 2012, 21:26

Con media mobile (implementando un buffer circolare) e campionando a 20 ms. o sottomultipli si realizza un filtro digitale a finestra (se non ricordo male si chiama così).
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

2
voti

[12] Re: Ridurre instabilità ADC

Messaggioda Foto UtentePaolino » 14 lug 2012, 21:35

Direi che potrebbe essere un buon inizio, allora.

Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[13] Re: Ridurre instabilità ADC

Messaggioda Foto Utentedany192 » 15 lug 2012, 15:42

Ho appena finito l'ennesima prova. Come mi avete suggerito ho utilizzato un buffer circolare, o meglio una FIFO, composta da un array di n elementi (dove con n indico il numero di letture) per ogni canale dell'adc e successivamente ho applicato un filtro mediano, dopo aver ordinato ovviamente la FIFO. Ho provato con n = 5 ed n = 9 (per un filtro mediano devono essere dispari) e dopo aver scritto un centinaio di righe di codice continuo ad avere le oscillazioni.
Sto pensando che è meglio lasciarlo com'è... :evil:
Avatar utente
Foto Utentedany192
20 6
Frequentatore
Frequentatore
 
Messaggi: 123
Iscritto il: 1 ago 2011, 13:32
Località: everywhere

0
voti

[14] Re: Ridurre instabilità ADC

Messaggioda Foto Utentedany192 » 16 lug 2012, 15:55

Per la cronaca: oggi ho provato ad eliminare le 256 letture per canale con il relativo calcolo della media, lasciando quindi solamente l'acquisizione del valore in un'unica lettura per volta. Il risultato è stato che il classico "rumore" del +/-1 rimane (anche qualcosina in più)...l'unica differenza era che eseguendo la media questi +/-1 capitavano più raramente diciamo, mentre adesso sono continui.
Ad ogni modo il risultato non cambia.
Avatar utente
Foto Utentedany192
20 6
Frequentatore
Frequentatore
 
Messaggi: 123
Iscritto il: 1 ago 2011, 13:32
Località: everywhere

1
voti

[15] Re: Ridurre instabilità ADC

Messaggioda Foto Utentedimaios » 16 lug 2012, 19:36

Filtro notch sui 50 Hz. Le schede di campionamento industriali lo implementano di default sia per i 50 Hz che per i 60 Hz ed un motivo ovviamente c'è.

Ti rimando alla letteratura che avevo suggerito in questo thread.

Se vuoi puoi postare una serie significativa di campioni ( qualche migliaio ) in un file testo e vediamo cosa si può fare.
Campiona una costante su tutti i canali e cerca di fare una statistica del rumore.
A seconda del risultato si individua il modo migliore per attuare il signal processing ( filtraggio ecc. ).

Andare a tentativi senza avere i campioni a disposizione potrebbe non introdurre elementi risolutivi.
Ingegneria : alternativa intelligente alla droga.
Avatar utente
Foto Utentedimaios
30,2k 7 10 12
G.Master EY
G.Master EY
 
Messaggi: 3381
Iscritto il: 24 ago 2010, 14:12
Località: Behind the scenes

3
voti

[16] Re: Ridurre instabilità ADC

Messaggioda Foto UtenteDirtyDeeds » 16 lug 2012, 20:46

Un po' di osservazioni (spannometriche, senza grosse pretese):

1) Il "rumore del +/- 1" è intrinseco al processo di quantizzazione, quindi c'è sempre. Può, però, essere ridotto con il dithering, come suggerito da Foto UtentePaolino. Perché il processo funzioni c'è bisogno di un po' di rumore (con un po' di fortuna, di quello potresti già averne a sufficienza nel sistema) e, soprattutto, c'è bisogno che la media dei campioni venga calcolata con più bit di quelli restituiti dall'ADC :!:

2) Per ciò che riguarda il filtro notch suggerito da Foto Utentedimaios, se la frequenza di campionamento è un multiplo esatto della frequenza di rete (almeno il doppio, ma meglio di più, ché ci sono anche le armoniche), una media mobile che copra un multiplo del periodo di rete (20 ms, 40 ms ecc.) realizza automaticamente un notch.

3) Lascia stare gli ordinamenti e l'esclusione dei campioni, porta male se non sono fatti con criterio.

Ora una domanda: a che frequenza stai campionando :?:
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

1
voti

[17] Re: Ridurre instabilità ADC

Messaggioda Foto Utentedimaios » 17 lug 2012, 7:22

DirtyDeeds ha scritto:2) Per ciò che riguarda il filtro notch suggerito da Foto Utentedimaios, se la frequenza di campionamento è un multiplo esatto della frequenza di rete (almeno il doppio, ma meglio di più, ché ci sono anche le armoniche), una media mobile che copra un multiplo del periodo di rete (20 ms, 40 ms ecc.) realizza automaticamente un notch.


Vero Foto UtenteDirtyDeeds, si può realizzare anche così ma si mette un vincolo al numero di campioni della media mobile. Preferisco sempre realizzare il filtro digitale impostando un notch sulla frequenza di rete e poi un IIR passa basso per ridurre i tempi di calcolo mantenendo una buona selettività della banda.
Se non ci sono particolari richieste concordo sulla tecnica di filtrare con una media mobile su 20 ms o un suo multiplo.
Ingegneria : alternativa intelligente alla droga.
Avatar utente
Foto Utentedimaios
30,2k 7 10 12
G.Master EY
G.Master EY
 
Messaggi: 3381
Iscritto il: 24 ago 2010, 14:12
Località: Behind the scenes

0
voti

[18] Re: Ridurre instabilità ADC

Messaggioda Foto Utentedany192 » 17 lug 2012, 12:30

Scusatemi per il ritardo, nel frattempo vi ringrazio per le vostre risposte :ok:
Ho fatto le misure che mi avete richiesto (1000 per ogni prova)....trovate tutto nel file allegato. Le misurazioni sono state eseguite su un solo canale dei 5 previsti (gli altri canali si comportano in modo uguale) con un potenziometro da 10K.

Nel file "legenda.txt" contenuto nell'archivio, ho specificato le varie condizioni. I valori vanno (o dovrebbero andare) da 0 a 65535...quando parlavo di +/-1 mi riferivo al valore letto sulla gestione delle periferiche di windows che va da 0 a 1023 ;-)

Quello che ho dedotto io da queste misurazioni è:
-Quando il potenziometro è alla sua massima resistenza, non ottengo lo "0" ma un valore superiore
-Le variazioni tra un campione e l'altro sono di 64 unità (considerando i valori da 0 a 65535)
-Quando il potenziometro è alla sua minima resistenza, ottengo il 65535 (l'unica cosa giusta).

Foto UtenteDirtyDeeds, come faccio a vedere a che frequenza sto campionando? :oops: Il registro ADCON2 non l'ho toccato.
Allegati
misure.rar
(6.51 KiB) Scaricato 163 volte
Avatar utente
Foto Utentedany192
20 6
Frequentatore
Frequentatore
 
Messaggi: 123
Iscritto il: 1 ago 2011, 13:32
Località: everywhere

0
voti

[19] Re: Ridurre instabilità ADC

Messaggioda Foto Utentedany192 » 17 lug 2012, 16:06

Ah dimenticavo: sto utilizzando la libreria ADC di mikroC e la conversione la faccio con adc_read che come dice la descrizione "Initializes PIC’s internal ADC module to work with RC clock. Clock determines the time period necessary for performing AD conversion (min 12TAD)."

Leggendo il datasheet del 18F4550, viene raccomandato di non utilizzare un impedenza d'ingresso > di 2.5K...potrebbe essere un problema il mio potenziometro da 10K? Dovrei allungare il tempo di acquisizione per dare più tempo al condensatore di caricarsi?
Avatar utente
Foto Utentedany192
20 6
Frequentatore
Frequentatore
 
Messaggi: 123
Iscritto il: 1 ago 2011, 13:32
Località: everywhere

0
voti

[20] Re: Ridurre instabilità ADC

Messaggioda Foto UtenteDirtyDeeds » 17 lug 2012, 19:54

Facciamo un pezzo per volta:

dany192 ha scritto:I valori vanno (o dovrebbero andare) da 0 a 65535...


Perché? Il PIC 18F4550 ha un ADC a 10 bit, quindi i valori dovrebbero andare da 0 a 1023. Credo che tu abbia copiato il dato a 10 bit su un registro a 16 bit dal lato "alto" invece che da quello "basso", ovvero il bit 0 del registro a 10 bit è finito nel bit 6 del registro a 16. Il risultato è che una variazione dell'ingresso dell'ADC di 1 LSB ti fa variare il valore letto di 64 (2^6). I bit da 0 a 5 del registro a 16 bit, poi, sembrerebbero messi a 1, così che hai un offset di 63. Insomma, mi sembra che l'acquisizione dei valori necessiti di un'aggiustatina ;-)

dany192 ha scritto:Ah dimenticavo: sto utilizzando la libreria ADC di mikroC e la conversione la faccio con adc_read


Non conosco mikroC, l'ultima volta che ho programmato un PIC l'ho fatto in assembler, ma a me interessa sapere: sulla base del programma che hai fatto, ogni quanto viene chiamata adc_read? Il tempo di campionamento è l'intervallo di tempo che intercorre tra due acquisizioni. Sarebbe meglio che agganciassi l'acquisizione a un interrupt in modo da avere un tempo di campionamento ragionevolmente noto e stabile.

Guardando il file con le medie, mi viene da dire che hai calcolato la media con lo stesso numero di bit dei singoli dati :(
It's a sin to write sin instead of \sin (Anonimo).
...'cos you know that cos ain't \cos, right?
You won't get a sexy tan if you write tan in lieu of \tan.
Take a log for a fireplace, but don't take log for \logarithm.
Avatar utente
Foto UtenteDirtyDeeds
55,9k 7 11 13
G.Master EY
G.Master EY
 
Messaggi: 7012
Iscritto il: 13 apr 2010, 16:13
Località: Somewhere in nowhere

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 22 ospiti