mikrocontroller.net

Forum: Compiler & IDEs Software-Tiefpass im ATmega128


Autor: Owen Senmeis (senmeis)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Gulden (praio)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Owen Senmeis (senmeis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die Hinweise.

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

Ciao
Senmeis

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ganymed (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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))

Autor: Owen Senmeis (senmeis)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.