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.
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 .
Anindo Ghosh
Jigar4Electronics