PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : e-Funktion verarbeiten? Störungen Ignorieren?



Powell
13.12.2009, 13:22
Hi zusammen,

ich möchte folgendes Projekt in Bascom realisieren:

Mein Controller bekommt ein Rechtecksignal mit einer Frequenz zwischen ca. 15 und 200 Hz (Drehzahl einer Welle). Über den Pulsein-Befehl wird es ausgewertet und entsprechend in einen Wert zwischen ca. 7000 und 500 eingelesen (dieser Wert entspricht dem Pulsabstand in der Einheit [10µs], also je höher die Frequenz desto geringer der Wert).

Bis hierhin funktioniert alles ganz gut, mit einem Problem: In der Messung sind immer mal kleine "Peaks" drin, d.h. wenn ich über mein LCD den Wert ausgebe, dann kommen vereinzelt mal Sprungwerte vor (sehr kleine oder sehr große Werte), was "nicht sein darf", da sich die Drehzahl der Welle nicht sprunghaft ändern kann.
Ich führe diese Sprungwerte auf Störeinflüsse zurück, versuche diese auch noch möglichst herauszufiltern, was aber ggf. nicht 100% möglich sein wird.

Meine Software muss unabhängig von der Hardware sicher sein, d.h. ein Sprungwert muss wenn er vorkommt ignoriert werden.
Ich kenne die Steigung mit der sich die Eingangsfrequenz maximal ändern kann (150 Hz / sec). Wie kann ich es Softwaretechnisch realisieren zu sagen "wenn die Änderung des Wertes größer ist als die maximal zulässige Änderung, dann ignoriere diese Messung"?
Woran ich momentan knobele ist, dass der eingelesene Wert leider nicht linear ist, sondern die Form a*e^-(1/t) hat (mit t = Pulsabstand). D.h. bei steigender Frequenz nähert sich die "Eingangswert-Kurve" Exponentiell-Abnehmend Asymptotisch der t-Achse...

Vielleicht hat jemand ne gute Idee...

Grüße Paul

Felix G
13.12.2009, 14:14
Naja, die einfachste Lösung für derartige Probleme ist ein Tiefpass...

den kann man z.B. als gleitende Mittelung realisieren, oder vielleicht als IIR Filter (letzterer benötigt deutlich weniger RAM).


Man könnte zwar auch versuchen einfach nur Ausreißer zu entfernen, aber das ist aufwendiger, und meist nicht notwendig (speziell wenn keine schnellen Änderungen im Signal vorkommen können).

PICture
13.12.2009, 14:22
Meine Software muss unabhängig von der Hardware sicher sein, d.h. ein Sprungwert muss wenn er vorkommt ignoriert werden.

Das verstehe ich nicht ganz, normaleweise eliminiert man Störungen dort wo sie entstehen.

MfG

Powell
13.12.2009, 14:23
Hi Felix,

