Ich habe dieses Forum ein wenig in Bezug auf das Gyroskop L3G4200D durchsucht und dieses Problem nicht erwähnt, aber ich habe andere in anderen Foren darüber sprechen sehen. Ich sehe einen seltsam großen Wert in meiner Ausgabe, wenn das Gyroskop stationär ist. Leider scheint niemand in der Lage zu sein zu antworten, warum dies so ist, also dachte ich, ich würde herumfragen
Ich sammle also Daten aus dem Kreisel mit i2c bei 400 kHz (schneller Modus) und sammle die Gyroskopdaten mit Multibyte-Lesevorgang (jeweils sechs Bytes). Abtastung bei 100 Hz (versuchte auch die oberen 800 Hz), versuchte auch das Ein- und Ausschalten der Filterung bei verschiedenen Werten. Ich verwende nicht den Interrupt-Pin, aber ich verwende das Attribut 'Blockdatenaktualisierung' im GYRCTRLREG4, sodass die Daten erst ausgegeben werden, wenn sowohl LSB als auch MSB gelesen werden. Volle 2000dps und nichts mit dem FIFO gemacht. Ich kann meine genauen Registerwerte veröffentlichen, wenn es hilft, aber die meisten von Ihnen haben das Datenblatt nicht zur Hand.
Das Bild unten zeigt mein Problem. Die ausgegebenen Daten sind gut, korrekt berechnet (meines Wissens) und allgemeines Rauschen ist sehr akzeptabel. Aber dann bemerkte ich, dass diese nervigen "Blips" zufällig auftauchten, wenn das Gerät stationär ist. Wenn ich es ein paar Sekunden lang stehen lasse, erhalte ich eine dieser Spitzen, die immer zwischen 250 und 255 liegt (also ~ 18 bei der Konvertierung mit '(Ausgabe * 70) / 1000'). Die Spitzen sind, wie gesagt, zufällig und können in jeder Ebene auftreten (im Bild unten sehen Sie die erste Spitze in der X-Ebene, die zweite in der Y-Ebene), immer um den gleichen Wert und eins, zwei oder alle drei können gleichzeitig passieren. Der große Wert gilt nur für eine einzelne Stichprobe und kehrt dann zum Normalwert zurück.
Ich habe irgendwo in einem anderen Thread gesehen, dass ich die Blockdaten-Wartefunktion in GYRCTRLREG4 verwenden sollte, wie ich bereits erwähnt habe, aber keine Änderung. Ich habe das Problem auf das Problem eingegrenzt, wenn das MSB Null oder höher ist, dh eine positive Zahl. Wenn dann das MSB und das LSB kombiniert werden, erhalte ich diese großen Zahlen. Zum Beispiel greife ich nach den zwei für die X-Ebene erforderlichen Bytes, erhalte im LSB eine -6 und im MSB eine 0, wenn ich sie kombiniere, erhalte ich 250, und beim Konvertieren ergibt sich (250 * 70) / 1000 = 17,5 dps ( dh zu groß für stationär / falsch). In derselben Stichprobe sind die beiden Bytes für die Y-Ebene -3 LSB und -1 MSN, wobei die Kombination -3 ergibt und die Konvertierung -0,21 ergibt (dh erwartet / korrekt).
Ich bin schon seit Tagen mit diesem Problem beschäftigt und sehe auch ein paar dieser zufälligen Spitzen mit meinem Magnetometer. Ich denke also, ich lese das Gerät (über i2c) falsch?
Anregungen oder Versuche sind herzlich willkommen!
Antworten:
Da Sie ein ähnliches Problem mit Ihrem Magnetometer beobachten, schätze ich, dass Sie ein Problem mit dem I2C-Bus haben. Obwohl es aufgrund des intermittierenden Betriebs zuerst ein Codeproblem sein könnte, würde ich zuerst überprüfen, wie der Bus angeschlossen ist. Ein paar Dinge zu überprüfen / versuchen:
Wenn Sie keine externen Pull-up-Widerstände verwenden, versuchen Sie es mit 10K-Pull-up-Widerständen an SDA und SCL. Das interne Pull-up der meisten Mikrocontroller ist nicht stark genug.
Wenn möglich, reduzieren Sie die Länge des Busses so weit wie möglich und versuchen Sie, ihn von Hochgeschwindigkeitssignalen fernzuhalten.
Wenn Sie ein Steckbrett verwenden, versuchen Sie, die Verbindungen so direkt wie möglich zu halten, um eine Überkapazität zu vermeiden.
Wenn Sie Prototypkarten verwenden, die bereits Pull-up-Widerstände enthalten, werden diese möglicherweise parallel ausgeführt, und Sie haben möglicherweise einen zu niedrigen Pull-up-Widerstandswert.
Wenn Sie den Zugriff auf ein Oszilloskop arrangieren können, ist dies ideal, um sicherzustellen, dass die Takt- und Datenleitungen schön und quadratisch aussehen und nicht zu stark verzerrt sind.
Wenn diese Schritte nicht funktionieren, hat Texas Instruments die Anwendungsbericht Fehlerbehebung beim I2C-Busprotokoll , der detailliertere Informationen zur Berechnung der Pull-up-Widerstände und Probleme mit der Kapazität enthält.
quelle
Was möglicherweise passiert, ist, dass zwischen dem Lesen des LSB und des MSB eine neue Stichprobe entnommen wird. Wenn also MSB = 0 und LSB = -4 ist, sollten Sie 252 oder ungefähr 1 g erhalten. Wenn der nächste Messwert MSB = 1 und LSB = 2 ist, sollten Sie 258 erhalten, was angemessen ist. Das Problem ist, wenn für 1 Probe nur das MSB auf 1 aktualisiert wurde und das LSB immer noch -4 ist. Sie erhalten 508, ungefähr 2 g, was dieser Fehler sein könnte.
BDU auf CTRL_REG4 soll dies verhindern. Vielleicht lesen Sie dieses Register vom Sensor und stellen Sie sicher, dass der Blockhalt aktiviert ist?
quelle
Versuchen Sie es mit einem Medianfilter, und diese Spitzen verschwinden.
Bitte beziehen Sie sich auf meine Frage hier auf StackExchange und lesen Sie dann diesen Beitrag über das gleiche Problem
quelle