LSM303DLHC salidas congeladas

0

Ayer estuve intentando toda la tarde para obtener algunos datos de mi LSM303DLHC usando una placa Nucleo STM32L152.

Finalmente conseguí todas las cosas de I2C, logré establecer algunos registros, verificar su contenido, etc., así que dirigí mi atención a los datos que están saliendo.

No importa lo que haga, parece que los datos están atascados en los mismos valores. Cuando enciendo y apaga el sensor, recibo cambios en los valores del magnetómetro, pero luego permanecen igual hasta que lo enciendo nuevamente. Las salidas de los 3 ejes del acelerómetro son siempre cero.

He leído el registro de 'actualización de bloque' y confirmé el IC configurado para hacer actualizaciones continuas.

He verificado en un ámbito que lo que estoy recibiendo es correcto para el protocolo.

Estoy usando esta tabla de ruptura: enlace

¿Alguna idea de alguien? ¿Qué estoy haciendo mal aquí?

#include "mbed.h"

#define ACC_ADDR 0x32
#define MAG_ADDR 0x3C

// ACC registers //
#define CTRL_REG1_A 0x20

#define ACC_X_L 0x28
#define ACC_X_H 0x29
#define ACC_Z_L 0x2C
#define ACC_Z_H 0x2D

// MAG registers //

#define CRA_REG_M 0x00 

#define MAG_X_H 0x03
#define MAG_X_L 0x04

#define MAG_TEMP_H 0x31 
#define MAG_TEMP_L 0x32

//------------------------------------
// Hyperterminal configuration
// 9600 bauds, 8-bit data, no parity
//------------------------------------

Serial pc(SERIAL_TX, SERIAL_RX);

DigitalOut led(LED1);
InterruptIn btn(USER_BUTTON);
I2C i2c(PB_9, PB_8);



int main()
{

    char data_write[2];
    char data_read[6] = {0,0};

    /* Turn on temp sensor */
    data_write[0] = CRA_REG_M ;
    data_write[1] = 0x90;
    int status = i2c.write(MAG_ADDR, data_write, 2, 0);
    if (status != 0) { // Error
        while (1) {
            led = !led;
            wait(0.2);
        }
    }

    int i = 0;
    int bytes = 6;
    int j;

    while (1) {


        // Read acceleromter data registers
        data_write[0] = ACC_X_L;
        i2c.write(ACC_ADDR, data_write, 1, 1); // no stop
        i2c.read(ACC_ADDR, data_read, bytes, 0);

        printf("\f");
        // Display result
        for(j=0;j<bytes;j++){
            printf("d: %x\n", data_read[j]);
        }
        printf("---- (%d)", i++);        

        led = 1;


        wait(0.1);

    }

}
    
pregunta Sensors

2 respuestas

1

Aquí hay un fragmento de mi código que configura el LSM303DLHC

void Sensors::power_up_compass_max_speed()
{
    //Acc 1344Hz ODR, high power, all on
    compass.writeAccReg(LSM303_CTRL_REG1_A, 0b10010111);
    //Acc high res
    compass.writeAccReg(LSM303_CTRL_REG4_A, 0b00001000);
    //Mag continuous conversion
    compass.writeMagReg(LSM303_MR_REG_M, 0x00);
    //Enable mag 220Hz update
    compass.writeMagReg(LSM303_CRA_REG_M, 0b00011100);
}

Pórtelo y vea si funciona.

    
respondido por el geometrikal
1

Quizás esta sugerencia sea demasiado tarde, pero podría ayudar a otros.

Descubrí que siempre que estoy implementando un diseño I2c con un sistema en el que no he implantado previamente I2C, es muy útil comenzar el desarrollo utilizando un dispositivo de memoria en serie. Esto hace que la prueba de la interfaz I2C sea mucho más fácil.

Al probar una interfaz I2c con un dispositivo como un acelerómetro, a veces es difícil saber si los valores que lee tienen sentido.

Con un dispositivo de memoria, puede programar un patrón conocido en el dispositivo, luego probar sus funciones de lectura I2C comparando lo que leyó con el patrón que programó en él.

He probado mis funciones de I2C guardando un patrón en el dispositivo de memoria, y luego leo varias horas a la vez ... me dio mucha más confianza de que mis rutinas estaban a prueba de errores.

    
respondido por el Allan

Lea otras preguntas en las etiquetas