Reduciendo el jitter y mejorando la velocidad de salida del acelerómetro

1

No estoy seguro de si se trata de una pregunta de EE o de StackExchange debido a la programación involucrada, pero de todos modos aquí va:

Acabo de construir un sensor de inclinación para el cargador frontal de mi tractor. Quería algo fácil de leer en luz diurna brillante, inalámbrica, accesorio magnético y razonablemente precisa para indicar la inclinación y el nivel de mi cargador frontal, de modo que pueda usarlo para nivelar algo del suelo fácilmente.

Utilicé mi propia MCU inalámbrica personalizada como controlador, conectándome a través de I2C con un acelerómetro / giroscopio GY-521.

La pantalla es solo un servomotor conectado a una manecilla indicadora y una carátula impresa con láser, y 5 LED también.

Aquí hay un video del dispositivo funcionando: enlace (lo siento por el ruido, ¡estaba tratando de mostrar que la inestabilidad no parece afectarlo tanto!) )

En las pruebas, funcionó muy bien. Pero tan pronto como coloqué el sensor en el cubo de mi tractor, la vibración del motor hizo que las lecturas del acelerómetro se volvieran locas. La aguja básicamente salta de un extremo al otro, haciendo que las lecturas sean inútiles.

Así que primero intenté promediar la salida. (Estoy muestreando a aproximadamente 5-10 muestras por segundo) Eso todavía produjo resultados inestables.

Así que implementé un filtro de paso bajo, usando un coeficiente de 0.1 para nuevas lecturas. Como puede ver en el video, esto ayudó a eliminar el temblor, pero ahora las lecturas son demasiado lentas. Al girar el dispositivo de un extremo de su rango al otro, la aguja tarda varios segundos en alcanzar la entrada. Esto también lo hace inutilizable, ya que tiene que ser más en tiempo real. Y como puede ver, lleva mucho tiempo volver a cero.

¿Alguien tiene sugerencias / ideas sobre cómo reducir la vibración causada por las vibraciones del motor y los golpes / golpes que experimenta el cucharón, a la vez que produce un resultado bastante rápido y preciso?

Tenga en cuenta que mi MCU no podrá manejar muchos cálculos matemáticos para cada muestra, así que no sé si eso elimina la FFT o no, es solo un 8051 básico que funciona a 16MHz.

Aquí están los enlaces para la hoja de especificaciones / registro del Accel / Gyro: enlace enlace

Cualquier información apreciada!

    
pregunta Ryan Griggs

2 respuestas

4

Parece que el tiempo de respuesta de la pantalla que necesita es bastante coincidente con algunas de las frecuencias de vibración dominantes que se ven en el cargador frontal del tractor y esto podría ser un problema real para resolver. En mi opinión, necesita muestrear a una frecuencia mucho más alta para evitar el alias, es decir, las vibraciones de alta frecuencia se reducen a frecuencias más bajas debido a una frecuencia de muestreo inadecuada. Esto puede ser suficiente para superar su problema. Lo siguiente es el filtrado de paso bajo de orden superior, como el 2º orden del tercer / cuarto orden. Parece que, en su pregunta, ha implementado un filtro de primer orden, pero esto podría producir resultados mucho mejores en un orden superior PERO, se está quedando sin velocidad de CPU.

De acuerdo, como algo que debe hacerse definitivamente, debe eliminar las frecuencias que pueden causar el alias a su frecuencia de muestreo y tal vez considerar un filtro de paso bajo analógico de cuarto orden mediante la conexión en cascada de dos etapas de filtro de tecla sallen. Aquí es una calculadora que puede configurar para una frecuencia de paso baja de 2Hz (lo mejor que va para obtener muestras de 10Hz y muchas cosas desagradables de alta frecuencia.

Buena suerte: no voy a decir que tendrá éxito sin algún tipo de amortiguación mecánica y un LPF analógico de alto orden en la parte delantera.

    
respondido por el Andy aka
0

Pude obtener la frecuencia de muestreo de aproximadamente 26 Hz y eso es todo lo que mi pequeña MCU puede hacer. Sin embargo, estabilizó bastante bien la salida.

Así que actualmente, estoy haciendo lo siguiente:

1) Muestreo de la aceleración. a 26Hz (lo más rápido posible)

2) Filtrado de paso bajo con un coeficiente de 0.05

Aquí está el código para hacer el filtrado de paso bajo (en C):

new_accel_x_value = read_accel_x();   // Read value from X accelerometer
accel_x = (new_accel_x_value * 0.05) + (accel_x * 0.95);   // accel_x stores the "filtered" accelerometer X value and passes it on to the display.

Hay un poco de retraso en la salida (aproximadamente 500 ms), pero las vibraciones del motor se eliminan por completo y la salida es muy estable y precisa. Lo usé ayer por varias horas con buenos resultados.

¡Gracias por ayuda / consejo!

    
respondido por el Ryan Griggs

Lea otras preguntas en las etiquetas