Acceso a los resultados del magnetómetro en MPU-9250

5

Estoy conectando un MPU-9250 a un microcontrolador STM8S207. Se accede al MPU-9250 a través de 400kHz I2C. No tengo problemas para obtener los datos de medición de la temperatura, el giroscopio y el acelerómetro, pero no puedo obtener los resultados de las mediciones incorporadas del magnetómetro AK8963. Puedo leer la identificación del dispositivo AK8963 correctamente, parece que los valores de calibración de Fuse-ROM son correctos, pero cuando programo el registro de modo 0x0A (CNTL1) en 0x01 o 0x02 (mediciones individuales o de 8Hz), el indicador DRDY nunca cambia a 1 , y el registro CNTL1 lee 0x03, que es un valor reservado.

¿Alguna idea de lo que me estoy perdiendo?

La secuencia de inicialización que estoy usando está debajo, después de llamar a configure_imu () , el registro 0x0A del AK8963 se lee como 0x03.

void configure_imu()
{
u8 status, mag_mode, mag_sense[3];
i2c_write_byte(MPU_I2CAddress, 27,GYRO_FULL_SCALE_2000_DPS); // Configure gyroscope range  
i2c_write_byte(MPU_I2CAddress, 28,ACC_FULL_SCALE_16_G); // Configure accelerometers range  
i2c_write_byte(MPU_I2CAddress, 0x37,0x02); // Set bypass mode for external I2C master connection

i2c_write_byte(MPU_I2CAddress, 0x6B,0x01); // Clock source is PLLGYROZ
i2c_write_byte(MPU_I2CAddress, 0x19,0x04); // Set SMPLRT_DIV to 0x04; this gives a 200 Hz sample rate when using the DLPF
i2c_write_byte(MPU_I2CAddress, 0x1A,0x03); // 42 Hz LPF
i2c_write_byte(MPU_I2CAddress, 0x6A,0x01); // Disable master mode and clear all signal paths
//i2c_write_byte(MPU_I2CAddress, 0x37,0x32); // Interrupts pin stays high until cleared, cleared on any read, I2C bypass
//i2c_write_byte(MPU_I2CAddress, 0x38,0x01);                                        // Data ready interrupt enabled 

status = i2c_read(MAG_I2CAddress, 0x00, I2C_rx_rd_ptr++, 1);
if (status==0) return;  
i2c_write_byte(MAG_I2CAddress, 0x0B,0x01);  // Software Reset Magnetometer
Delay(10000);
i2c_write_byte(MAG_I2CAddress, 0x0B,0x00);  // Deassert Software Reset Magnetometer
Delay(10000);
do { status = i2c_read(MAG_I2CAddress, 0x0A, &mag_mode, 1); }
    while ((status==1) && (mag_mode>0));
i2c_write_byte(MAG_I2CAddress, 0x0A,0x0F);  // Enter Fuse-ROM mode
Delay(10000);
i2c_read(MAG_I2CAddress, 0x10, mag_sense, 3);   // Read the x-, y-, and z-axis calibration values
i2c_write_byte(MAG_I2CAddress, 0x0A,0x00);  // Enter power-down mode
Delay(10000);
i2c_write_byte(MAG_I2CAddress, 0x0A,0x02);       // Magnetometer to enter continuous 8Hz measurement mode

}

Gracias a todos por los comentarios! En la siguiente versión de la placa, reemplacé el MPU-9250, por muy extendido que esté, con un Bosch BMO055. Es de poca ayuda si ya está comprometido con MPU9150 / 9250, pero si el giro de la placa sigue siendo una opción para usted, le recomiendo la parte de Bosch. Tiene el motor Sensor Fusion integrado, generando la información de aceleración / rumbo / quarternion fuera de la caja sin ningún procesamiento posterior de MCU, que es realmente lo que necesitaba.

    
pregunta maszoka

2 respuestas

1

En caso de que aún necesite la ayuda, ¿ha intentado leer el registro ST2 todas las veces? Hay una oración en la sección 8.3.5. de la hoja de datos "Por lo tanto, cuando se lea cualquiera de los datos de medición, asegúrese de leer ST2 registro al final ". También tuve problemas con los modos continuos, así que cambié al modo activado.

Las dos cosas resolvieron mis problemas de datos con este chip.

La mejor de las suertes. Tom

    
respondido por el Tommy B
0

Tuve el mismo problema aquí. ¿Está utilizando la placa de evaluación MPU-9250 de Invensense? Si es así, hay un error en la compilación, rellenaron a U2 con un AK8936 adicional, también en la dirección I2C 0x0C, por lo que es un conflicto de bus con el interno del 9250. Invensense me dijo que lo arrancara con una pistola de calor.

    
respondido por el user149546

Lea otras preguntas en las etiquetas