Forum: Mikrocontroller und Digitale Elektronik Signale aus Sensor verarbeiten / filtern


von Tobi (Gast)


Lesenswert?

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

von Gerhard (Gast)


Lesenswert?

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

von alex (Gast)


Lesenswert?

@ Gerhard

es ist nun mal die Beschleunigung, die festlegt wo unten ist.

Der Ansatz ist daher sicher nicht so verkehrt !!!

Alex

von Gerhard (Gast)


Lesenswert?

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

von c-hater (Gast)


Lesenswert?

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.

von Route_66 H. (route_66)


Lesenswert?

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!

von Frank F. (frank_f49)


Lesenswert?

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.

von Possetitjel (Gast)


Lesenswert?

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.

von Possetitjel (Gast)


Lesenswert?

Frank Fahrenheit schrieb:

> Jetzt  noch  ein bisschen  arc  sin  (oder wars  arc tan )

Arcustangens. Arcustangens ist meiner Meinung nach richtig.

von pitschu (Gast)


Lesenswert?

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.

von Possetitjel (Gast)


Lesenswert?

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.

von Eric B. (beric)


Lesenswert?

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
}

von Wolfgang (Gast)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Tobi (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.