Forum: Mikrocontroller und Digitale Elektronik Gyro Intergrieren


von asdf (Gast)


Lesenswert?

Ich mache momentan einige Versuche mit meine L3G4200D Gyro. Das Auslesen 
des Sensors mit I2C klappt. Jetzt will ich den Drehwinkel durch 
integrieren der z-Achse ausrechnen. Ich weiß, dass das auf lange Zeit 
nicht geht wegen der Drift, es ist aber auch nur ein Versuch. Ich 
arbeite mit einem Skalenendwert von ±250dps, das heißt das Gyro hat eine 
Auflösung von 8.75 mdps/digit. Wie kann ich diesen Wert in Grad 
umrechnen? Ich habe mir gedacht, dass wenn ich den Messwert mit 8.75 
multipliziere und diesen Wert dann integriere müsste das Ergebnis in 
Milligrad stehen. Wenn ich das Sensorboard jetzt aber um 360° drehe 
bekomme ich als Ergebnis 290.000 Milligrad.
Woran könnte das liegen? An der Drift, oder ist der Sensor so ungenau?

von Karl H. (kbuchegg)


Lesenswert?

asdf schrieb:

> Auflösung von 8.75 mdps/digit. Wie kann ich diesen Wert in Grad
> umrechnen?

Am besten erst, nachdem du die dps aufintegriert hast!
Integriere das was du vom Sensor bekommst, sonst integrierst du die 
unweigerlichen Fehler beim Umrechnen nämlich mit auf.

: Wiederhergestellt durch User
von asdf (Gast)


Lesenswert?

Noch eine Frage: Wenn ich das Sensorboard für einer Minute auf dem Tisch 
liegen lasse ohne es zu bewegen, bekomme ich einen Winkel von ca. 13° 
obwohl ich das Board gar nicht bewegt habe. Um den Offset zu 
kompensieren, wird vor dem Starten der Messung der Mittelwert aus 128 
Messwerten gebildet und dieser wird dann von jedem Messwert subtrahiert.

von Nop (Gast)


Lesenswert?

Die Frage ist, wie oft ließt Du Deinen Messwert aus?

asdf schrieb:
> Wenn ich das Sensorboard für einer Minute auf dem Tisch
> liegen lasse ohne es zu bewegen, bekomme ich einen Winkel von ca. 13°
> obwohl ich das Board gar nicht bewegt habe.

Halte ich für realistisch. Hauch ihn mal an oder mach ihn etwas warm und 
Du wirst Dich wundern ;-)

von asdf (Gast)


Lesenswert?

Wenn ich die Werte erst integriere und dann umrechne, wird die Drift 
viel kleiner, ich bekomme aber immer noch 80 Grad als Ergebnis, wenn ich 
die Platine um 90° Drehe.

von asdf (Gast)


Lesenswert?

Wenn ich das Ergebnis noch mit 360/300 multipliziere, stimmt der Winkel. 
Kann es sein, dass der Sensor so ungenau ist?

von Nop (Gast)


Lesenswert?

Nop schrieb:
> Die Frage ist, wie oft ließt Du Deinen Messwert aus?

von asdf (Gast)


Lesenswert?

Ich messe alle 16.384ms.

von Rudi (Gast)


Lesenswert?

Gibts auch Code?

von Karl H. (kbuchegg)


Lesenswert?

was bedeutet denn dps?

Degrees per Second!

d.h. wenn sich der Sensor mit der momentan aktuell gemeldeten Rate 
gleichmässig weiterdrehen würde, dann würde er sich in 1 Sekunde um eben 
jene x Grad drehen.

D.h. du musst drauf achten, dass deine Zeitabstände gleichmässig sind, 
du musst drauf achten, wie lange du in Summe integrierst und du musst 
drauf achten wie oft du pro Sekunde integrierst.

von asdf (Gast)


Lesenswert?

Die Zeitabstände werden per Timerinterrupt erzeigt. Der Code sieht in 
etwa so aus:
1
gyro_z = Read_Gyro_Z();
2
z_integral+= gyro_z*256/15625    // 256/15625=0.016384
3
winkel = z_integral*35/4         // 35/4 = 8.75

von Rudi (Gast)


Lesenswert?

Schalt mal den Testmodus ein und integriere über 1 Sek.
Dann müsstest Du auf die angegebenen 130Grad kommen.
Wenn nicht, stimmt Deine Routine nicht.

Schon mal nachgemessen ob Dein Timerinterrupt auch wirklich mit der 
Frequenz kommt wo Du meinst, dass er kommen sollte?

von asdf (Gast)


Lesenswert?

Jo, die das mit dem Interrupt stimmt laut Oszi. Das mit dem Testmodus 
könnte ich versuchen...

von Rudi (Gast)


Lesenswert?

Evtl. ist es auch noch Sinnvoll etwas schneller auszulesen.
Output-Data-Rate ist ja zwischen 100-400Hz.
Je nach dem wie schnell die Drehraten sind geht Dir sonst auch noch was 
dazwischen verloren...

von asdf (Gast)


Lesenswert?

Beim Self Test ist das Integral nach 10s auf 878 Grad

von Rudi (Gast)


Lesenswert?

Müsste das von den Einheiten her nicht pro Zeiteinheit heißen?
Dann müsste man ja eigentlich Teilen und nicht Multiplizieren.
Also:
1
z_integral+= gyro_z*15625/256;

von Rudi (Gast)


Lesenswert?

Achso, gib doch mal die Messwerte über UART o.ä. aus und stell sie hier 
rein. Dann kann man auch mal schauen ob die passen bzw. ob es offline 
umgerechnet werden kann.

von Jeeehoo Juppieyeei (Gast)


Lesenswert?

Mach doch die Skalierung erst beim Auslesen.
also : z_integral+= gyro_z

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.