Circuito para determinar el sentido de giro de un encoder

En algunos proyectos suele presentarse la necesidad de que el usuario final interaccione con el sistema. Por lo general, esto se hace a través de botones para moverse a través de un menú o potenciómetros rotativos para variar un set point. Sin embargo un encoder rotativo podría reemplazar a ambos y aún simplificar la programación ya que las señales serían únicamente de tipo digital. Por otro lado la comodidad a la hora de operar el encoder es aún mayor que las otras 2 alternativas.

encoder
Figura 1 – Pin out de un encoder
quadrature
Figura 2 – Señales a la salida de un encoder

IMPORTANTE: Recordar que en el código Gray solamente varía un bit entre un valor anterior y otro posterior al actual. Ejemplo: si se usan 2 bits, el código Gray será 0 (00), 1 (01), 3 (11), 2 (10) como se ve en la figura 2 y el siguiente video:

Sin embargo, la complicación asociada a incorporar este tipo de dispositivos recae en la programación del firmware. Dado que el mismo otorga en sus salidas 2 señales de tipo cuadradas idénticas pero desfasadas 90° (ver figura 1 y 2) una de otra según en qué sentido gire; el mayor problema es poder determinar el sentido de giro del mismo. En la mayoría de los tutoriales que se ven en Internet, utilizan rutinas de interrupciones externas para realizar esta tarea.

En esta entrada de blog presentamos un circuito que utiliza Flip Flops tipo D para discriminar el sentido de giro de un encoder y obtener pulsos por separado en diferentes salidas de los FF. De esta forma, se podría obviar la necesidad de trabajar con interrupciones y/o también reemplazar potenciometros y botones por estos encoders.

En el siguiente esquema de simulación, se utilizo un motor paso a paso como si fuese un encoder. Podría también haberse usado el generador de patrones generando un código gray de 2 bits. En nuestro caso usamos FF basados en logica TTL modelo 74HCT74 y el circuito a implementar es el siguiente:

NOTAR LAS RESISTENCIAS PULL-UP R1-R2 NECESARIAS PARA UN CORRECTO FUNCIONAMIENTO-

ctoff

Las 2 salidas «Q» de los flip flop se podrían conectar ahora a 2 pines de un microcontrolador configurados como entrada.
Al girar en sentido horario, una de las salidas genera un tren de pulsos mientras la otra no cambia su estado.Lo contrario ocurre al hacer girar el encoder en sentido contrario.

AQUI UN VIDEO

La unica consideración a tener en cuenta a la hora de desarrollar el firmware es la de agregar una badera (1 bit)  para monitorear si ya se habia puesto en alto esa entrada y no cambio su valor.

EJEMPLO: Un contador que aumenta o disminuye su valor segun como gira el encoder

#include <18f4550.h>
#fuses nowdt,noput,nobrownout,nolvp,noprotect,hs,nomclr
#use delay(crystal = 20M)

#DEFINE boton_0 pin_a0
#DEFINE boton_1 pin_a1

void main()
{
disable_interrupts(global); //deshabilita interrupciones
setup_adc_ports(no_analogs); //no hay pines analogicos

set_tris_a(0xff); //todos los pines del puerto A como entrada
set_tris_b(0x00); //todos los pines del pto B como salida

int1 b1_apretado=0; //bandera para indicar que el pin quedó en alto de antes
int1 b2_apretado=0; //bandera para indicar que el pin quedó en alto de antes

int8 contador=0; //
output_b(contador); //pone todo el puerto B en bajo

while(1)
{//abre el bucle principal del programa

if(input(boton_0) && !b1_apretado && !input(boton_1))
{
contador++;
b1_apretado=1;
b2_apretado=0;
}

if(!input(boton_0))
b1_apretado=0;

if(!input(boton_1))
b2_apretado=0;

if(input(boton_1) && !b2_apretado && !input(boton_0))
{
contador–;
b1_apretado=0;
b2_apretado=1;
}

output_b(contador);  //muestra el valor del contador en los pines del puerto B
}//cierra bucle principal
}

Saludos y hasta la proxima!!

Deja un comentario