¿Qué puedo hacer para disminuir la latencia de estos puertos serie que están conectados a una PC a través de un adaptador de serie a USB?

8

Creo que accidentalmente he descubierto una necesidad en mi vida de sistemas integrados. ¡Lo cual es genial! Y algo de miedo. Y necesito ayuda.

Fondo : Me contrataron para crear una aplicación GUI que realiza escaneos de dos SICK LMS-291s y los integra con un GPS de precisión sub-pulgadas, para que sepa dónde ocurrió cada escaneo. Como ingenuo programador web que soy, entendí que el tiempo sería importante, ¡pero no me di cuenta de que también sería difícil! Si no sabe cuándo se produjo cada punto de GPS y cada exploración, no puede averiguar dónde se producen las exploraciones. Ups.

Habían especificado windows 7 como plataforma, y también habían comprado un SeaLevel RS422 a USB para conectar los sensores y el GPS a, y en poco tiempo descubrí mi locura. En algún lugar entre los sensores y mi programa de computadora, algo impedía que los escaneos llegaran de manera oportuna. El LMS escupe 75 exploraciones por segundo, o a 13.32 ms / exploración. Mi programa no los consigue de manera oportuna. Los obtiene cada 100 milisegundos, en grupos de 7 u 8 o 10 o algo así. También a veces no se muestran suficientes escaneos, o están destrozados. O este adaptador SeaPort solo envía diez veces por segundo (¿es posible? No sé cómo funciona el USB) o Windows no está revisando el búfer (debe haber un búfer en alguna parte, ¿no?) Con la frecuencia suficiente.

Día actual : Esto conduce a algunas inexactitudes con las que el cliente está básicamente de acuerdo. Sin embargo, no lo soy, y como tengo la oportunidad de hacer un trabajo similar para el cliente (¡integrando más entradas de sensores!), Me gustaría averiguar cómo hacerlo correctamente, por ejemplo. dada la precisión del GPS, ser capaz de dar garantías sobre la precisión y la exactitud de las ubicaciones de escaneo.

¿Cómo se ve eso? Necesito una interfaz de usuario y poder comprobar la entrada de estos tres dispositivos cada 13,32 milisegundos. Si utilizara FreeRTOS con, digamos, Nano-X para la GUI, ejecutado en una computadora portátil que proporcionan, ¿me parecería una solución sensata? ¿Es posible que el adaptador RS-422 a USB esté causando estos retrasos, y el uso de Windows está realmente bien para este propósito?

    
pregunta canisrufus

4 respuestas

6

El problema es casi ciertamente en el almacenamiento en búfer USB relacionado con el convertidor USB-RS422. El USB tiene una latencia variable y bastante alta.

La solución más sencilla sería una mejor interfaz RS422, idealmente algo basado en PCI / PCI-e. Eso resolvería los problemas de latencia.

También puedes modificar la tasa de sondeo de USB, aunque esto depende bastante del sistema operativo host (¿en qué plataforma estás?).

Para lo que vale la pena, busqué en el sitio web del sistema de nivel del mar, y está MASIVAMENTE infectado con la mentira de marketing. Literalmente gastan como 10 páginas y varios documentos en blanco diciendo "usamos un concentrador USB internamente, en lugar de hacer multiplexación MCU".

Hey SeaLevel! ¡Eso es lo que hace también la interfaz USB-4-puerto USB de 4 puertos que compré en e-bay desde China! ¡No eres especial, incluso si escribes media docena de libros blancos insólitos tratando de hacer que suene como si lo fueras!

¿Ha intentado forzar esas cosas para utilizar controladores FTDI? Pondría dinero en eso, solo están usando bog estándar FTDI FT232 o similar. ¿Puedes abrir el cuadro de uno de ellos y tomar fotos?

Si realmente quieres utilizar tu propio hardware, por diversión o por oportunidades educativas, te sugiero que no intentes hacer todo lo que está en él. Ya que necesita simplemente correlacionar en el tiempo las tres señales, todo lo que realmente necesita es algo que pueda escuchar en tres líneas seriales (dos RS422, una RS232 (el GPS)), marca la hora de los datos, y lo reenvía a la computadora principal.

Una vez que los datos están marcados por tiempo, puedes tener toda la latencia del búfer que quieras, ya que siempre puedes mirar los sellos de tiempo.

De manera realista, si no tiene una base en el hardware, diseñar algo con la contracción suficiente para dibujar una buena interfaz gráfica de usuario es una tarea difícil.

Personalmente, probablemente arrojaría un ARM MCU bastante grueso al problema de almacenamiento en búfer, y lo haría. A pesar de que es un Arduino, el Arduino Due tiene un montón de SRAM, y es más que lo suficientemente rápido para lo que necesitas (y hay un montón de apoyo, que siempre es agradable).
Alternativamente, la serie STM32 tiene un rendimiento similar, y está más dirigida a usuarios "avanzados" (lea, hay menos o ningún ejemplo de referencia). ST hace un montón de bastante buenos, tableros de evaluación extremadamente económicos también.

