Hallo, ich versuche gerade mit einem STM32 Werte aus einer MPU6050-IMU
zu lesen. Ich habe dazu diese Funktion geschrieben:
1 | void read_sensor(sensor_raw * data) {
|
2 | int8_t buf[14];
|
3 | read_buffer(MPU6050_RA_ACCEL_XOUT_H, &buf, 14);
|
4 | data->temp = (((float) (buf[6] << 8 | buf[7])) /340.0 + 36.53);
|
5 | data->x_acc = (((float) (buf[0] << 8 | buf[1])) /16384.0);
|
6 | data->y_acc = (((float) (buf[2] << 8 | buf[3])) /16384.0);
|
7 | data->z_acc = (((float) (buf[4] << 8 | buf[5])) /16384.0);
|
8 | data->x_gyro = (((float) (buf[8] << 8 | buf[9])) /131.0);
|
9 | data->y_gyro = (((float) (buf[10] << 8 | buf[11])) /131.0);
|
10 | data->z_gyro = (((float) (buf[12] << 8 | buf[13])) /131.0);
|
11 | }
|
read_buffer() ist dabei nur ein Wrapper um eine HAL-Funktion, die per
I2C von der IMU liest.
Ungefaehr bei jeder zweiten Messung, allerdings ohne (erkennbares)
Muster, zeigt der Debugger (Eclipse CDT mit OpenOCD) eigenartige
Ergebnisse im Speicher an.
Beispiel:
x_acc:-0.434814453
y_acc:-0.00268554688
z_acc:-0.00317382812
Da ich mich auf dem Planeten Erde befinde, und die IMU vor mir auf einem
Tisch liegt, wuerde ich erwarten, dass sqrt(x^2 + y^2 + z^2) zumindest
in der Groessenordnung von eins liegen muesste. Bei etwa jeder zweiten
Messung taucht auf der z-Achse auch der richtige Wert, etwa 0.8, auf.
Als Schuldigen vermute ich meinen Code, der nach float castet, da die
rohen Sensordaten gut aussehen.
Zum Beispiel fuer die z-Achse (selbes Sample):
H: 0x32 L: 0xcc
(Das ist eine Zweierkomplementzahl, bei der das erste Bit nicht gesetzt
ist. Das dabei als Ergebnis ueberhaupt was Negatives rauskommt ist also
schonmal komplett verkehrt).
Ist mein Code falsch? Oder spielt mir Eclipse da einen Streich?