Lectura de múltiples sensores y sincronización de datos

Estoy trabajando en un proyecto que requiere la lectura de cuatro sensores simultáneamente con marcas de tiempo de hasta milisegundos.

En este momento, lo mejor que se me ocurre es usar cuatro PIC para leer de cada sensor y enviarlos a través de cuatro RS232 a una computadora portátil. Entonces esos sensores no interfieren entre sí. Para las marcas de tiempo, uso un interruptor mecánico para activar una interrupción de cambio de voltaje de pin externo para iniciar los temporizadores en todos los PIC al mismo tiempo. Los temporizadores aumentan cada milisegundo y simplemente agrego el valor de los temporizadores al final de cada medición y los envío a través de los puertos serie.

Funciona, pero solo quiero saber si hay una mejor solución, ya que este proyecto es un poco crítico en cuanto al tiempo (se requieren 1000 mediciones por segundo). Y también el temporizador interno para cada PIC varía, lo que anula el propósito de sincronizar los temporizadores.

También pensé en simplemente leer desde el temporizador de un chip adicional usando SPI para que todas las marcas de tiempo provengan de una fuente . Sin embargo, no sé cuándo esos PIC leerán la hora de ese chip de origen. Podría haber cuatro PIC leyendo de él al mismo tiempo, lo que estropearía las marcas de tiempo.

Sensor 1: codificador de cuadratura (canal AB e índice)

Sensor 2: láser (envío de medición de vuelta a través de la interfaz Rs232)

Sensor 3: acelerómetro (analógico)

Sensor 4: inclinómetro (interfaz RS232)

Estoy usando cuatro chips DSPIC30f4011 . Tienen suficientes UART QIE y también admiten ADC simultáneo de cuatro canales.

Para el codificador de cuadratura , uso un QIE en el chip para leerlo y enviar la medición a una computadora portátil a través de UART.

Para Lazer e inclinómetro , los leo a través de UART1 y envío las mediciones a una computadora portátil a través de UART2 (un chip para cada uno de ellos)

Para el acelerómetro , la información xy y z se recopila utilizando el modo simultáneo de cuatro canales. Las mediciones se envían a una computadora portátil a través de UART.

Estaba a punto de sugerir más o menos lo que has hecho hasta que volví a leer la pregunta. Si se desvían, supongo que estás usando el reloj RC interno. Si todos los chips están físicamente lo suficientemente cerca, podría considerar conducirlos todos desde una sola fuente de reloj.
¿Cómo emiten los sensores sus datos? (por ejemplo, analógico, SPI, I2C, paralelo?)
@PeterJ ¿Crees que un cristal puede manejar cuatro chips? ¿Qué tan cerca debería estar normalmente?
@OliGlaser acaba de editar la pregunta con más detalles sobre los sensores.
@Timtianyang: buena decisión, debería poder sincronizar todos los chips desde una fuente, incluso si encadena los dispositivos para que solo 1 chip se ejecute desde el xtal y los demás se ejecuten desde sus pulsos de reloj derivados.

Respuestas (3)

Vale, tenemos algo de información sobre los sensores.

Esto debería ser factible con uno de los dsPIC33F más nuevos. Como @gbarry señala correctamente, tienen variantes que pueden hacer muestreo simultáneo de 4 canales (es decir, tienen 4 muestras y retenciones)

muestra sim dsPIC

Actualmente estoy usando uno de estos para experimentar, el dsPIC33FJ64GP802 . Es un pequeño chip impresionante, mucho mejor que los antiguos dsPIC30F4011. Funciona a hasta 40 MIP y tiene un DMA de 8 canales que puede usar para el ADC y otros periféricos, por lo que no debería ser tan difícil lograr que su sincronización se ajuste a las especificaciones. El DMA hace la vida mucho más fácil, puede usarlo más interrupciones para ahorrar su ciclo principal tanto tiempo como sea posible.
También tiene 2 UART y 4 capturas/comparaciones (para el codificador cuádruple) más 5 temporizadores.

Te falta 1 UART, por lo que no necesitarás hacer bit bang ni agregar un UART IC externo si no puedes encontrar una variante con más de 2 UART.

Hay algunas versiones para elegir, la que vinculé es una de las más pequeñas en cuanto a memoria (estaba interesado principalmente en el ADC y el DAC de audio más DMA para la creación de prototipos de ideas de audio), así que eche un vistazo a todas las opciones.

¿Por qué no usar UN micro con CUATRO ADC (no es algo difícil de encontrar) que lea los cuatro valores a la vez y luego informe los datos a través de UN enlace serial?

