El acelerómetro da valores incorrectos para los ejes estacionarios

0

Tengo una IMU BMI160 que proporciona una buena lectura para el eje paralelo a la gravedad (1G o -1G), pero un valor cambiante de aproximadamente 2G o -2G para los ejes que deben mostrar 0G. Esto es cierto para todos los ejes, he intentado rotar la IMU.

Estoy leyendo la IMU con una placa de descubrimiento STM32F4 a través de SPI. A mi entender, la IMU genera datos para el acelerómetro en 2 bytes, siendo LSB el primero. Dentro de estos bytes, los bits están en formato MSB. Por lo tanto, una lectura de 0111 0010 1111 1101 debe ser 64 882 en decimal (invertida a 1111 1101 0111 0010) e igualar a aproximadamente 19.23 m / s ^ 2 o 1.96 G. Sé que los bits exactos se mueven en la línea de datos SPI, ya que Lo he leído con un analizador lógico para verificar.

Configuración de BMI160: el modo de energía es "normal", y el registro ACC_CONF es "0x2B": sin submuestreo, modo de filtro normal (frecuencia de corte 3dB) y una velocidad de datos de 800 Hz. También he probado 100 Hz y 1600 Hz. La velocidad en baudios para SPI es 156,250 Hz, también he intentado más alto (por ejemplo 1,250,000 Hz).

Sé que el BMI160 funciona bien, porque tengo una placa de aplicación de Bosch y un programa de escritorio de desarrollo, que genera un buen gráfico de ejecución de datos atractivos para todos los ejes. También he probado un BMI160 diferente y una placa STM32 diferente.

Sospecho que el problema está en algún lugar en cómo inicializo la pizarra o en cómo leo el SPI, pero ¿dónde exactamente?

Hoja de datos de BMI160: enlace

    
pregunta epe

1 respuesta

4

Está obteniendo un valor de 0xFD72 que funciona como -654 no como 64,882. En el modo de rango 2g que funciona como -39.9mg. Sobre lo que esperaría.

- Información adicional

Como se indica en los comentarios a continuación, este es un número firmado por el complemento de 2. Esa es la forma estándar de representar números firmados en una computadora o sistema electrónico.

Trate el bit más significativo como indicando -32768 en lugar de +32768 y luego agregue los otros bits como es normal, por ejemplo

1000_0000 0000_0000 (0x8000) = -32768

1000_0000 0000_0001 (0x8001) = -32768 + 1 = -32767

1111_1111 1111_1111 (0xFFFF) = -32768 + 32767 = -1

No debería necesitar hacer esta conversión usted mismo, solo dígale al compilador que el valor es un valor con signo de 16 bits y que debe entenderlo correctamente (por ejemplo, en c almacenarlo como un int16_t)

Con 16 bits puede representar cualquier valor entre -32768 y +32767. En el modo de rango 2g, el sensor que está utilizando genera un valor de g / 16384 que da un rango de +/- 2g

También cuando se trata de números binarios, es normal usar hexadecimal en lugar de escribir el binario. Es más rápido y mucho menos propenso a errores, ya que cada carácter se relaciona con 4 bits, es rápido y fácil de convertir entre binario y hexágono según sea necesario.

    
respondido por el Andrew

Lea otras preguntas en las etiquetas