Forum: Compiler & IDEs Software-Tiefpass im ATmega128


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Owen S. (senmeis)


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

von Thomas G. (praio)


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.

von Gerhard (Gast)


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.

von Owen S. (senmeis)


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

von Peter (Gast)


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

von Ganymed (Gast)


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

von Owen S. (senmeis)


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.