Hi,
ich hänge seit ein paar Tagen an einem Problem mit einem MPU-6050. Die Kommunikation über I2C mit dem MPU-6050 funktioniert, aber aus irgendeinem Grund sind die Werte mancher Beschleunigungsmesser und Gyroskope 0x00. Und zwar je nach Initialisierung unterschiedliche.
Wenn ich den MPU-6050 folgendermaßen initialisiere:
und ich anschließen die Register ab 3B auslese, stehen dort Werte für ACCEL_XOUT, TEMP_OUT, GYRO_XOUT und GYRO_YOUT, alle anderen Register sind 0x00. Schreibe ich in der Initialisierung nach dem Aufwecken des MPU-6050 in das Register 6A:Code:if (i2c_start(0xD0 + I2C_WRITE)) { /* Set clock to X GYRO and disable sleep */ i2c_write(0x6B); i2c_write(0x01); i2c_stop(); }
Dann stehen ab dem Register 3B die Werte für ACCEL_YOUT, TEMP_OUT, GYRO_YOUT und GYRO_ZOUT, alle anderen Register sind 0x00. Das sind andere Register als im ersten Fall.Code:if (i2c_start(0xD0 + I2C_WRITE)) { /* Set clock to X GYRO and disable sleep */ i2c_write(0x6B); i2c_write(0x01); i2c_write(0x6C); i2c_write(0x00); i2c_stop(); }
Die Funktion zum Auslesen der Register sieht folgendermaßen aus:
Ich schaffe es nicht, dass Werte für alle Sensoren gleichzeitig in den Registern stehen. Was mache ich falsch?Code:void mpu6050_getall(int16_t *accel_xout, int16_t *accel_yout, int16_t *accel_zout, int16_t *gyro_xout, int16_t *gyro_yout, int16_t *gyro_zout, int16_t *temp_out) { if (i2c_start(0xD0 + I2C_WRITE)) { i2c_write(0x3B); if (i2c_rep_start(0xD0 + I2C_READ)) { *accel_xout = (((int16_t) i2c_read_ack()) << 8) | i2c_read_ack(); *accel_yout = (((int16_t) i2c_read_ack()) << 8) | i2c_read_ack(); *accel_zout = (((int16_t) i2c_read_ack()) << 8) | i2c_read_ack(); *temp_out = (((int16_t) i2c_read_ack()) << 8) | i2c_read_ack(); *gyro_xout = (((int16_t) i2c_read_ack()) << 8) | i2c_read_ack(); *gyro_yout = (((int16_t) i2c_read_ack()) << 8) | i2c_read_ack(); *gyro_zout = (((int16_t) i2c_read_ack()) << 8) | i2c_read_nak(); } } i2c_stop(); }
Lesezeichen