Decodificar señal de Encoder Incremental en cuadratura (x4)

#1
Hola a todos!!

Necesito desarrollar un circuito que me detecte el sentido de giro de un eje y su velocidad. como elemento de medida tengo un encoder de 1024 pulsos por revolución y me proporciona 2 señales en cuadratura de las cuales debo extraer la información.

El proyecto lo tengo que implementar en Labview ya que después se programará en un chip FPGA. En una primera parte desarrollé una lógica basada en un único contador bidireccional que se incrementaba o decrementaba según el sentido de rotación, pero dicha lógica se ha demostrado ser ineficiente en cuanto a las condiciones finales de uso (es para controlar un motor dc de una maqueta) y mi tutor me ha orientado hacia una lógica que funcione bien en los cambios de dirección y frente a vibraciones (dithering) lo que pasa es que no me ha sabido dar literatura concreta.

El tema es que no encuentro nada por la red y por eso os pido ayuda. Aunque sea si alguien me puede indicar por dónde buscar. En principio sería implementar un circuito de detección de dirección (lo que he estado viendo tiene como dos partes de lógica digital una para cada sentido de giro (CW y CCW) y un Flip-Flop JK, y he implementado una lógica a través de las tablas de verdad pero no me funciona correctamente) y después sería otro bloque con dos contadores (para cada sentido de giro) que se restan para dar la posición final.



A ver si alguien con experiencia me sabe orientar. Y gracias de antemano!!

Javier.
 
#2
Amigo, las salidas CW o CCW, entregan un pulso muy pequeño por cada paso del encoder, con esta señal puedes accionar un contador asc/desc., el ancho del pulso puede ajustarse segun los valores de RC.
 

Adjuntos

#4
Hola chicos, la descripción y el funcionamiento de los encoder ya lo entiendo, así como las diferentes formas de encoding. Lo que intento hacer es algo así como plasmar con puertas lógicas lo que dice en la página 6 de este paper:

http://www.docstoc.com/docs/20974431/Modeling-and-Simulation-of-an-Incremental-Encoder-Used-in

es decir, construir primero un bloque que me diga el sentido (en base a las transiciones entre estados, y que contemple los cambios de dirección) y en función del sentido de giro se incremente el correspondiente contador (cuyos conteos se suponen ya válidos) para después calcular el ángulo total girado.

Lo tengo que hacer con puertas lógicas ya que programo en LV (que es un lenguaje gráfico) y no en C o otro lenguaje de texto.

Gracias de nuevo!!
 
#6
Hola Eduardo, muchas gracias lo primero de todo.

Te quiero preguntar algo en cuanto a la notación de tu post: Ao, Bo se supone que son las señales A y B previo paso por un registro no? y después cuando pones tilde.. ´ .. te refieres a la señal negada?
 
#8
Edito: cometí un fallo en el mapa de Karnaugh

Me queda para CCW: (A XOR Bo) + (Ao XNOR B) y para CW: (Ao+!B)(!Bo+!A)(Bo+A)(!Ao+B)
 
Última edición:
#10
A mi en realidad lo que me sale es Ao XOR B para el sentido CW y Ao XNOR B para CCW, no sé si es lo mismo. Después tengo que implementar un FF JK (¿Cuál me recomendáis... Con NAND, NOR...?) y detrás de eso 2 contadores para cada uno de los sentidos que se restarán para darme la posición angular final.
Tranquilo. En este momento está trabajando un equipo de 6 pitonisas de Delfos adivinando que fué lo que hiciste. Así te ahorrás el molesto trabajo de andar dibujando y explicando.
 
#12
Sigo con el tema para ver si alguien me puede ayudar. Pido perdón por las molestias que mi desconocimiento pueda causar.

Bueno, ya he desarrollado la aplicación, pero todavía no la he podido probar, lo haré mañana. Pero hablando con mi tutor me ha dicho que tengo que implementar la detección por flancos y no por niveles lógicos como hasta ahora. Es decir, debería hacer sampleos de las señales de los encoders tratándolas como analógicas y tener una lógica que me indique cuando se produce efectivamente un cambio de estado. No se muy bien porqué quiere ir en esa línea ya que creo que la decodificación por niveles lógicos va a funcionar.

Alguien lo ha hecho así alguna vez?
 
Arriba