L3G4200D Gyrosensor - Messwinkel?

Ich mache eine IMU für 6DOF mit L3G4200D 3-Achsen-Digitalgyroskop.

Ich habe so viele Blogs, Foren, Anwendungshinweise überprüft und entsprechend programmiert, um die richtigen Messwerte / Informationen von meinem Kreisel zu erhalten.

Obwohl ich kurz davor bin, es zu lösen - ein einziges Problem hat mich seit den letzten zwei Nächten wütend gemacht! Ich habe 16-Bit-Ziffer - 1 vorzeichenbehaftetes Bit + 15-Bit-Wert

Angenommen, ich möchte einen Winkel in Bezug auf die X-Achse bei 2000 dps messen, dafür mache ich Folgendes:

while(1)
{
     for(g=39;g<42;g++)
    {
        r = I2CRegRead(I2C0_MASTER_BASE, 0x68, g);  // read the reg. no. g
            switch (g)
            {
                case 40:       
                l = r;             // LSB part of X_Gyro
                    break;
            case 41:
                h = r;            // MSB part of x_Gyro
                x = 0;
                x = h<<8;
                x = x|l;
                x = x*70/1000;
                        UARTprintf("Gyro_X : %5d\n\r",x);
                    break;
                }
         }
}

Ich erhalte höchstwahrscheinlich einige Werte <800, wenn ich den Kreisel in Bezug auf die X-Achse gegen den Uhrzeigersinn bewege, und erhalte >4000 für die entgegengesetzte Richtung!!

Ich möchte positive Winkelwerte haben, während ich es gegen den Uhrzeigersinn drehe, und negative Winkelwerte für die Richtung im Uhrzeigersinn ... Dafür sollte ich meine Berechnungen hinzufügen? [Winkel sollten in Grad 1 bis 180 & (-1) bis (-180) sein]

// im Code 0.007 ist in mdps, was der Wert jedes LSB der Kreiseldaten ist

Was sollte ich hinzufügen könnte und warum habe ich gerade >4000 & <800 Werte?

Könnte mir bitte jemand dabei helfen?

Vielen Dank für Ihre wertvolle Zeit.

Bitte fügen Sie der Frage Ihren tatsächlichen Code hinzu (kopieren und einfügen).
ok, ich habe es editiert.

Antworten (1)

Erstens könnten Sie so etwas verwenden, um Ihren Wert in eine richtige vorzeichenbehaftete Ganzzahl zu bringen:

uint8_t xl = ...;
uint8_t xh = ...;
int16_t x = *(int8_t *)(&xh);
x *= (1 << 8);
x |= xl;

Aber x ist nur ein Wert in Grad pro Sekunde. Um Ihre aktuelle Ausrichtung als Winkel zu erhalten, müssen Sie diesen Wert über die Zeit integrieren, was viel Drift hinzufügt. Um dies zu kompensieren, könnten Sie es dann mit Beschleunigungsmesserdaten (PDF!) Filtern .

Vielen Dank dafür ... Ich habe bearbeitet, wie Sie vorschlagen ... Jetzt bekomme ich positive Werte gegen den Uhrzeigersinn und negative im Uhrzeigersinn ... Aber überraschenderweise komme ich in den Bereich von +/- 8500. Nicht ständig aber bei einer höheren Winkeländerungsrate zeigt es die Spitze von 8000 !! und bei normalem Schütteln sind es +/- 3000 !! im idealen Zustand komme ich auf etwa 40-50. Ich verwende 2000 dps ... Ich habe es auf 250 dps überprüft, es zeigt dort geringes Rauschen und bessere Stabilität ...
Können Sie mir sagen, was ich tun soll, um die Winkel jetzt zu bekommen? sollte ich x1 zum Zeitpunkt t1 und x2 zum Zeitpunkt t2 nehmen und dann: X_Winkel = (x2-x1)/(t2-t1) Habe ich recht???
Noch eine Frage! Darf ich wissen, wie diese Gleichung ausgeführt wird? x = *(int8_t *)(&h);
Um den Blickwinkel zu erhalten, müssen Sie Ihre Messwerte über die Zeit integrieren. Weil die Integration von Geschwindigkeit die Position ist. dazu kannst du einfach deine messungen zusammenzählen und am ende durch den richtigen faktor dividieren. Und ja, Sie müssen Ihren Sensor kontinuierlich und mit hoher Geschwindigkeit lesen. Es liegt an Ihnen, zu definieren, was Hochgeschwindigkeit bedeutet. Dies hängt von der maximal möglichen Winkelbeschleunigung Ihres Systems ab.