Hallo,
ich selbst kann zwar kein C programmieren (bzw. nur schlecht), aber etwas fällt mir schon auf:
In deiner Offset-Routine addierst du 500 mal den gleichen Wert und teilst dann durch 500. Das macht wenig Sinn, du müsstet in deiner For-Schleife den Sensor immer wieder neu auslesen. Ich benutze in meinen Koptern auch den MPU60X0 und bestimme den Offset wie folgt:
1. Ich sample 50 Werte von jeder Achse (gyrox, gyroy und gyroz)
2. Ich vergleiche alle Werte miteinander (also Gyrox(1) mit Gyrox(2), Gyrox(2) mit Gyrox(3), usw...) für jede Achse (also jeweils Gyrox, Gyroy & Gyroz)
3. Wenn der Unterschied zwischen zwei benachbarten Werten eine bestimmte Schwelle überschreitet (bei mir: 3 (bei 2000°/s und 42Hz DLPF)), sample ich wieder neue 50 Werte
4. Wenn der Unterschied geringer ist, addiere ich die 50 Werte und teile durch 50, so kann ich eine minimale Abweichung, welche die Grenze nicht überschreitet, trotzdem einigermassen ausgleichen
Die Rohdaten musst du, bis auf das Abziehen des Offsets, nicht weiter aufbereiten. Welche Einstellungen hast du den im MPU gemacht bzgl. Empfindlichkeit und DLPF?
Gruß
Chris
EDIT:
Dass bei schnellen Drehungen die Winkeländerung zu langsam erfolgt, könnte daran liegen, dass du innerhalb der Main-loop Schleife die Daten über die serielle Schnittstelle ausgibst. Evtl. wäre es sinnvoller, dies nur alle xx-Durchläufe zu machen, etwa so (Pseudocode):
Code:
Byte: Cnt
Mainloop:
getSensorData()
gz = gz - gz_null
winkel = winkel + gz
cnt = cnt + 1
wenn cnt = 100 dann
cnt = 0
serialport.write(winkel)
ende wenn
Springe zu Mainloop
Außerdem fällt mir noch das dt auf: IMHO braucht man das nicht zwingend, zumindest funktionierts in meinen Koptern auch hervorragend ohne diesen Parameter.
Lesezeichen