Servus, ich möchte in meinem Atmega128 einen Software-Tiefpass einbauen, um Störungen in A/D-Umsetzern zu entfernen. Die Grenzfrequenz liegt ca. bei 4kHz. Inzwischen habe ich das Dokument AVR 223 gelesen, dieses scheint jedoch kompliziert zu sein. Hat jemand solche Erfahrungen? Ciao Senmeis
Hi, kannst du nicht einfach über eine bestimmte Anzahl von AD-Wandlungen mitteln? Also über z.B. 10 Wandlungen aufaddieren und das Ergebnis durch 10 teilen, dann hast du automatisch eine Filterung, die einem Tiefpass entspricht.
Die einfachste Art Tiefpasscharakter zu bekommen ist der folgende
Algorithmus:
W : aktueller Messwert
M[t] : aktueller Mittelwert
M[t-1] : Mittelwert des letzten Zyklus
k : Integer Wert mit k > 1
M[t] = (k-1)/k * M[t-1] + 1/k * W
Für Mikrocontroller ist natürlich k als Potenz von 2 zu nehmen
(einfacher Shift).
Nehmen wir an, dein Messwert springt zum Zeitpunkt t=0 von 0 auf 1 und
bleibt da, dann entwickelt sich M[t] mit wachsendem t für den Fall k=2
so:
M[ 1] = 0.5000000
M[ 2] = 0.7500000
M[ 3] = 0.8750000
M[ 4] = 0.9375000
M[ 5] = 0.9687500
M[ 6] = 0.9843750
M[ 7] = 0.9921875
M[ 8] = 0.9960937
M[ 9] = 0.9980469
M[10] = 0.9990234
M[11] = 0.9995117
M[12] = 0.9997559
M[13] = 0.9998779
M[14] = 0.9999390
M[15] = 0.9999695
und für k=4 so:
M[ 1] = 0.2500000
M[ 2] = 0.4375000
M[ 3] = 0.5781250
M[ 4] = 0.6835937
M[ 5] = 0.7626953
M[ 6] = 0.8220215
M[ 7] = 0.8665161
M[ 8] = 0.8998871
M[ 9] = 0.9249153
M[10] = 0.9436865
M[11] = 0.9577649
M[12] = 0.9683236
M[13] = 0.9762427
M[14] = 0.9821821
M[15] = 0.9866365
Du siehst eindeutig den Tiefpasscharakter. Je größer das k gewählt wird,
um so tiefer die Grenzfrequenz.
Gerhard
PS:
Werte erzeugt mit folgendem kurzen Pascal Programm:
program test;
const k = 4;
var m:real;
t:integer;
begin
m := 0;
for t := 1 to 15 do begin
m := (k-1)/k*m + 1.0/k;
writeln('M[',t:2,'] = ',m:10:7);
end;
end.
Vielen Dank für die Hinweise. Ist es möglich, die Grenzfreqenz nach der Formel von Gerhard auszurechnen? Ciao Senmeis
Such mal nach exponentieller Filterung/Glättung, so wie die Formel von Gerhard aussieht, dürfte das so was ein. Dabei ist k in etwa ein Zeitfaktor. Verwende ich auch gern, man muss aber aufpassen, dass die gefilterten Werte bei übermässiger Filterung (großem k) stark hinter den Messwerten hinterherhinken (bei trendbehaftetem Eingangswertverlauf) -> Stichwort: exponentielles Filter 2. Ordnung. Grüße, Peter
Ich benutze auch oft die
Methode die Gerhard beschrieben hat.
Wichtig ist hier bei vor allem,
dass man die Messwerte immer in einem
festen Zeitraster t abfragt.
Bei t=1ms z.B. wird jede ms ein neuer
Messwert W gebildet.
Nimmt man als Analogie einen einfachen
RC-Tiefpass so lässt sich die Grenzfrequenz
diese Software-Tiefpass mit zwei Parametern
einstellen: Mit der Abtastzeit t
und dem Mittelwertsfaktor k
bei k > 5 ergibt sich mit guter Näherung
fg = 1 / (2 PI t * (k - 0.5))
Die A/D-Wandlung erfolgt nach Interrupts. Kann man einfach sagen, dass 't' = 13*64/8MHz = 104 us ist? ich habe die A/D-Wanlder vom Atmega128 so eingesetzt: Taktfrequenz: 8MHz, Prescaler: 64, Anzahl der A/D-Kanäle: 8. Es ist auch bekannt, dass einzelne Wandlungen 13 Takte dauern. Ciao Senmeis
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.