Datos de campo magnético STM32F3Discovery & LSM303DLHC que no se actualizan

0

Tengo problemas para leer los 6 registros de datos del campo magnético del LSM303DLHC en mi tarjeta de descubrimiento STM32F3. (OUT_X_H_M, OUT_X_L_M, etc.)

Utilicé la demostración STM32F3Discovery como un ejemplo de cómo leer desde el sensor de brújula. Copié las funciones Demo_CompassConfig () y Demo_CompassReadMag () provistas en main.c de la demo. También configuré un puerto de comunicaciones virtual para poder descargar datos de texto a un programa de terminal en mi PC y ver los valores que estaba leyendo.

Puedo leer bien los datos de aceleración del mismo sensor, pero no los datos del campo magnético.

Al igual que el código en la demostración, estoy inicializando el sensor de esta manera:

LSM303DLHCMag_InitTypeDef LSM303DLHC_InitStructure;
LSM303DLHC_InitStructure.Temperature_Sensor = LSM303DLHC_TEMPSENSOR_DISABLE;
LSM303DLHC_InitStructure.MagOutput_DataRate = LSM303DLHC_ODR_7_5_HZ ;
LSM303DLHC_InitStructure.MagFull_Scale = LSM303DLHC_FS_8_1_GA;
LSM303DLHC_InitStructure.Working_Mode = LSM303DLHC_CONTINUOS_CONVERSION;
LSM303DLHC_MagInit(&LSM303DLHC_InitStructure);

Cuando trato de leer los valores X Y Z de los datos del campo magnético utilizando la función de lectura de la demostración, muestran la primera lectura medida, pero luego nunca se actualizan y permanecen siempre iguales.

uint8_t buffer[3];
while (1) {
   // ... 
   Demo_CompassReadMag(buffer);
   // ...
}

Si llamo a LSM303DLHC_MagGetDataStatus () antes y después de la lectura, siempre es 0x03. El bit 0 indica que hay un nuevo conjunto de mediciones disponible, y el bit 1 indica que los registros de salida están bloqueados.

En mi búsqueda, leí que los 6 registros de salida están bloqueados hasta que todos se han leído, y luego se cargan los siguientes datos medidos para otra lectura. Los datos parecen ser correctos si enciendo y apago el dispositivo en diferentes orientaciones y lo leo, pero parece estar bloqueando el primer valor y luego nunca más cargarlo. Así que intenté leer los 6 valores a la vez para desbloquear los registros de salida.

uint8_t buffer[6];
while (1) {
   // ... 
   LSM303DLHC_Read(MAG_I2C_ADDRESS, LSM303DLHC_OUT_X_H_M, buffer, 6);
   // ...
}

Lo mismo, los datos XYZ nunca cambian. Incluso intenté leer los 13 bytes (0x00 a 0x0C) del sensor magnético. Todavía no se actualiza.

Si reconfiguro el dispositivo después de cada lectura, puedo obtener datos en tiempo real del sensor. Obviamente, esto no es lo que se supone que debes hacer.

uint8_t buffer[3];
while (1) {
   // ... 
   Demo_CompassReadMag(buffer);
   Demo_CompassConfig();
   // ...
}

Supongo que estoy haciendo algo mal o me falta algo simple, y el bloqueo nunca se libera, y el siguiente conjunto de valores nunca se carga.

¿Puede alguien decirme cómo se supone que debe leer los 6 valores de datos del campo magnético y restablecer el bloqueo del registro de salida? He intentado muchas cosas y no puedo hacer que funcione.

    
pregunta user1316642

2 respuestas

1

Me encontré con el mismo problema con el LSM303DLHC en modo continuo usando los registros de datos mag de incremento automático. No logré resolver el problema con el bloqueo de datos que nunca se borró, pero resolví el problema con el siguiente algoritmo:

1. Power on chip and wait ~400us
2. Open/Enable/Start I2C
Loop
    3. Write to the MR_REG_M register with value 0x01 to place into single shot mode
    4. Read SR_REG_M register until DATA_RDY flag is set
    5. Read 6 mag data registers
    6. Write to the MR_REG_M register with value 0x3 to place into sleep mode
EndLoop
7. Close I2C
8. Power down chip

Detener e iniciar I2C durante el bucle me causó problemas, pero el método de disparo único de suspensión de sueño único parece ser bastante sólido.

Espero que ayude.

    
respondido por el user38932
1

Estoy respondiendo a esta antigua publicación con la esperanza de que ayude a los nuevos usuarios del magnetómetro LSM303DHLC ...

Encontré el problema de bloqueo de datos (aparente) y descubrí que se debía a que la lectura final del registro debía terminar con NMAK (no MAK) y luego con SP (detener). Una vez que modifiqué la llamada para el último registro leído (OUT_Y_L_M), los datos se actualizaron como se esperaba. Sin el NMAK, el dispositivo cree que la transacción inicial aún está pendiente. NMAK (reconocimiento negativo) requiere dejar la línea SDA alta (en lugar de mantenerla baja para MAK).

Si está utilizando una llamada de subrutina que emite una MAK para las otras lecturas de registro, como lo estaba yo, tendrá que modificar la última llamada.

    
respondido por el W.Youngs

Lea otras preguntas en las etiquetas