Vous êtes sur la page 1sur 6

Usando los Codificadores Cuadrticos

Autor: Ing. Carlos Narvez Universidad de Oriente email: cnarvaez@udo.edu.ve

Introduccin
El presente trabajo es una introduccin a los denominados codificadores cuadrticos, sus diferentes tipos y aplicaciones. Se har uso de estos dispositivos en conjunto con microcontroladores PIC a fin de interpretar la informacin que nos suministran.

Codificador Cuadrtico
Un codificador Cuadrtico, es un sensor de movimiento rotacional que traslada la informacin de movimiento (ngulo, velocidad y direccin del eje) en seales elctricas que pueden ser interpretadas por un computador. El Codificador cuadrtico es un tipo particular de codificador incremental el cual emite pulsos que determinan cunto 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 1. muestra un disco codificado usado en codificadores cuadrticos del tipo pticos. Las zonas oscuras impiden el paso de luz mientras que las zonas blancas lo permiten. Existen dos zonas concntricas lo que implica un codificador de dos canales.

Fig. 1 Disco Codificado La aplicacin ms tpica para codificadores cuadrticos es la medicin de la velocidad de un eje y su sentido de giro. Un codificador cuadrtico 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 01 10 11, en donde, el bit ms significativo de cada estado, corresponde al canal A y el otro al canal B, tal como muestra la figura 2.

Carlos A. Narvez V 2005

Fig. 2 Codificador Cuadrtico.

Cuando el eje gira en sentido de las agujas del reloj, se obtiene una secuencia de nmeros (01,00,10,11) diferente que cuando gira en sentido contrario a las agujas del reloj (01,11,10,00), Esta secuencia puede reconocerse como un cdigo Gray, por el hecho de que slo un bit cambia en cada transicin. La resolucin del dispositivo se mide en ciclos por revolucin (CPR), correspondiendo a cada ciclo la ocurrencia de los cuatro estados ya mencionados. Ntese que en cada ciclo existe un estado donde ambos canales se encuentran a nivel lgico 1, oportunidad esta que se aprovecha para incrementar un contador, el cual nos permite el clculo de la velocidad del eje. En efecto, si por ejemplo tenemos un codificador de 24 CPR y el valor del contador es 2000 luego de transcurrido un segundo, las revoluciones por minutos del eje estn dadas por:

RPM = 60 * contador CPR = 4998


Para la determinacin de la direccin de giro, se utiliza una interesante propiedad de la secuencia de cdigo Gray de 2 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 nmero, con el bit ms significativo del segundo nmero, obtenemos como resultado 1. 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 10, 11 de la secuencia de giro en sentido de las agujas del reloj, entonces 0 XOR 1 = 1. Ahora invierta la secuencia es decir tome 11, 10, entonces, 1 XOR 1 = 0.

Carlos A. Narvez V 2005

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 fcil, pues estos incluyen la interrupcin por cambio en el PORTB. Otra alternativa es usar los mdulos 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 opcin. La figura 3. muestra, la manera de conectar un codificador en cuadratura de tipo mecnico o de contactos al microcontrolador. Observe las resistencias Pull-Up necesarias para la polarizacin positiva de este tipo de dispositivo.

Fig. 3 Conexin Codificador Mecnico

Tipos de Codificadores Cuadrticos


Los codificadores cuadrticos pueden ser clasificados en dos grandes categoras: Los mecnicos y los pticos. Los primeros son generalmente utilizados en velocidades bajas, y aplicaciones de baja utilizacin. Los codificadores pticos estn diseados para frecuencia ms altas (RPM) y aplicaciones de uso continuo donde la confiabilidad es importante. Tambin existen codificadores de tipo magntico basados en el Efecto Hall. Los codificadores incrementales en General pueden ser de rotacin o lineales. La principal especificacin son los Ciclos por revolucin (CPR), as podemos encontrar codificadores con CPR de 256, 512, 1024 y hasta 100.000 CPR, adems de valores ms bajos.

