Acelerómetro Bosch BMI055 devuelve valores desbordados de 8 bits?

2

Intento usar un Acclerometer BMI055 y la salida me está volviendo loco.

Lo he configurado en sensibilidad 2G a 1000Hz, eso significa que tengo una salida entre 0 y 4096 (12 bits).
Se dice que la salida tiene dos complementos, por lo que espero que 2048 sea 0G

El sensor está configurado para ser lo más plano posible con medidores.

Ahora lo pregunto en un bucle para sus datos FIFO (1 fotograma bypass fifo) que me devuelve 6 bytes.
Según la hoja de datos: LSB X MSB X LSB Y MSB Y LSB Z MSB Z

LSB X debe ser desplazado a la derecha 4 veces y ORd con MSB X que se ha cambiado 4 veces a la izquierda.
Así que recibo un número de 12 bits.

¡El solo análisis de los valores de X muestra que MSB X está saltando entre 0 y 255!

Código:

temp[0]=(result[1]<<4) | ((result[0])>>4);

Esto muestra LSB MSB 12BIT-unsigned

Data X:  1       0       0 
Data X:  85      255     4085 
Data X:  201     255     4092 
Data X:  201     255     4092 
Data X:  221     255     4093 
Data X:  157     0       9 
Data X:  49      0       3 
Data X:  181     255     4091 
Data X:  229     255     4094 
Data X:  17      0       1 
Data X:  161     255     4090 
Data X:  117     255     4087 
Data X:  221     255     4093 
Data X:  5       0       0 
Data X:  209     255     4093 

Debería devolverse 2048 ya que X está en 0G.
4096 sería fuerza 2G.
0 sería la fuerza -2G.

Al poner X en -1G y + 1G, los valores parecen ser correctos (1000 y 3000).
Solo el centro 0G está en 0/4000 dependiendo de las vibraciones menores en lugar del 2046-2049 esperado

Son las 4 de la mañana, supongo que superviso algo muy crítico. La iluminación por favor

    
pregunta John

2 respuestas

2

Creo que te estás arruinando por necesidad para que el signo del número se extienda hacia la izquierda. Mi lectura de la hoja de datos es que los registros MSB y LSB le dan un conjunto de 12 bits, que, como un número de 12 bits debe considerarse en formato de complemento a dos.

Por lo tanto, primero debe combinar los valores, luego, si es necesario, realizar cualquier corrección para asegurarse de que sea un número de complemento de dos legítimos dado el tamaño del tipo de datos en el que lo ha ingresado. Luego escálelo si es necesario.

Sugeriría: primero elija un tamaño de datos objetivo que sea lo suficientemente grande como para contener el resultado. Digamos que está utilizando C en una MCU, y puede elegir corto firmado, y es de 16 bits. (Ninguno de estos es un dado, por cierto).

Supongamos también que MSB y LSB son números de 8 bits. Ahora:

resultado breve firmado = (MSB < < 8) | (LSB & 0xF0)

Esto debería darle un número que ya esté en formato de complemento a dos, como espera que esté el corto firmado. Esto le dará un rango de números que es 16 veces el número de 12 bits en bruto, pero que se extiende alrededor de cero.

Es posible que luego quieras escalarlo dividiendo por 16. Puedes pensar en realizar esa división usando scaledresult = (resultado > > 4), pero si es así, deberás verificar si el cambio a la derecha realiza la extensión de signo. Es decir, establece el resultado de escala [15..12] en 1 si el resultado [15] era 1.

    
respondido por el gwideman
1

Hay API listas para usar para la parte del acelerómetro en el BMI055. Por favor refiérase a:

controlador del sensor Bosch Sensortec BMA2x2

    
respondido por el Lucas

Lea otras preguntas en las etiquetas