Adquirir y fusionar datos de diferentes controladores

0

TL; DR: ¿Cuáles son algunas opciones para fusionar los datos adquiridos con controladores separados?

Estoy desarrollando mi propia IMU para un cuadrotor.

Mis entradas son un acelerómetro, un giro, un magnetómetro y un barómetro, todo a través de I2C y mi módulo GPS a través de una serie. Las actualizaciones de bus I2C & se transfiere mucho más rápido (~ pocos ms) que el serial (~ 1s, 4800 baudios).

Mis salidas serían comandos para 4 motores y registro de datos.

He estado leyendo las cosas de I2C con un AVR porque necesito actualizaciones rápidas para evitar la deriva de las cantidades que estoy integrando (giro, aceleración). Sin embargo, no puedo leer el gps con el mismo AVR a 4800 baudios sin saltarme una eternidad de datos de I2C. Llegué a la conclusión de que necesito leer el gps con otra cosa. (Actualmente una pi frambuesa)

Ya implementé un filtro kalman en el AVR para gyro / accel / mag / baro. Ahora quiero plegarme en GPS.

La opción más sencilla sería mover todo a la pi y ejecutar el I2C y la serie en subprocesos separados y guardar en variables globales. Pero alejarme de la adquisición de datos en tiempo real me preocupa.

Otra opción puede ser adquirir el I2C y el Serial con dos AVR independientes y guardar los datos en un módulo de memoria externo. Entonces necesitaría un tercer dispositivo para sacar todos los datos del módulo de memoria y ejecutar los cálculos. (¿Quizás esta es una versión loca de 'hardware' de una variable global?)

Simplemente tengo la sensación de que lo estoy haciendo de la manera incorrecta, incluso si pudiera hacerlo por fuerza bruta. ¿Existe una forma "correcta" de resolver este problema?

    
pregunta Adam Griffin

1 respuesta

2

La forma típica de hacer esto con un solo micro es establecer búferes y rellenarlos con ISR (rutinas de servicio de interrupción) activadas por la recepción de datos GPS en serie o datos I2C. Establezca una bandera cuando un mensaje completo esté disponible en el búfer y léalo con su rutina de fondo. A 4800 baudios, tienes unos 2000 microsegundos entre personajes, por lo que incluso si el búfer de hardware es un solo personaje, tienes mucho tiempo para hacer otras cosas. Si duplica el búfer, solo tiene que preocuparse por el tiempo entre mensajes en lugar del tiempo entre caracteres.

Los AVR tienen un manejo de interrupciones decente y probablemente puedas escribir todo en C si lo deseas.

    
respondido por el Spehro Pefhany

Lea otras preguntas en las etiquetas