Ich möchte ein Sensorsignal filtern, aber ich weiß nicht wie.
Mein Ziel ist, die Neigung eines Gerätes zu erkennen. Dazu habe ich in
meinem Projekt einen Beschleunigungssensor eingesetzt (AIS328DQ von
STM).
Dieser sendet mir über I2C-Bus Daten, die ich im Programm abfrage.
Wie kann ich diese Daten filtern?
Aktuell mache ich es "zu Fuß", d.h. ich lese die Daten ein, addiere sie
16 x und bilde beim 16ten mal den Mittelwert.
Leider erfasse ich aber trotzdem noch "Spitzen" die ausgewertet zu einem
Schaltvorgang von Relais führen.
Am liebsten würd ich sagen: filter mir die Daten über einen Tiefpass mit
der Frequenz X. (Ich brauche ja "nur" die Neigung)
Leider habe ich das noch nie gemacht und habe auch keinen Ansatz, wie
soetwas im Programmablauf integriert wird.
Ich programmiere einen Atmel-Controller AT90CAN
Beschleunigungssensor zur Bestimmung der Neigung erscheint mit äußerst
ungünstig. Eine ausführliche Diskussion über den Versuch, einen
Beschleunigungssensor zur Geschwindigkeitsmessung zu benutzen findest du
hier:
Beitrag "Geschwindigkeitsberechnung durch Accelerometer?"
Dein Fall ist zwar nicht gleich, aber viele Argumente gelten dafür auch.
Gerhard
OK, verstanden.
Man reagiert nicht auf die Beschleunigung des Geräts im Raum (war meine
Vorstellung bei meiner Antwort) sondern auf die konstante
Erdbeschleunigung und muss Störungen durch zusätzliche Beschleunigungen
durch Bedienung (Schütteln, ...) ausfiltern.
Für Tiefpass Filter erste Gehversuche hier:
http://www.mikrocontroller.net/articles/Digitale_Signalverarbeitung#FIR-_und_IIR-Filter
Gerhard
Tobi schrieb:> Ich möchte ein Sensorsignal filtern, aber ich weiß nicht wie.>> Mein Ziel ist, die Neigung eines Gerätes zu erkennen. Dazu habe ich in> meinem Projekt einen Beschleunigungssensor eingesetzt
Das ist schonmal eine extrem ungünstige Sensorwahl. Du misst die
Beschleunigung, dich interessiert aber tatsächlich die zweite Ableitung
der Messgrösse...
> Aktuell mache ich es "zu Fuß", d.h. ich lese die Daten ein, addiere sie> 16 x und bilde beim 16ten mal den Mittelwert.
Das ist nun völlig daneben. Das wäre OK, wenn dich der Mittelwert der
Beschleunigung über ein Intervall von 16 Messungen interessiert. Tut es
aber absolut nicht...
> Am liebsten würd ich sagen: filter mir die Daten über einen Tiefpass mit> der Frequenz X. (Ich brauche ja "nur" die Neigung)
Den mathematischen Ansatz, der hinter dieser "Idee" steckt, magst du
vermutlich nicht darstellen, oder sehe ich das falsch?
> Leider habe ich das noch nie gemacht und habe auch keinen Ansatz, wie> soetwas im Programmablauf integriert wird.>> Ich programmiere einen Atmel-Controller AT90CAN
Weder der µC spielt dabei eine Rolle noch deine Programmierfähigkeiten.
Du musst dir vor dem Programmieren erstmal darüber klar werden, was du
eigentlich berechnen musst! Das ist reine Mathematik, nix anderes.
Erst der zweite Schritt ist die Überlegung, wie man das in ein Programm
umsetzen kann und erst der dritte Schritt ist, welcher µC das leisten
kann bzw. ob der, den du gern einsetzen möchtest, dafür ausreichend ist.
Ich würde aber vorschlagen, dir diese ganzen Kopfschmerzen zu sparen und
statt dessen lieber gleich über einen für das Problem geeigneteren
Sensor nachzudenken. Es ist nämlich so: selbst mit hinreichender
mathematischer Kompetenz und viel Aufwand würdest du dem
Beschleunigungssensor nur ein vergleichweise(*) mieses Ergebnis abringen
können.
(*) verglichen mit einem tatsächlich für den anvisierten Zweck
geeigneten Sensor.
c-hater schrieb:>> Mein Ziel ist, die Neigung eines Gerätes zu erkennen. Dazu habe ich in>> meinem Projekt einen Beschleunigungssensor eingesetzt>> Das ist schonmal eine extrem ungünstige Sensorwahl.
Wie kommst Du denn bloß darauf?? Alle elektronischen "Wasserwaagen"
machen das so!
Die Neigungserkennung per Beschleunigungssensor
ist 100% okay.
Dazu muss man keine Beschleunigung aufintegrieren,
sondern man berechnet die Orientierung des Sensors im Raum
indem man a,y und z-Achsen Beschleunigung ausliest.
Liegt der Sensor flach signalisiert er
x = 0g
y = 0g
z = 1g
Wird der Sensor um 45° gekippt erhält man
x= 0.707g
y=0
z= 0.707g
Kippt man den Sensor über die andere Kante um 45° erhält man
x=0g
y=0.707g
z=0.707g
Jetzt noch ein bisschen arc sin (oder wars arc tan )
und man bekommt den Neigungswinkel des Sensors bzw. des Gerätes
in den er eingebaut ist.
c-hater schrieb:> Du misst die Beschleunigung, dich interessiert aber> tatsächlich die zweite Ableitung der Messgrösse...
Die Neigung hat die Einheit m/s^4?
Verblüffend.
Hallo Tobi,
der Ansatz ist völlig i.O. und sehr präzise, wenn das Teil nicht zu
schnell wackelt. In dem Fall brauchst du weitere Sensoren.
Zu Glättung kannst du einfach einen gleitenden Durchschnitt bilden,
indem du nach folgendem Verfahren rechnest:
long Vint;
short aktuellerMesswert, aktuellerDurchschnitt;
1. Vint = Vint + aktuellerMasswert
2. Vint = Vint - aktuellerDurchschnitt
3. AktuellerDurchschnitt = Vint / 100
Abh. von der Messfrequenz (z.B. 100Hz) kannst du die o.g. 100 noch
justieren. Mit den Werten würde sich ein gleitender Durchschnitt über
eine Sekunde ergeben.
Tobi schrieb:> Wie kann ich diese Daten filtern?> Aktuell mache ich es "zu Fuß", d.h. ich lese die Daten ein,> addiere sie 16 x und bilde beim 16ten mal den Mittelwert.
Das ist schon nicht ganz verkehrt.
> Leider erfasse ich aber trotzdem noch "Spitzen" die ausgewertet> zu einem Schaltvorgang von Relais führen.
Ursache der Spitzen ermitteln!
Elektrische Einstreuung? Softwareproblem?
Echter Ausreißer (Hund rennt gegen Tischbein)?
> Am liebsten würd ich sagen: filter mir die Daten über einen> Tiefpass mit der Frequenz X. (Ich brauche ja "nur" die Neigung)
Filtern (im klassischen Sinne) darf man eigentlich nur, wenn man
sicher weiß, dass die Abweichungen wirklich zufälliger Natur
sind (also Rauschen).
Der Mittelwert aus korrekten Messungen und groben Fehlmessungen
sind keine korrekten Messungen!
Um einzelne "Spitzen" zu entfernen, kann man Ausreißertests
verwenden.
Ansonsten kannst Du auch einfach über mehr Messwerte als bisher
mitteln, einen gleitenden Mittelwert berechnen oder ein einfaches
IIR-Filter programmieren.
Eric B. schrieb:> Relativ üblich ist ein sgn. "Running average" Filter:
Auch ein "Running average" Filter - man darf es auch "gleitenden
Mittelwert" nennen, auch wenn das nicht so toll klingt - löst das
Problem der Spitzen genauso wenig wie ein Mittelwert.
Eine übliche Methode für Werte, die nicht normalverteilt sind, ist z.B.
die Berechnung des Medians. Einzelne Ausreißer gehen dann gar nicht in
den Wert ein.
c-hater schrieb:> Das ist schonmal eine extrem ungünstige Sensorwahl. Du misst die> Beschleunigung, dich interessiert aber tatsächlich die zweite Ableitung> der Messgrösse...
Was für ein Quatsch.
Interessieren tut die Richtung des Kraftvektors, der im Schwerefeld der
Erde auf jeden Körper wirkt. Der Beschleunigungssensor kann zwischen der
Kraft auf eine schwere Masse und der auf eine träge Masse nicht
unterscheiden. Nur wenn sich der Sensor im freien Fall befindet, ist er
aufgeschmissen.
Lass dir mal direkt die Hexwerte vom Sensor anzeigen. Evtl. hast du ja
nur ein zu kritisches Timing auf dem Bus, so das da ab und zu mal ein
Bit falsch gelesen wird.
Gut abgeblockt hast du die Betriebsspannung für den Sensor ja
sicherlich.
Wow, vielen Dank für Eure Antworten.
Sicherlich sind ein paar gute Tipps dabei. Diese werde ich umsetzen und
anwenden.
Bei den Antworten ist mir aufgefallen, dass ich gar nicht geschrieben
habe, in welcher Anwendung der Sensor die neigung messen soll.
Mein Sensor sitzt in einer Kiste, die wiederum in einem Fahrzeug
mitgeführt wird. Dieses Fahrzeug fährt, daher treten natürlich diverse
Beschleunigungskräft auf. (Bremsen, anfahren; Kurven, aber schlimmsten
sind Bodenwellen)
Daher meine Frage nach einem Filter und dem Hinweis, dass es Spitzen
gibt, die Auftreten.
Sorry, dass ich dieses wichtige Detail vergessen habe zu erwähnen.
Gruß Tobi