Cómo calcular la aceleración a partir de datos sin procesar del acelerómetro

0

Estoy trabajando en un proyecto basado en el acelerómetro NXP MMA8653.

Este es un acelerómetro 3-axial I2C con resolución de 10 bits.

En realidad puedo leer los registros del acelerómetro y puedo configurarlo. Configuré el acelerómetro a escala completa igual a 2G y la sensibilidad asociada a esta escala completa es de 256 conts / g

Al leer el registro, obtengo tres variables con signo de 16 bits que corresponden a cada eje.

¿Cuál es la fórmula para calcular la aceleración en los tres ejes?

Mi MCU no tiene una unidad de punto flotante, por lo que quiero evitar divisiones. ¿Es posible obtener una aceleración en mg (milig - 1 ^ 10-3 g)?

¡Gracias por la ayuda!

    
pregunta Federico

2 respuestas

5

Según tengo entendido, obtendrás la aceleración en [g] en cada eje al dividir cada uno de los 3 valores que obtuviste por 256 (porque tu sensibilidad es de 256 cuentas / g).

Para evitar cualquier problema con la división de números enteros, le sugiero que lo haga en este orden, para cada valor:

  • Convierta el número en un largo firmado, para evitar cualquier desbordamiento en el futuro
  • Multiplica el valor por 1000
  • Divida el valor por 256: luego obtendrá el valor de aceleración en mili-g, redondeado a la mg más baja.

Sugerencia: si desea redondearlo al mg más cercano (en lugar del más bajo), puede agregar 128 (la mitad del número de conteo / mg) antes de dividir el valor, pero después de multiplicarlo por 1000.

Consejo 2: como mencionó en su comentario, puede usar un desplazamiento de bits de 8 en lugar de la división por 256 para mejorar la eficiencia del cálculo (existe la posibilidad de que su compilador optimice el código al hacerlo automáticamente de todos modos) )

    
respondido por el Edesign
0

Por lo general, puedes descifrar conversiones como estas examinando las unidades. Si divide la lectura del ADC con unidades de cuentas por la sensibilidad con unidades de cuentas / g , entonces las unidades de cuentas en el numerador y el denominador de la división se cancelarán mutuamente, quedando con g , el resultado deseado.

Por lo tanto, debe dividir el recuento de ADC por la sensibilidad para convertir en aceleración, pero en este caso, también tiene que tener en cuenta el desplazamiento. Este acelerómetro mide tanto la aceleración positiva como la negativa, pero el recuento de ADC no está firmado. Esto es posible porque el valor de conteo de ADC de cero no corresponde a cero g, sino que corresponde a la aceleración más negativa. Y el punto medio del rango de valores de ADC corresponde a una aceleración cero.

Por lo tanto, tiene un rango de recuento de ADC de 0 a 1023 con una sensibilidad de 256 conteos / g. Y el rango de aceleración de -2 a +2 g (técnicamente +1.996 g) significa que tienes un desplazamiento de -2 g.

aceleración = (valor de recuento de ADC / sensibilidad) + desplazamiento

ejemplos:

  • 256 cuentas / (256 cuentas / g) - 2 g = -1 g
  • 1023 cuentas / (256 cuentas / g) - 2 g = +1.996 g

Desplazar a la derecha 8 bits es lo mismo que dividir por 256. Pero en este caso, debes tener cuidado de no perder demasiada resolución cuando cambias. Por ejemplo, si cambia la lectura de ADC de 10 bits a la derecha en 8 bits, solo le quedarán 2 bits correspondientes a solo 4 lecturas posibles (-2, -1, 0 y 1 g).

Multiplicar el valor de conteo por 1000 mg / g antes de desplazarse a la derecha por 8 bits guardará esa resolución y proporcionará la aceleración en unidades de mg en lugar de g.

Parece que el MMA8653 proporciona el valor ADC de 10 bits en los 10 bits más significativos del registro de 16 bits. En otras palabras, el valor de ADC se desplaza hacia la izquierda en 6 bits (o se multiplica por 64). También deberás tener en cuenta esto, tal vez cambiando a la derecha 6 antes de multiplicar por 1000. Y una vez que multipliques por 1000, el valor ya no entrará en 16 bits, por lo que tendrás que pasar a un valor de 32 bits. / p>     

respondido por el kkrambo

Lea otras preguntas en las etiquetas