Codificador incremental y Arduino

3

He conectado un codificador incremental de 600 p / r a un Arduino Uno.

Mi pregunta es esta:

Dado que el Arduino tiene una velocidad de reloj de 16Mhz y realmente no quiero perder un solo pulso, estoy creando una copia impresa de la lógica en CMOS. Tengo:

Codificador Inc - > disparador de borde de disparo (por retraso de propagación) a través de xor y nxor cmos (que actúan como reloj) - > Contador binario arriba / abajo de 16 bits - > d flop register

El codificador inc también tiene un bloque lógico que denota en qué dirección está girando (establece el pin arriba / abajo del contador binario.

Mi problema es este: ¿cómo lidiaría con que Arduino lea el conteo actual? No me gusta leer directamente el contador, ya que puede cambiar durante la lectura, es decir, si es 9, el arduino lee LSB y durante el tiempo que se tarda en leer el siguiente incremento de contador a 10, podría terminar con una lectura de 19. Pensé en un búfer, pero si uso la lógica de activación de borde, parece que para cuando el contador haya terminado su lógica, el registro de flip flop habrá leído el valor actual.

Estoy viendo un Preset asíncrono con retención de datos, pero este tipo de d-flop / otro flip-flop son raros (ish)

¿Algún otro esquema en el que deba pensar?

    
pregunta Paul Sullivan

2 respuestas

1

Este es fácil. Incluso si no desea lanzar un microcontrolador a esto, definitivamente NO reinventaría la rueda haciendo un sistema de codificador cuádruple de hardware, especialmente como si estuviera diseñando para la UNO, probablemente no esté hablando de producción.

Utilice un IC especialmente diseñado, como HCTL-2022 . Como te habrás dado cuenta, acabas de llegar a un error que tiene que ver con cómo se bloquea la salida para una lectura. Antes de que termines, acertarás tres o cuatro más, tal vez teniendo que ver con algo como las transistiones ruidosas. Estos circuitos integrados son muy buenos. Los he usado y los recomiendo.

    
respondido por el Scott Seidman
0

No debería tener un problema si puede muestrear a 16MHz. Eso se traduce en: 16Mpulses / s * 60s / 1min * 1rev / 600pulses = 1.6 Millones de RPM. Prácticamente todo lo mecánico explotará a esa velocidad, y sin embargo, esto es lo que su límite superior en la medición es a una frecuencia de muestreo de 16 MHz. Incluso si no puede muestrear a la frecuencia máxima de reloj de 16MHz, una velocidad de 10 kRPM más moderada necesitaría una frecuencia de muestreo de 100 kHz para ser precisa.

Para mitigar el problema de codificación que mencionas, debes buscar en la codificación gris del codificador inc. Alternativamente, si utiliza codificación binaria, tal vez sería posible leer desde MSB hasta LSB para mitigar el problema de codificación.

enlace

    
respondido por el horta

Lea otras preguntas en las etiquetas