Sin más detalles sobre su configuración, sospecho que se está engañando a sí mismo acerca de su capacidad para obtener una precisión/sincronización de 1 mS también.

Editado para agregar : si puede brindar más detalles sobre la aplicación, hay muchas otras soluciones; 1ksps es fácilmente factible a través de la tarjeta de sonido de la computadora portátil (la mayoría hará 96 kHz/16 bits en 2 canales, muchos pueden administrar mejor/más canales).

Editar ahora tenemos más información:

Sensor 1: codificador de cuadratura = 3 pines GPIO (ya que A, B, I son solo niveles lógicos)

Sensor 2: Láser = 1 UART

Sensor 3: acelerómetro = 4x ADC

Sensor 4: inclinómetro = Otro UART

Conexión a la base: = Otro UART

Eso es 3 GPIO, 4 ADC y 3 UART, que es factible con UNO de sus dispositivos PIC actuales, si está dispuesto a usar un puerto UART adicional (un montón de rutinas UART de PIC bit-bang en Google). Sería más fácil usar un solo chip que tenga un UART de repuesto o algún otro puerto, pero tal vez su inclinómetro o láser podría usar SPI/I2C. Solo un pensamiento.

Cuestionaría su especificación para la sincronización de algo de esto (dada la muestra-> conversión-> UART-> PIC-> ruta UART para el láser y el inclinómetro), me parece que todo estará sujeto a diferentes cantidades de retraso , incluso si los datos se informan de una sola vez cada 1 mS, es probable que no estén sincronizados consigo mismos hasta cierto punto.

No puedo pensar en un microcontrolador común con cuatro ADC, solo los que tienen cuatro entradas analógicas multiplexadas a un solo ADC que toman lecturas secuencialmente. Pero concedido, puede ser una opción para 1Ksps dependiendo de qué retrasos entre lecturas se puedan tolerar.
Depende de qué tan cerca lo necesite, hay muchos micros con ADC muxed que podrían tomar lecturas de 4 o más canales con un microsegundo de diferencia entre sí, el micro que usamos (MCF52259) especificaciones: 8 canales ADC de 12 bits, hasta 1,66 millones de muestras por segundo, tiempo de conversión único de 8,5 ciclos de reloj ADC (= 1,7 μs), 8 conversiones en 26,5 relojes ADC (= 5,3 μs) en modo simultáneo. Y esa no es realmente su especialidad, ni es particularmente rápido (80 MHz máx.).
@JohnU acaba de editar la pregunta con más detalles sobre los sensores
Parece que la línea dsPIC33 tiene partes que pueden tomar cuatro lecturas de ADC simultáneamente.
Si utilizo un chip para todos los sensores, ¿se recopilarán las mediciones secuencialmente? Ex sensor 1 --> sensor 2 --> sensor 3-->.sensor 4. Existe una posible diferencia de tiempo entre la lectura del primer y el último sensor. También necesito generar datos recopilados que ralentizarán más el ciclo principal. ¿Cómo solucionas eso?
No, mire la respuesta de Oli Glasser: los valores se muestrean simultáneamente (congelados) y luego la conversión de ADC se realiza secuencialmente , así es como funcionan la mayoría de los micros (estará en la hoja de datos de PIC).
@JohnU Cuando dice que los valores se muestrean simultáneamente, ¿se refiere a ADC? ¿Qué pasa con esos sensores UART/Quadrature?
Si está hablando con un sensor a través de UART, entonces hay una demora entre que ese sensor realiza una medición (y debemos suponer que también está realizando su propia conversión ADC) y envía esa medición por el UART (a menos que su UART funcione a MHz velocidades esto es significativo incluso para un solo byte). También asumo, dada la naturaleza crítica de tiempo de todo esto, que cosas como las conversiones ADC y las comunicaciones UART se están configurando como procesos autónomos controlados por interrupciones en el micro, posiblemente con DMA, etc. etc. De lo contrario, se está engañando a sí mismo. sobre su tiempo / exactitud / precisión.

¿Sería posible una solución FPGA? Me imagino que un FPGA, como una verdadera solución de hardware con capacidad multitarea, podría procesar y codificar las cuatro señales en paralelo con bastante facilidad. Cuatro PIC independientes con relojes independientes suena como una receta para el infierno de tiempo.

Recomiendo el Papillio . Una pequeña curva de aprendizaje si nunca ha desarrollado para FPGA antes, pero son bastante poderosos en ciertos escenarios.