-
-
Hallo reclection,
bist du noch an der Weiterentwicklung des Gyro-Codes interessiert?
Ich beschäftige mich momentan mit ihm und er performt ganz ordentlich an einem ARM7 Controller. Genauigkeit von weniger als 1 °/s ist nicht zu erreichen, aber das ist OK.
In deinem Code machst du einige grobe Schnitzer:
-- Du rechnest die Zweikomplementwerte falsch in vorzeichenbehaftete Werte um. Das darf nie durch Abschneiden der Vorzeichenbits geschehen. Zweikomplementwerte und vorzeichenbehaftete Werte werden immer durch die Operationen "Komplement bilden"--"Eins addieren" in das jeweils andere Format umgewandelt.
-- Deswegen dürfen nicht alle 12bit Werte sowie auch nicht alle 14bit-Werte gleich maskiert werden. Ich würde das switchen also eher auf die "address" anwenden und darin dann für jede Adresse separat die Umwandlung der beiden Bytes dummy/result_int in ein float vornehmen.
-- Du vertauschst in der Read-Funktion beim Einlesen der Werte im zweiten 16bit-Transfer LSB und MSB. Zuerst wird das MSB übertragen!
-- Die Abfolge sollte deshalb sein: 1) Beide 8bit Werte richtig aneinander hängen 2) ggf Zweikomplementwandlung 3) scale factor anwenden, ohne ihn mit 4 zu multiplizieren.
-- Deine Init-Routine schafft es nicht, einen bekannten Anfangszustand herzustellen. Die Register SMPL_PRD und GYRO_SCALE müssen abgeprüft und ggf verändert werden.
-- Das Belegen der Register "dummy" und "rsult_int" durch VerODERn ist fehleranfällig. Wieso weist du im ersten Schritt nicht direkt zu?
-- in der Funktion Read sendest du im zweiten Transfer die adress erneut. Da ist unnötig, aber nicht falsch. Du wertest ja die ersten beiden Bytes die zurückkommen nicht aus.
-- Wenn du möchtest dass nach einem kurzen Spannungsausfall am Sensor die richtigen Werte wieder aus dem flash geladen werden, solltest du Auto-Null NACH den Änderungen am SENS/AVG machen, dadurch werden diese Werte (genauso wie GYRO_SCALE auch, falls du einen nicht-default-Wert nehmen willst) nämlich auch mit ins flash geschrieben und nach einem power-up wieder richtg geladen.
-- 40us Wartezeit zwischen den 16bit Transfers ist nicht nötig. Es muss nur die stall time eingehalten werden, 15us. Alle anderen deiner delays, zwischen CS und der clock, sind unnötig.
-- Nach Autonull hingegen in der Init machst du zuwenig Pause: Stelle sicher dass mindestens 50ms (!!!) gewartet wird, denn nach Autonull folgt automatisch ein flash-update und das braucht lange.
Ich wäre dann mal an deinen Erfahrungen interessiert. Bei mir zappeln nach einem Auto-Null bei GYRO_SCALE auf default die Messwerte +/-5LSB, während der Sensor in Ruhe ist. Wie ist es bei dir?
Bleibt mir noch die Bemerkung, dass ich die Aussagen der "Experten" fumir und Volker-01 als schwer irreführend, wenig hilfreich und eher selbstgefällig-selbstdarstellerisch ansehe. Wenn Deutschlands Diplomierte und Physiker solch einen Wissensquerschnitt darstellen, wundert mich nichts mehr.
Viele Grüße,
bluesparkAB
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen