¿Cuál sería, en su opinión, la forma más eficiente de conectar varios codificadores rotatorios incrementales (digamos, >20) a un microcontrolador limitado por GPIO (por ejemplo, ATxmega128A4U, 44 pines)?
Requisitos:
Lo que he probado:
Supongo que cada codificador rotatorio tendrá dos señales y puede tener una más para un interruptor.
Use múltiples microcontroladores (MCU), cada uno de los cuales maneja un subconjunto de codificadores rotatorios.
Designe un microcontrolador como el 'coordinador'. Haga que los otros MCU ('controladores') se comuniquen con él. Si el 'coordinador' realmente se ejecuta como un esclavo de comunicación para SPI, I2C o alguna otra interfaz conveniente, los 'controladores' pueden controlar la interrupción de la interfaz de comunicación. De esa manera, el 'coordinador' solo se activará cuando suceda algo. (De lo contrario, el 'coordinador' tendrá que leer repetidamente la otra MCU, llamada sondeo, que puede ser menos conveniente para su sistema)
Deberá idear un protocolo simple para comunicar qué codificador ha cambiado y cuánto. Es muy probable que sea más de un byte, lo que puede agregar un poco de complejidad.
Dependiendo de su experiencia, puede buscar microcontroladores que contienen hardware decodificador de cuadratura. Como ejemplo, las piezas de ST Micros STM32F tienen temporizadores que también pueden decodificar y rastrear señales en cuadratura.
Ignorando los interruptores de botón asociados con los codificadores, una tasa de paso de 50 pasos/segundo sugiere que puede usar multiplexores externos para leer las salidas del codificador. Puede encontrar multiplexores de 16 a 1 (74HC150, 74HC4067) y conectarlos a las dos fases. Conduzca las líneas de dirección de los multiplexores con 4 líneas IO y use 2 líneas para leer las fases. Puede agregar un tercer multiplexor para ver los contactos del interruptor.
También puede expandir los multiplexores, usando 1 o 2 líneas más como líneas de selección.
Este
simule este circuito : el esquema creado con CircuitLab muestra un multiplexor de 32 líneas, con 5 líneas de dirección seleccionadas y un inversor externo para la dirección más importante. Puede usar dos líneas de E/S para el MSA, pero debe asegurarse de que solo una esté baja en cualquier momento.
En la práctica, (a intervalos de menos de 20 mseg) leería todas las fases del codificador, luego analizaría cada par de bits para determinar si el codificador se ha movido y tomaría las medidas necesarias. Para un Atmel, 20 milisegundos es mucho tiempo, pero sería importante que el software no se involucre en alguna otra tarea y pierda una lectura. Si el codificador se ha movido 2 pasos, no hay forma de determinar la dirección.
Una configuración completa requeriría 6 multiplexores: 2 por fase y 2 para leer los interruptores, más 3 inversores (1/2 de un chip inversor hexagonal como un 7HC04). El total de líneas de MCU sería de 8. 5 líneas de dirección y 3 entradas.
El total de operaciones de E/S es 64. 32 escrituras de selección de direcciones y 32 lecturas de datos. Por supuesto, si solo está usando, digamos, 20 codificadores, solo necesitaría 40 operaciones.
US digital fabrica el LFLS7184-S que interactúa con las salidas A/B en cuadratura para proporcionar conteos ascendentes/descendentes adecuados para alimentar un chip lógico. Es solo un canal único, pero si le gustan los circuitos lógicos en lugar de las MCU, podría resultarle atractivo.
Incluso puede obtener una versión de salida en serie y una versión dual .
Puede valer la pena echar un vistazo a su sitio web.
Aquí hay otro dispositivo dual de Avago y ELM404 es otro dispositivo que vale la pena considerar y, de memoria, creo que TI hace uno.
Aquí está el enlace que usé para buscar en Google.
Simplemente puede sondear los codificadores a una velocidad razonable (quizás de 500 Hz a 1000 Hz) y aplicar una lógica simple a las lecturas secuenciales. Esto se puede hacer en un ISR.
Eso significa que usted tiene que leer un total de 60 o más entradas y reaccionar a ellas cada 1-2 mseg... por lo que las rutinas no deberían llevar demasiado tiempo, preferiblemente en los bajos 100 de usec. Los codificadores se pueden direccionar utilizando varios multiplexores por entrada. Conectaría cada entrada A a un MUX 1 de 20 y de allí a un pin de puerto único (digamos bit 0).
Sospecho que un AVR que funciona a 20 MHz y está codificado en ensamblaje está a la altura, y un solo PIC de 4 MHz probablemente no. O use un micro de 32 bits (por ejemplo, Atmel Cortex M7 funcionando a 300 MHz) y relájese con todo codificado en C. Con un 144 PQFP (114 I/O) probablemente no necesite ningún chip adicional.
Para cualquiera que viva en 2018+, pruebe estos codificadores I2C: https://www.tindie.com/products/Saimon/i2c-encoder-v2/
olin lathrop
Andrejs Cainikovs
olin lathrop
Andrejs Cainikovs
chris stratton
gbulmer
Andrejs Cainikovs
QueRosaBestia
chris stratton
Andrejs Cainikovs
QueRosaBestia
Andrejs Cainikovs
Wouter van Ooijen
Rata de acero inoxidable
Andrejs Cainikovs
gbulmer
gbulmer