Usando los Codificadores Cuadráticos Autor: Ing. Carlos Narváez Universidad de Oriente email: cnarvaez@udo.edu.ve Introducción El presente trabajo es una introducción a los denominados codificadores cuadráticos, sus diferentes tipos y aplicaciones. Se hará uso de estos dispositivos en conjunto con microcontroladores PIC a fin de interpretar la información que nos suministran. Codificador Cuadrático Un codificador Cuadrático, es un sensor de movimiento rotacional que traslada la información de movimiento (ángulo, velocidad y dirección del eje) en señales eléctricas que pueden ser interpretadas por un computador. El Codificador cuadrático es un tipo particular de codificador incremental el cual emite pulsos que determinan cuánto se ha rotado (si el codificador es rotatorio) o movido (si el codificador es linear), pero no se sabe donde se comenzó ni donde se finalizó. La figura. muestra un disco codificado usado en codificadores cuadráticos del tipo ópticos. Las zonas oscuras impiden el paso de luz mientras que las zonas blancas lo permiten. Existen dos zonas concéntricas lo que implica un codificador de dos canales. Fig. Disco Codificado La aplicación más típica para codificadores cuadráticos es la medición de la velocidad de un eje y su sentido de giro. Un codificador cuadrático utiliza dos canales denominados A y B, desfasados en ¼ de ciclo el uno con respecto al otro. De esta manera se logra un dispositivo de cuatro estados, representados como: 00 0 0, en donde, el bit más significativo de cada estado, corresponde al canal A y el otro al canal B, tal como muestra la figura.
Fig. Codificador Cuadrático. Cuando el eje gira en sentido de las agujas del reloj, se obtiene una secuencia de números (0,00,0,) diferente que cuando gira en sentido contrario a las agujas del reloj (0,,0,00), Esta secuencia puede reconocerse como un código Gray, por el hecho de que sólo un bit cambia en cada transición. La resolución del dispositivo se mide en ciclos por revolución (CPR), correspondiendo a cada ciclo la ocurrencia de los cuatro estados ya mencionados. Nótese que en cada ciclo existe un estado donde ambos canales se encuentran a nivel lógico, oportunidad esta que se aprovecha para incrementar un contador, el cual nos permite el cálculo de la velocidad del eje. En efecto, si por ejemplo tenemos un codificador de CPR y el valor del contador es 000 luego de transcurrido un segundo, las revoluciones por minutos del eje están dadas por: RPM = 60 * contador CPR = 998 Para la determinación de la dirección de giro, se utiliza una interesante propiedad de la secuencia de código Gray de bits. Si tomamos dos estados cualquiera consecutivos de la secuencia de giro en sentido agujas de reloj y realizamos OR exclusivo (XOR) del bit menos significativo del primer número, con el bit más significativo del segundo número, obtenemos como resultado. De la misma manera, el resultado es siempre cero, si se toman dos estados cualquiera consecutivos de la secuencia de giro contraria a las agujas del reloj. Por ejemplo tome 0, de la secuencia de giro en sentido de las agujas del reloj, entonces 0 XOR =. Ahora invierta la secuencia es decir tome, 0, entonces, XOR = 0.
Ahora es necesario acoplar el codificador a un dispositivo que pueda leer sus canales e interpretar lo que esta pasando. Una manera es haciendo uso de las interrupciones de un microcontrolador tal que se pueda observar los cambios en los canales del codificador. En los PIC esto resulta fácil, pues estos incluyen la interrupción por cambio en el PORTB. Otra alternativa es usar los módulos CCP y una última, pero algo riesgosa, es muestrear los pines donde esté conectado el codificador cada n microsegundo y observar si sus estados han cambiado. Para efectos de este trabajo se ha tomado la primera opción. La figura. muestra, la manera de conectar un codificador en cuadratura de tipo mecánico o de contactos al microcontrolador. Observe las resistencias Pull-Up necesarias para la polarización positiva de este tipo de dispositivo. Fig. Conexión Codificador Mecánico Tipos de Codificadores Cuadráticos Los codificadores cuadráticos pueden ser clasificados en dos grandes categorías: Los mecánicos y los ópticos. Los primeros son generalmente utilizados en velocidades bajas, y aplicaciones de baja utilización. Los codificadores ópticos están diseñados para frecuencia más altas (RPM) y aplicaciones de uso continuo donde la confiabilidad es importante. También existen codificadores de tipo magnético basados en el Efecto Hall. Los codificadores incrementales en General pueden ser de rotación o lineales. La principal especificación son los Ciclos por revolución (CPR), así podemos encontrar codificadores con CPR de 56, 5, 0 y hasta 00.000 CPR, además de valores más bajos. Aplicaciones Los codificadores ópticos, normalmente sirven de dispositivo de realimentación en aplicaciones de control de posición, velocidad o flujo. Otra aplicación, en donde se les usa, es en paneles de control, en donde pueden sustituir dispositivos tradicionales como potenciómetros, switches de rotación o switches pulsadores. Pero la aplicación más común es en dispositivos apuntadores como el Mouse. En ellos se utilizan dos codificadores, uno que sigue el movimiento en el eje X y otro que sigue el del eje Y.
Hardware La figura, muestra el diagrama esquemático utilizado, el cual esta basado en un PIC6F87 trabajando a Mhz. Se utilizaron los pines RB y RB5 para los canales B y A respectivamente y un display LED de 7 segmentos manejado por el integrado 5 que es un codificador de BCD a 7 Segmentos. VCC VCC U RESET 5pf 0K N8 00 S 5 6 7 5 6 7 8 9 0 RA0/AN0 RA/AN RA/AN/VREF- RA/AN/VREF+ RA/T0CKI RA5/SS/AN RB0/INT RB RB RB/PGM RB RB5 RB6/PGC RB7/PGD OSC/CLKIN MCLR/VPP/THV VDD RC0/TOSO/TCKI RC/TOSI/CCP RC/CCP RC/SCK/SCL RC/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT OSC/CLKOUT 5 6 7 8 0 5 7 6 U 5 BIN/7-SEG (T) & CT=0 V0 8 G A0, B0, C0, D0, E0, F0, G0, 0 9 5 5 67 8 DISPLAY Mhz PIC6F87 00 5pf VCC 7K 7K A B ENCODER Fig. Diagrama Esquemático
Software El programa fue compilado usando el compilador C de CCS. Se utiliza la interrupción por cambio en RB. El programa incrementa o decrementa un contador por cada ciclo del encoder según sea el sentido de giro, agujas del reloj o contrario a las agujas del reloj. Por razones del display utilizado el conteo esta en el rango de 0 a 9. /* encoder.c */ /* Quadrature Encoder */ /* PIC6F87 */ /* Autor: Carlos Narvaez 9/08/005 */ /* Interfaces: */ /* Encoder Canal A = Port B bit 5 */ /* Encoder Canal B = Port B bit */ #include <6f87.h> #fuses XT,NOWDT,PUT, NOPROTECT, NOBROWNOUT,NOLVP,WRT,NOCPD #use delay (clock=000000) #use fast_io(a) #use fast_io(b) #use fast_io(c) /* Prototipos */ void delay_s(int); /* Definiciones Generales */ signed int encoder; /* Definiciones para la interfaz PIC-LCD */ #byte PORTA = 5 #byte PORTB = 6 #byte PORTC = 7
/* Interrupción por cambio en RB-RB7 */ #int_rb void detect_rb_change() { int current; static int last=0; current=portb; // Canal A = PORTB.5 // Canal B = PORTB. if ((bit_test(current, )) && (bit_test(current,5))){ if ((bit_test(last,)) ^ (bit_test(current,5))){ else { last=current; encoder++; if(encoder > 9) encoder = 0; encoder--; if(encoder < 0) encoder = 0; //sentido agujas del reloj //sentido contrario agujas del reloj /* Programa Principal */ void main(void) { disable_interrupts(global); encoder = 0; set_tris_b(0x0); port_b_pullups(false); enable_interrupts(int_rb); enable_interrupts(global); while() { delay_s(); portb=encoder; /* Retardo segundos */ void delay_s(int n) { for (;n!=0; n--) delay_ms(000);