kannst du deinen Vorschlag noch präzisieren? Gleitende Mittelung und IIR Filter sagt mir leider nichts :(

Wie lege ich den Tiefpass aus? Angenommen meine zulässige Frequenzänderung beträgt 200 Hz / sec und ich kriege einen Impuls mit 220 Hz / sec rein - filtert mir der Tiefpass die auch raus?
Was mache ich, wenn mir mal ein Impuls "fehlt"? Das Kann mir der Tiefpass doch nicht rausfiltern?

Powell
13.12.2009, 14:29
Hi Picture,

mein Signal wird induktiv aufgenommen und durchläuft eine Impulsformungs- und Verstärkerschaltung, das muss so sein. Nun kann es sein, dass über das Aufnehmerkabel auch mal "ähnliche" signale reinkommen, die werden dann eben auch geformt und Verstärkt und ergeben mir einen Störimpuls. Ich weiß nicht wie ich die rausfiltern kann ohne die "soll-signale" nicht auch zu beeinflussen.
Weiterhin kann es für die Sicherheit des Systems nur von Vorteil sein auch Softwaretechnisch zu prüfen ob der Wert i.O. ist, stichwort Redundanz.

Grüße Paul

Felix G
13.12.2009, 14:35
Gleitende Mittelung heisst du speicherst jeweils die letzten "n" Messwerte in einem Array (Ringpuffer), und bildest darüber den Mittelwert.

Ein IIR-Filter ist da etwas eleganter, den im Detail zu erklären würde an dieser Stelle aber wohl etwas zu weit führen (Wikipedia Artikel: IIR Filter (http://de.wikipedia.org/wiki/Filter_mit_unendlicher_Impulsantwort)). Vorteil ist, daß man deutlich weniger Messwerte zwischenspeichern muss um den gleichen Effekt zu erzielen.


Wenn ein Impuls fehlt, entspricht das ja einem Ausreißer, d.h. beim nächsten vorhandenen Impuls bekommst du einen Wert der deutlich zu groß ist. Und genau dabei hilft dir der Tiefpass, denn der glättet das Ergebnis, so daß derartige Ausreißer nicht mehr so stark ins Gewicht fallen.

Powell
13.12.2009, 14:47
Danke Felix, hilft mir schon mal sehr weiter. Der IIR Filter ist in Wikipedia sehr theoretisch gehalten, ich denke ich werds erst mal mit der gleitenden Mittelung probieren, RAM ist unkritisch in der Anwendung.

Felix G
13.12.2009, 14:55
Naja, ein IIR Filter ist garnicht so kompliziert zu programmieren, aber wenn RAM kein Problem ist kannst du dir das natürlich sparen.

Ich habe mal ein Bild angehängt das zeigt, was ein Tiefpass für dich tun kann. Die grauen Punkte sind Messwerte aus einem Temperatursensor, und der Tiefpass macht daraus das rote Signal.

PICture
13.12.2009, 15:01
Du kannst probieren als Aufnehmerkabel geschirmtes zu nehmen, wobei der Schirm nur auf einem Ende mit GND verbinden. Sonst könnte man anstatt der Spule mit einem Hallsensor versuchen, der nicht als kapazitative "Antenne" wirkt.

MfG

Besserwessi
13.12.2009, 17:17
Als erstes sollte man versuchen über die Hardware dafür zu sorgen, daß die Fehlerhaften Werte nichmehr oder nur sehr solten kommen. Wenn mehr als etwa jeder 10 te Wert falsch ist wird es schwer die Rauszufilter. Da die falschen Werte vermutlich vor allem zu klein sind (extra Puls), also bevorzugt in die eine Richtung gehen, ist ein reiner Tiefpaßfilter keine optimale Lösung, denn der Mittelwert wird falsch.

Ein gute Lösung wäre es zu testen wie der neue Wert von den letzten akzeptierten Werten abweicht, und ihn dann zu verwerfen, wenn die Abweichung zu groß wird. Wenn man schon 1-2 Werte verworfen hat, wird einem kaum etwas übrigbleiben nicht mehr so wählerrisch zu sein.

Wenn man genug Werte bekommt und es sich leisten kann lönnte man auch von z.B. je 4 Werten den kleinsten und größten verwerfen und dann die beiden restlichen mitteln. Das ist ein Beispiel für den Median, einen robusten Schätzer, der relativ unempfindlich gegen Ausreißer ist.

Powell
13.12.2009, 17:56
Hi zusammen,

schon mal vielen Dank fürs rege mitdenken.

Ich bin schon etwas weiter. Ich konnte durch verkürzung des Aufnehmerkabels und durch vorschaltung eines Tiefpasses die Signalreinheit nochmals etwas verbessern.

Softwareseitig habe ich weiterhin Ausreißerwerte die über der maximal zulässigen Frequenz liegen herausgenommen.

In diesem Status ist eine LED - die bei überschreiten einer gewissen Drehzahl leuchtet - immernoch sehr stark am Flackern, auch bei geringen Drehzahlen schon.

Nach einer Softwaremittelung via Addition der 5 letzten Werte geteilt durch 5 sieht das ganze schon besser aus: Bis auf 500 min-1 vor erreichen der Drehzahl flackert nichts mehr, dann ein "unsicherer Bereich" von 500min-1 und oberhalb der Soll-Drehzahl wieder relativ Stabiles Verhalten.

Die Idee mit dem Median ist ebenfalls hervorragend und werde ich ebenfalls noch ausprobieren.