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?
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
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.
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 ;-)
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.
Wenn ich das Ergebnis noch mit 360/300 multipliziere, stimmt der Winkel. Kann es sein, dass der Sensor so ungenau ist?
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.
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 |
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?
Jo, die das mit dem Interrupt stimmt laut Oszi. Das mit dem Testmodus könnte ich versuchen...
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...
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; |
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.
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.