Ridurre instabilità ADC
Moderatore:
Paolino
38 messaggi
• Pagina 2 di 4 • 1, 2, 3, 4
0
voti
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.
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
-

TardoFreak
73,9k 8 12 13 - -EY Legend-

- Messaggi: 15754
- Iscritto il: 16 dic 2009, 11:10
- Località: Torino - 3° pianeta del Sistema Solare
2
voti
Direi che potrebbe essere un buon inizio, allora.
Ciao.
Paolo.
Ciao.
Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-

Paolino
32,6k 8 12 13 - G.Master EY

- Messaggi: 4226
- Iscritto il: 20 gen 2006, 11:42
- Località: Vigevano (PV)
0
voti
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'è...
Sto pensando che è meglio lasciarlo com'è...
0
voti
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.
Ad ogni modo il risultato non cambia.
1
voti
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.
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.
-

dimaios
30,2k 7 10 12 - G.Master EY

- Messaggi: 3381
- Iscritto il: 24 ago 2010, 14:12
- Località: Behind the scenes
3
voti
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
Paolino. 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
dimaios, 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
1) Il "rumore del +/- 1" è intrinseco al processo di quantizzazione, quindi c'è sempre. Può, però, essere ridotto con il dithering, come suggerito da
2) Per ciò che riguarda il filtro notch suggerito da
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
instead of
(Anonimo).
...'cos you know that
ain't
, right?
You won't get a sexy tan if you write
in lieu of
.
Take a log for a fireplace, but don't take
for
arithm.
instead of
(Anonimo)....'cos you know that
ain't
, right?You won't get a sexy tan if you write
in lieu of
.Take a log for a fireplace, but don't take
for
arithm.-

DirtyDeeds
55,9k 7 11 13 - G.Master EY

- Messaggi: 7012
- Iscritto il: 13 apr 2010, 16:13
- Località: Somewhere in nowhere
1
voti
DirtyDeeds ha scritto:2) Per ciò che riguarda il filtro notch suggerito dadimaios, 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
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.
-

dimaios
30,2k 7 10 12 - G.Master EY

- Messaggi: 3381
- Iscritto il: 24 ago 2010, 14:12
- Località: Behind the scenes
0
voti
Scusatemi per il ritardo, nel frattempo vi ringrazio per le vostre risposte
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).
DirtyDeeds, come faccio a vedere a che frequenza sto campionando?
Il registro ADCON2 non l'ho toccato.
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).
- Allegati
-
misure.rar- (6.51 KiB) Scaricato 163 volte
0
voti
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?
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?
0
voti
Facciamo un pezzo per volta:
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
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
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
instead of
(Anonimo).
...'cos you know that
ain't
, right?
You won't get a sexy tan if you write
in lieu of
.
Take a log for a fireplace, but don't take
for
arithm.
instead of
(Anonimo)....'cos you know that
ain't
, right?You won't get a sexy tan if you write
in lieu of
.Take a log for a fireplace, but don't take
for
arithm.-

DirtyDeeds
55,9k 7 11 13 - G.Master EY

- Messaggi: 7012
- Iscritto il: 13 apr 2010, 16:13
- Località: Somewhere in nowhere
38 messaggi
• Pagina 2 di 4 • 1, 2, 3, 4
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 9 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)
