Quiero usar un puerto paralelo para controlar algunos motores paso a paso (muchos de ellos). Hasta ahora lo he conectado a una pequeña placa de prueba con LED y he escrito un programa de C en Linux para establecer los pines utilizando las llamadas outb
o outl
. Como quiero usar los 12 pines de salida, estoy configurando el byte de datos y el byte de control. (En realidad, más de 12 pines serían agradables, pero 12 tendrán que hacerlo).
Todo esto funciona y los LED se iluminan como se esperaba, pero es un poco lento para mis necesidades. Un bucle con 1,000,000 iteraciones que llaman outb
dos veces (byte de datos y control) toma ~ 3.9 segundos. Si sustituyo eso con una sola llamada outl
que toma ~ 3.6 segundos, entonces parece que cada outl
toma aproximadamente 3.6 nosotros. Por lo que leí debería funcionar en aproximadamente 1 nosotros o incluso menos. La pregunta es: ¿cómo lo hago más rápido?
La máquina es un Sempron de AMD con un puerto paralelo incorporado. Hay 3 configuraciones para el puerto en BIOS: "Bidireccional", "ECP" y "EPP". ECP da los números de arriba. La bidireccional es ligeramente más lenta y el EPP es mucho más lento (ejecutando exactamente el mismo código). ¿Hay algo especial que deba hacer en el código para aprovechar los modos más rápidos? ¿Es una limitación del hardware, por lo que tal vez una tarjeta PCI IO dedicada sería más rápida? ¿Necesito usar DMA (que creo que requiere un controlador en modo kernel)?
Alternativamente, ¿hay algún dispositivo adicional por ahí como un puerto paralelo, pero con más pines y / o menor latencia para configurar todos los pines? (No necesito cambiar un pin a la vez).
Editar (más detalles):
Quiero controlar 1,000 motores paso a paso en total. El diseño original era tener 5 Arduinos controlando 200 motores cada uno usando puertas lógicas para abordar cada motor en secuencia. Un 6º Arduino sería el controlador "maestro", que envía datos a los otros 5. Sin embargo, un Arduino no tiene suficiente memoria para almacenar todos los datos que quiero enviar, de modo que es donde entró una PC. Una vez que una PC estuvo involucrado, parecía mucho más sencillo si pudiera eliminar los Arduinos por completo y usar 2 (quizás 4) puertos paralelos para controlar los motores directamente, probablemente bajo RTLinux (aunque la prueba anterior se realizó en Linux normal). No creo que necesitara una resolución de 1 temporizador como tal. Estaba pensando en un temporizador disparando cada 1500-2000 uS y cada vez enviando señales a los 1000 motores, uno por uno (500 o 250 por puerto paralelo). La velocidad del puerto paralelo parece ser la limitación aquí.
Entiendo que hay controladores de motores paso a paso dedicados, pero comprar 1000 de ellos es caro. ¿Hay algo que pueda controlar muchos de ellos? Lo ideal sería mantener la mayor cantidad de trabajo posible en la PC, porque es mucho más fácil de programar y depurar.