Forum: Compiler & IDEs Software-Tiefpass im ATmega128


von Owen S. (senmeis)


Lesenswert?

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

von Thomas G. (praio)


Lesenswert?

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.

von Gerhard (Gast)


Lesenswert?

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.

von Owen S. (senmeis)


Lesenswert?

Vielen Dank für die Hinweise.

Ist es möglich, die Grenzfreqenz nach der Formel von Gerhard 
auszurechnen?

Ciao
Senmeis

von Peter (Gast)


Lesenswert?

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

von Ganymed (Gast)


Lesenswert?

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))

von Owen S. (senmeis)


Lesenswert?

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
Noch kein Account? Hier anmelden.