En este post desarrollaré un programa para leer las entradas de un tipo encoder incremental en cuadratura.
La señal en cuadratura se caracteriza por tener dos señales cuadradas que se encuentras desfasadas 90° una con respecto a la otra. Esto es mostrado en la figura “Señales del encoder”.
El movimiento rotacional puede ser medido contando los flancos que produce cada una de las señales. La relación de fase entre las dos señales determina la dirección de rotación. Cuando en giro es horario la señal QDPH0 (Comúnmente encontrada como A) adelanta a QDPH90 (B) en 90°. En el sentido antihorario ocurre exactamente lo contrario.
Fig. 1 Señales del encoder
Para nuestro ejemplo conectaremos las salidas CLK(A) y DT(B) de un encoder, como el mostrado en Fig.2, a las entradas PD2(INT0) y PD3(INT1) de un ATmega32. El encoder y el uC son alimentado con 5Volt.
Fig. 2 Encoder
El ejemplo es muy sencillo y puede funcionar con una lectura constante (en while) de las señales A y B, usando una interrupción para la señal A ó usando dos interrupciones para las señales A y B.
Primero, y luego de crear el proyecto, debemos declarar la velocidad del CPU (F_CPU es necesaria para las rutinas _delay…) y la del UART si fuera necesario. Aquí muestro una imagen de mi configuración.
Bueno, aquí el programa.
Includes:
Variables a usar:
14.- Se declara una variable global del tipo int32_t (cuenta) para que almacene las cuentas del encoder. Esta tiene que ser del tipo volatile para poder usarla sin problemas en las interrupciones.
15.- cambio las usaremos como un flag que nos indica que en valor de cuenta ha cambiado.
16.- str[30] almacenara un string que será enviado por el puesto serie.
18-26.- Se crea una nuevo tipo de dato(States_t) para almacenar el estado actual del encoder (S0) y el estado anterior (S1). 27.- Se crea la variable enc que es del tipo States_t.