Ich versuche, Beschleunigungswerte von einem ADXL345 über I2C auszulesen. Ich habe den Beschleunigungsmesser erfolgreich mit einer Auflösung von 16G konfiguriert.
Test 1 : 180°-Drehung entlang der y-Achse in 16G-Auflösung. Die Beschleunigung entlang der Z-Achse ist unten dargestellt:
Bei Verwendung einer 16-g-Konfiguration ist die Auflösung zu niedrig. Ich habe es auf 2 g geändert, um einen genaueren Wert für die Schwerkraft zu erhalten, und den gleichen Test durchgeführt.
Test 2 : 180°-Drehung entlang der y-Achse in 2G-Auflösung. Die Beschleunigung entlang der Z-Achse ist unten dargestellt:
Wie Sie sehen können, handelt es sich um einen Rollover-Effekt, der wahrscheinlich durch die Anzahl der Bits verursacht wird, die im Register zum Speichern des Werts verwendet werden. Im 16g-Modus verwendet das Modul ein 13-Bit-Register, im 2/4/8g-Modus ein 10-Bit-Register.
Welchen Ansatz schlagen Sie vor, um den Beschleunigungswert zu rekonstruieren?
In dieser Frage erwähnte @davidcary den Rollover-Effekt.
BEARBEITEN
Ich lese zwei Bytes, es ist derselbe Code, den ich für den 16g-Modus verwendet habe
def read_word(self,adr):
high = self.bus.read_byte_data(self.address, adr)
low = self.bus.read_byte_data(self.address, adr+1)
val = (high << 8) + low
return val
def read_word_2c(self,adr):
val = self.read_word(adr)
if (val >= 0x8000):
return -((65535 - val) + 1)
else:
return val
[...]
accel_zout = adx.read_word_2c(0x36)
Hier ist ein Screenshot der Register, die die Zaxis-Werte enthalten
Notiz
Hier ist ein weiteres Problem, ich werde eine weitere Frage dazu eröffnen, aber es lohnt sich, auf das folgende Problem hinzuweisen. Bitte konzentrieren Sie sich nur auf die Z-Achse
Test : Kippen Sie zweimal von 0° auf 180° und zurück auf 0°, dann von 0° auf -180° und zweimal zurück auf 0°.
Abbildung 1 : Rohdaten
Wie Sie sehen können, ist die Verschiebung nicht konstant. Die durchschnittliche Verschiebung liegt bei etwa 58.000, aber manchmal ist sie kleiner. Wenn wir dieselbe Korrektur auf alle shify-Vorkommen anwenden, erhalten wir Folgendes:
Abbildung 2 : Ausgepackte Daten
Wenn der Schwellenwert, ab dem die Korrektur angewendet werden soll, nicht richtig definiert ist, sind die resultierenden Daten nicht genau. In Abbildung 2 unterscheidet sich die Beschleunigung entlang der Z-Achse nach dem Test vom anfänglichen Nullwert, was eine Katastrophe bedeutet ...
Die gesuchte Rekonstruktion heißt Unwrapping . Ich habe dies letztes Jahr mit guten Ergebnissen in C++ implementiert, als ich die Gesamtumdrehung eines Autorads gemessen habe. In Matlab: Link
Q = unwrap(P,tol)
Das beobachtete „Überrollen“ (eigentlich ein Wickeln ) wird nicht durch einen Registerüberlauf verursacht, sondern durch die Signaländerung der gemessenen Erdbeschleunigung. Die Toleranz tol sollte die Hälfte der beobachteten Spitze-zu-Spitze-Amplitude sein.
In C wäre es so etwas (habe das nicht getestet, aber die Idee ist hier):
void unwrap(int *P, int tol, int len)
{
for (int index = 1; index < len; index++)
{
// Upwards wrapping
while (P[index-1] - P[index] > tol)
{
P[index] += 2*tol;
}
// Downwards wrapping
while (P[index] - P[index-1] > tol)
{
P[index] -= 2*tol;
}
}
}
uint128_t
BenutzerK
BenutzerK