Trato de usar un aclerómetro BMI055 y la salida me está volviendo loco.
Lo configuré en sensibilidad 2G a 1000 Hz, eso significa que tengo una salida entre 0 y 4096 (12 bits).
Se dice que la salida es dos complementada, por lo que espero que 2048 sea 0G
El sensor se configura para que sea lo más plano posible usando medidores.
Ahora le pregunto en un bucle por sus datos FIFO (fifo de derivación de 1 cuadro) que me devuelve 6 bytes.
Según ficha técnica: LSB X MSB X LSB Y MSB Y LSB Z MSB Z
LSB X debe desplazarse a la derecha 4 veces y ORd con MSB X, que se desplaza a la izquierda 4 veces.
Entonces recibo un número de 12 bits.
¡El simple análisis de los valores 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 sin firmar
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 devolverme 2048 ya que X está en 0G.
4096 sería fuerza 2G.
0 sería una fuerza -2G.
Al poner X en -1G y +1G los valores parecen correctos (1000 y 3000).
Solo el centro 0G está en 0/4000 dependiendo de vibraciones menores en lugar del esperado 2046-2049
Son las 4 de la mañana, supongo que superviso algo muy crítico. iluminación por favor
Creo que te estás liando por la necesidad de 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 brindan 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 a dos legítimo 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 de destino que sea lo suficientemente grande como para contener el resultado. Digamos que está usando C en una MCU, y puede elegir una abreviatura firmada, y es de 16 bits. (Ninguno de estos es un hecho, por cierto).
Supongamos también que MSB y LSB son números de 8 bits. Ahora:
resultado corto firmado = (MSB << 8) | (LSB y 0xF0)
Esto debería darte un número que ya está en formato de complemento a dos, como se espera que sea el signo corto. Esto le dará un rango de números que es 16 veces el número bruto de 12 bits, pero que oscila correctamente alrededor de cero.
Luego, es posible que desee escalarlo dividiendo por 16. Puede pensar en realizar esa división usando scaledresult = (resultado >> 4), pero si es así, deberá verificar si el desplazamiento a la derecha realiza la extensión de signo. Es decir, establece scaledresult[15..12] en 1 si result[15] era 1.
Hay API listas para usar para la parte del acelerómetro en el BMI055. Por favor refiérase a:
PedroJ
John
PedroJ
if (x >= 2048) x = x - 4096
.John
kwc
John