Periféricos de computadora para detectar inmediatamente (<5 ms) cambios de estado de entrada digital en programas C#

La aplicación C# en la que estoy trabajando debe poder llamar a una función dentro de los 5 milisegundos del cambio de estado de una señal de entrada digital (0V = apagado, 5V = encendido).

En lugar de usar software para sondear repetidamente el estado de esa entrada, me gustaría que algún hardware simplemente llame a una función de software cuando el hardware detecta un cambio de estado (como cómo funcionan las interrupciones de hardware).

¿Alguien sabe cómo hacer esto (qué puertos usar) en una torre de PC estándar? ¿O alguien sabe de algún periférico de hardware que permita esta funcionalidad?

Las latencias ocasionales están bien. Necesito <5ms promedio.

Básicamente necesito tomar tantas muestras como sea posible de la forma de onda digital de entrada. (preferiblemente en el programa C#, en lugar de en un microcontrolador periférico, aunque estoy abierto a sugerencias).

Por ejemplo, descubrí que Labjack U3 puede sondear su entrada digital en menos de un milisegundo. Esta es una respuesta válida a la pregunta, pero me interesan más respuestas, especialmente las que no usan sondeo o sondeo más rápido que 1 ms.

Sería bueno una alta impedancia de entrada (entradas digitales).

¿Respuesta dura en tiempo real de 2ms? ¿Bajo Windows?
De ninguna manera lo estás haciendo. Si nos dice el problema real , podemos ayudarlo a encontrar una solución adecuada.
Ya verifiqué que podía hacerlo usando un LabJack U3 (un dispositivo de microcontrolador) y sondeando repetidamente su estado de entrada (que se puede hacer cada milisegundo). Entonces, la pregunta no es ridícula. quiero mas ideas Por ejemplo, las interrupciones del teclado y del mouse ocurren en nanosegundos, no en milisegundos.
La parte ridícula es esperar que un sistema operativo estándar le brinde este nivel de capacidad de respuesta. Los sistemas operativos estándar están diseñados para brindarle un rendimiento máximo, a expensas de la latencia. Incluso un sistema moderno de varios GHz puede tener latencias ocasionales del orden de muchos microsegundos o más de milisegundos con un sistema operativo normal, según lo que se esté ejecutando. Hay sistemas operativos especiales diseñados para problemas en tiempo real (incluida una versión especial de Windows). Los microcontroladores a menudo no tienen un sistema operativo o usan uno de estos sistemas operativos en tiempo real para brindarle una latencia casi nula.
@OrangeSherbet Las interrupciones pueden ocurrir en tiempo cero, pero su manejo en el sistema operativo es mucho más lento.
De todos modos, es posible que pueda lograr esta latencia a veces. Pero no puede confiar en ello, ya que no está garantizado.
La aplicación no requiere una latencia constante. Es un algoritmo diseñado para aprender datos sobre la forma de onda repetitiva de la entrada, y el rendimiento del algoritmo está fundamentalmente limitado por la frecuencia con la que puedo aprender sobre la entrada. Básicamente quiero tomar tantas muestras como sea posible, no importa si las muestras están escalonadas e inestables.
De todos modos, como está diciendo que está familiarizado con algunas cosas de MCU, sugeriría implementar el muestreo en el lado de MCU, empaquetar los datos de alguna manera y enviarlos a través de algún canal de comunicación a la computadora.
¿Como un DAQ? Tendré que abandonar algún código, pero creo que probablemente tengas razón, Eugene.
Algo como esto. Solo asegúrese de que podrá lograr la velocidad que desea teniendo en cuenta la velocidad con la que se procesarán los marcos de comunicación.
Ni las tasas de respuesta del mouse ni del teclado están ni siquiera cerca de los nanosegundos. Una respuesta de interrupción de velocidad completa de USB es de 1 ms e incluso en un dispositivo de alta velocidad 2.0, lo mejor que puede hacer es 125us.
La latencia del paquete USB es probablemente cientos de veces mayor que el tiempo de señal a interrupción.
¿Cuál es el tiempo mínimo entre dos pulsos?
50 milisegundos (casi dichos microsegundos) durante un período completo (alrededor del 50% del ciclo de trabajo) es el mínimo. Idealmente, podría averiguar cuándo la señal sube en un corto período de tiempo. En otras palabras, podría tener unos 20 milisegundos de alto, seguidos de unos 20 milisegundos de bajo, etc., así que espero que en 20 ms pueda hacer varias muestras.
parece que necesita un microcontrolador para hacer el muestreo, y luego un paquete en serie (usb o serie clásico) a un programa de espacio de usuario para realizar el procesamiento por lotes entre cada evento. Esto es definitivamente alcanzable. Consigue algo barato y fácil como un Teensy 3.1 por $20
Tenía un Atmega328P que realizaba un muestreo de datos serio y envío de spam de mensajes llenos de bytes a una aplicación C# usando un convertidor USB-Serial en Windows 7, y también en Linux en un robot usando C++, y funcionó maravillosamente en ambos casos, para tiempos muy sensibles aplicaciones (codificador de motor, para la detección del ángulo).
@KyranF hiciste algo mal; Los lenguajes recolectados como basura no son aptos para "aplicaciones muy sensibles al tiempo". Los retrasos pueden ser arbitrariamente largos.
@ilkhd ¿no leíste lo que hice? Utilicé un microcontrolador para la recopilación de datos y envié los datos en ráfagas con marcas de tiempo a la computadora para su procesamiento/almacenamiento/asociación con datos LIDAR.
@ilkhd, el programa C # o C ++ que intenta hacer el muestreo de datos y la marca de tiempo habría fallado horriblemente en la tarea, como usted dice, pero no tiene nada que ver con la recolección de basura. Es el sistema operativo y los retrasos aleatorios de 10 ms vienen de las operaciones a nivel del sistema operativo (kernel) que arruinan el rendimiento
@KyranF ¿Entiendes cómo funciona el recolector de basura? C# no es apto para nada que requiera menos de 1 minuto de retrasos aleatorios.
@ilkhd, debes estar haciendo algo mal amigo, lo siento.
@KyranF si necesito incluso un tiempo real muy relajado, no lo haría con un lenguaje recolectado de basura; c o c++ están bien pero no C#, "compañero".
@ilkhd Mi experiencia demuestra lo contrario, sobreestimas los retrasos. Puede que no se garantice el rendimiento, pero ¿retrasos aleatorios de 1 minuto? No. Tuve una velocidad increíble, cero retrasos, Y todo se ejecutó en una aplicación GUI de Windows Forms para arrancar.
@KyranF Gracias por sus sugerencias constructivas. Parece que Teensy 3.1 funciona muy bien, excepto que tengo problemas para encontrar una biblioteca .NET para C# para Teensy. Supongo que, en general, un pequeño arduino con funcionalidad .NET sería bueno. Pero Labjack es aún más sencillo, aunque 108$...
Echa un vistazo a .NETduino. Pero, ¿por qué quieres una biblioteca de C# para Teensy? Lo programa con Arduino usando el complemento TeensyDuino para Arduino IDE, y define una interfaz serial simple entre Teensy y un programa C#, donde el programa C# solo recibe y procesa paquetes seriales.
Estoy un poco perdido en lo que quieres decir con "definir una interfaz serial simple y un programa ac #", ¿cómo defino tal cosa? ¿Hay algún tipo de biblioteca de comunicación usb(?) para comunicarse con Teensy durante un programa C#? ¿Quizás System.IO.Ports?

Respuestas (3)

¿Necesita realizar una acción específica en tiempo real o simplemente grabar el evento?

Si es lo primero, nunca logrará esto utilizando hardware básico e interfaces de nivel de consumidor. Necesitará un procesador de señales de laboratorio (será una tarjeta que puede acceder directamente a las interrupciones de hardware) y un sistema operativo en tiempo real como VxWorks. Un sistema operativo centrado en el usuario no interrumpirá la escritura de un disco solo porque el bus USB requiere atención.

Si es lo último, consiga una grabadora de señal y post-procese la salida del búfer a su conveniencia.

No necesito hacer nada en tiempo real, simplemente necesito marcar la hora y registrar los flancos descendentes y ascendentes, a medida que ocurren. No estoy seguro de lo que quiere decir con "grabador de señal", pero realmente no quiero poner la línea digital en ningún ADC, la funcionalidad analógica no es realmente lo que quiero.

Si su señal no tiene demasiado DC (pausas largas sin datos), use la tarjeta de sonido.

Explicar por qué....
@Null, ¿qué es exactamente lo que quieres que te explique?
Mi señal tiene largos períodos de CC baja (10 segundos de baja). Una tarjeta de sonido es una idea innovadora, sin embargo, tendría que reducir mi entrada digital a 400 mV, y realmente no necesito toda la capacidad analógica, sería mejor ir directamente a algo con un pin de entrada digital.
@OrangeSherbet bueno, una PC moderna estándar no tiene una entrada digital con búfer. La tarjeta de sonido es la única opción. para limitar la señal digital todo lo que necesita es un diodo y 3 resistencias. Si decides optar por la tarjeta de sonido, te explicaré cómo lidiar con DC.

Terminé usando un Arduino Uno Timer Input Capture Interrupt Service Routinepara configurar datos a través de USB en un SerialPortobjeto C # inmediatamente después de la captura de entrada. Se SerialPortactiva serialdatareceivedeventhandlerinmediatamente después de detectar un carácter de fin de archivo (0x1A), y se inicia un nuevo subproceso para procesar los datos de entrada (como asignarle una marca de tiempo).

A todos los vecinos, ¿Qué diablos? Obviamente te equivocaste en que no se pudo hacer.

¿ Has verificado tu latencia máxima de 5 ms?
No estoy seguro de cómo mediría eso (cómo sincronizar arduino y la computadora...), pero parece que tengo una resolución de aproximadamente 2 milisegundos (no latencia, sino que es cuánto varía la latencia). Realmente necesitaba una latencia que no variara más de unos pocos milisegundos, era deseable una latencia constante.