Con el Due, usted obtiene un puerto USB nativo, para el cual podría rodar su propio controlador CDC si lo desea. Algunas de las las placas STM32 también tienen USB nativo.

    
respondido por el Connor Wolf
3

Si entiendo la pregunta, se trata de tomar mensajes de tiempo / lugar del GPS a través de una línea serie y de correlacionar los mensajes de datos de rango recibidos sobre otras líneas seriales. Idealmente, los mensajes del buscador de rango tendrían su propia marca de tiempo, y si pudiera sincronizar todos los relojes, sería capaz de precisar la ubicación donde se tomó el rango mediante la interpolación de la marca de tiempo del rango entre los dos mensajes gps con las marcas de tiempo coincidentes más cercanas. Pero, por supuesto, no tienes eso.

Un par de soluciones vienen a la mente, a lo largo de todas las líneas de usar un microcontrolador para hacer la correlación de datos en tiempo real, y bombear la salida de eso en el PPC para fines de visualización. Básicamente, el microcontrolador está ahí para hacer frente a los problemas de tiempo apretado.

Entonces, para una solución más simple, todo lo que necesita es una forma de recopilar todos los mensajes de varias líneas seriales diferentes, y combinarlos en un solo flujo, en el orden en que fueron recibidos, e introducirlos en la ORDENADOR PERSONAL. Puede inferir que cualquier mensaje del buscador de rango entre dos mensajes GPS ocurrió en algún momento entre esos dos mensajes.

Esto le da un grado de incertidumbre, por supuesto, dependiendo de la frecuencia de los mensajes del GPS. La desventaja es que a medida que aumenta la frecuencia de los mensajes GPS (para obtener una correlación más precisa), aumenta las demandas del microcontrolador y las demandas del enlace serial en la PC. En un extremo, el enlace serial está saturado de mensajes de GPS con un mensaje de rango ocasional. Obviamente, la mayoría de esos mensajes de GPS no son necesarios. Sin embargo, la ventaja de esta solución es que el micro tiene muy poco que hacer, desde el punto de vista del software. Puede hacerlo todo en un simple bucle de lenguaje ensamblador, no se requiere sistema operativo.

Para una solución más compleja, puede formar un reloj local en el micro, y usar el GPS para sincronizar el reloj ese , de modo que cuando reciba un mensaje de rango, pueda obtener una marca de tiempo Usando el reloj del micro. Usando un micro con una base de tiempo de cristal, probablemente podría arreglárselas con mensajes de GPS de 1Hz y aún así obtener una precisión mucho mayor que los tiempos de milisegundos impresos en los mensajes de rango. Probablemente, una persona competente en sistemas integrados también podría llevarlo a cabo en un ensamblador en un micro de extremo inferior, pero usted mencionó que apenas está comenzando. Puede buscar un micro más potente que pueda ejecutar Linux y, probablemente, encontrar una solución preexistente para sincronizar el reloj de Linux con el GPS.

    
respondido por el JustJeff
3

Lo que probablemente haría es multiplexar los datos en serie en un nuevo flujo de datos en serie a alta velocidad, con una intercalación estática. Luego alimente el flujo de datos a través de USB-UART a la computadora. De esa manera, sabría que el primer byte es del dispositivo 1, el segundo byte del dispositivo 2, el tercer byte del dispositivo 3 y en este caso un cuarto byte como CRC o número de secuencia. Agregue un par de bytes de inicio de marcador de cuadro para sincronizar en el flujo de datos, rellene los bytes si no hay datos disponibles y ya está. Es posible que no sepa el tiempo absoluto, pero sí sabe que es el tiempo relativo entre los distintos fragmentos de datos.

    
respondido por el jippie
1

También me gustaría ir con un microcontrolador para recibir los datos RS, marcarlos y enviarlos a la PC. No puede hacer ningún trabajo crítico de E / S con una PC con Windows (excepto con una tarjeta de sonido, quizás), porque el software y los controladores cambian todo el tiempo a medida que los controladores se actualizan a la espalda.

Pero lo primero que haría es obtener un analizador lógico USB, puede comprar uno por menos de USD100, obtener algunos mensajes del receptor GPS y verificar exactamente cuándo se recibe cada byte. Use esa información para probar / calcular exactamente cuán precisa es la sincronización de los datos en primer lugar: por ejemplo. exactamente qué y cuándo transmite la caja del GPS. Luego, puede averiguar qué precisión es alcanzable y cuánto esfuerzo estaría dispuesto a realizar para alcanzar un cierto nivel de precisión.

Arriba, una imagen de algunos analizadores lógicos USB (¿Saleae?).

[Editar] Jaja, usar la tarjeta de sonido podría ser una forma divertida de hacer que realmente funcione; puede conectar los datos de UART a la entrada de la tarjeta de sonido (a través de algunos resistores y condensadores) y escribir un software para detectar cada borde en el flujo en serie, lo que le brinda una precisión de sincronización excelente. Ok, no estoy realmente sugiriendo esto en serio, ¡solo por unas risas!

    
respondido por el PkP

Lea otras preguntas en las etiquetas