Aplicaciones
Los codificadores pticos, normalmente sirven de dispositivo de realimentacin en aplicaciones de control de posicin, velocidad o flujo. Otra aplicacin, en donde se les usa, es en paneles de control, en donde pueden sustituir dispositivos tradicionales como potencimetros, switches de rotacin o switches pulsadores. Pero la aplicacin ms comn 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.

Carlos A. Narvez V 2005

Hardware
La figura 4, muestra el diagrama esquemtico utilizado, el cual esta basado en un PIC16F873 trabajando a 4 Mhz. Se utilizaron los pines RB4 y RB5 para los canales B y A respectivamente y un display LED de 7 segmentos manejado por el integrado 4511 que es un codificador de BCD a 7 Segmentos.

VCC U2 10K 2 3 4 5 6 7 21 22 23 24 25 26 27 28 9 1 15pf 20 RC0/T1OSO/T1CKI RA0/AN0 RC1/T1OSI/CCP2 RA1/AN1 RC2/CCP1 RA2/AN2/VREFRC3/SCK/SCL RA3/AN3/VREF+ RC4/SDI/SDA RA4/T0CKI RC5/SDO RA5/SS/AN4 RC6/TX/CK RB0/INT RC7/RX/DT RB1 RB2 OSC2/CLKOUT RB3/PGM RB4 RB5 RB6/PGC RB7/PGD OSC1/CLKIN MCLR/VPP/THV VDD PIC16F873 11 12 13 14 15 16 17 18 10

VCC

U3 4 5 3 BIN/7-SEG (T1) 1 & CT=0 V20 7 1 2 6 4511 1 2 4 8 G21

1N4148 100 S1

RESET

A20,21 B20,21 C20,21 D20,21 E20,21 F20,21 G20,21

13 12 11 10 9 15 14

1 2 3 4 DISPLAY 100

4Mhz

15pf

VCC

47K

47K A 1 B 2 3

ENCODER

Fig. 4 Diagrama Esquemtico

Carlos A. Narvez V 2005

5 6 7

Software
El programa fue compilado usando el compilador C de CCS. Se utiliza la interrupcin por cambio en RB. El programa incrementa o decrementa un contador por cada ciclo del encoder segn 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 */ /* PIC16F873 */ /* */ /* */ /* Autor: Carlos Narvaez 19/08/2005 */ /* */ /**************************************************************************************/ /* */ /* Interfaces: */ /* */ /* Encoder Canal A = Port B bit 5 */ /* Encoder Canal B = Port B bit 4 */ /* */ /* */ /**************************************************************************************/ #include <16f873.h> #fuses XT,NOWDT,PUT, NOPROTECT, NOBROWNOUT,NOLVP,WRT,NOCPD #use delay (clock=4000000) #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

Carlos A. Narvez V 2005

/**************************************************************************************/ /* Interrupcin por cambio en RB4-RB7 */ /**************************************************************************************/ #int_rb void detect_rb_change() { int current; static int last=0; current=PORTB; // Canal A = PORTB.5 // Canal B = PORTB.4 if ((bit_test(current, 4)) && (bit_test(current,5))){ if ((bit_test(last,4)) ^ (bit_test(current,5))){ encoder++; //sentido agujas del reloj if(encoder > 9) encoder = 0; } else { encoder--; //sentido contrario agujas del reloj if(encoder < 0) encoder = 0; } } last=current; } /**************************************************************************************/ /* Programa Principal */ /**************************************************************************************/ void main(void) { disable_interrupts(GLOBAL); encoder = 0; set_tris_b(0x30); port_b_pullups(FALSE); enable_interrupts(INT_RB); enable_interrupts(GLOBAL); while(1) { delay_s(1); portb=encoder; } } /**************************************************************************************/ /* Retardo segundos */ /**************************************************************************************/ void delay_s(int n) { for (;n!=0; n--) delay_ms(1000); }

Carlos A. Narvez V 2005

Vous aimerez peut-être aussi