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
@ Gerhard es ist nun mal die Beschleunigung, die festlegt wo unten ist. Der Ansatz ist daher sicher nicht so verkehrt !!! Alex
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.
Frank Fahrenheit schrieb: > Jetzt noch ein bisschen arc sin (oder wars arc tan ) Arcustangens. Arcustangens ist meiner Meinung nach richtig.
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.
Relativ üblich ist ein sgn. "Running average" Filter:
1 | #define FILTER_SIZE 16
|
2 | |
3 | static uint16_t values[FILTER_SIZE] = {0, }; |
4 | static uint8_t idx = 0; |
5 | static uint16_t sum = 0; |
6 | |
7 | uint16_t filter(uint16 val) |
8 | {
|
9 | sum -= values[idx]; |
10 | sum += val; |
11 | values[idx] = val; |
12 | |
13 | idx ++; |
14 | if (idx >= FILTER_SIZE) |
15 | {
|
16 | idx = 0; |
17 | }
|
18 | |
19 | return sum / FILTER_SIZE; |
20 | }
|
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.