Auspacken von Messungen vom Adxl345-Beschleunigungsmesser

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:

Geben Sie hier die Bildbeschreibung ein

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:

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein

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 ...

Wie viele Bits liest du? Sieht so aus, als würden Sie die oberen Bits ignorieren.
Ich lese zwei Bytes. Bitte sehen Sie sich meine Bearbeitung an

Antworten (1)

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;
        }
    }
}
Danke Vicente! Erschöpfende Antwort! Ich korrigiere den Titel
Wie gehen Sie mit Lärm beim Auspacken um?
Vielleicht reicht ein Medianfilter mit einem 3-Samples-Fenster aus
@UserK In meiner Anwendung hatte ich eine FIR entworfen und implementiert, die die Dateneingabe vor dem Entpacken gefiltert hat. Es war ziemlich effizient in C++ mit Deque- Containern. Sie können Fensterlänge und Koeffizienten mit Matlab-Toolboxen nach Ihren Bedürfnissen bestimmen. Die Mathematik hinter der FIR-Implementierung ist so einfach wie ein Punktprodukt, das Design ist der knifflige Teil.