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.