mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tiefpass 1. Ordnung


Autor: Kartoffel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich möchte einen Tiefpass in meine Software implementieren, um den 
Eingangssignal für meinen PI-Regler zu glätten.
Als Formel habe ich sowas gefunden:
Ausgang_neu= (1-c)*Ausgang_alt + c*Eingang
Ausgang_alt= Ausgang_neu

Hätt da ein paar Fragen dazu:
wie kann ich denn c besimmen?
Ist beim ersten Durchlauf mein Ausgang_alt =0?
Muss ich jeden Wert an die Funktion schicken und dann gleich weiter an 
den Regler?

danke schön

Autor: mandrake (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das c in deiner Formel ist eine von dir wählbare Zahl zwischen 0..1
Machst du c sehr klein ändert sich das Ausgangssignal des Filters nicht 
so stark bei Änderungen des Eingangs. Änderungen des Eingangssignals 
schlagen also nur sehr langsam auf den Ausgang durch.
Wenn du c sehr groß wählst reagiert der Ausgang des Filters schnelle auf 
den Eingang und deine Glättung wird schlechter.
Rechne es doch mal auf einem Blatt Papier mit verschiedenen c durch.
Als Eingangssignal nimmst du eine ganze Folge von Einsen. Initialisieren 
tust du Ausgang_alt mit 0.
Dann skizziere dir die Ergebnisfolge. Du wirst feststellen, dass du mit 
c einstellen kannst wieviele 1er du reinschieben musst bis das 
Ausgangssignal auch 1 erreicht. Bei kleinem c dauert es eben länger als 
bei einem großen c.

Gruß

Mandrake

Autor: Kartoffel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wieso soll ich für den Eingangssignal eine Folge von Einsen nehmen?
Mein Eingangssignal schwankt ja stark und sieht z.B. so aus:
12, 18, 32, 30, 25 etc. Den möchte ich ja glätten, denn der Wert 
schwankt um den Mittelwert von 20, was auch mein Isteingang vom Regler 
ist.

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bilde doch einen Mittelwert von z. B. 8 Signalen.

MW

Autor: mandrake (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Als Test damit du dir quasi die Länge des Einschwingvorgang ansehen 
kannst und c entsprechend wählen kannst.

Gruß

Mandrake

Autor: Kartoffel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
alles klar,
ich hab meine Werte mit verschiedenen c's gefiltert. Werde das c nehmen, 
bei welchem die Schwankungen am geringsten sind!
danke schön

Autor: 3360 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein filter :
http://www.ibrtses.com/embedded/exponential.html

Allerdings... wenn man ein Sensorsignal filtert, sollte man die 
Bandbreite des Systemes nicht unterschreiten.

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab den Tiefpass jetzt programmiert.
Leider macht er meinen Regler so langsam, dass er mehr schwingt, als 
ohne TP. :-(

Autor: Tobi S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn dein Regler schwingt (vorrausgesetzt bei Heavisidescher 
Eingabgsbeaufspruchung) und von dir nicht gewollt, solltest du
mal schauen ob deine Polstellen richtig liegen.

Autor: Spice (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
system instabil...
hast du auch sowas wie eine übertragungsfunktion von deiner bastelei auf 
papier? oder weisst du was die besagten polstellen sind?
gruss spice

Autor: Xion (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie sehen denn deine Filter Koeffizienten aus?

Autor: Alexander Liebhold (lippi2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit einfachem Auszählen sollte man keine Eingangsfilter bauen. Wie hoch 
ist deine Abtastrate,die Größe der Filterkoeffizienten und die daraus 
entstehende Grenzfrequenz??Wie sieht die Sprungantwort aus?

Vorallem bei zeitkritischen Sachen (Regler) muss doch so etwas bekannt 
sein. Du veränderst doch Zeitkonstante in der Regelschleife.

Gruß Alexander

Autor: Lupin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn das ganze auf einen AVR läuft wird es wohl gut langsamer. Kann mir 
vorstellen, dass das als Fließkommamultiplikation kompiliert wird. Das 
kostet sehr viel Rechenzeit.

Versuch es mal mit integer multiplikation also wähle C im Bereich von 0 
bis 255 und stell die Formel so um:
Ausgang_neu= ((256-c)*Ausgang_alt + c*Eingang)>>8;

Du musst natürlich alle Variablen als Integer (short oder int, je 
nachdem wieviel Bit du brauchst) definieren.

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.