Codificador de Cuadratura

Principal Arriba Comentarios Mapa del sitio Página de búsqueda de Nombre sencillo

     
  ©David Alejandro Valdez  
 
Funcionamiento:

Básicamente consiste en un disco giratorio, el cual posee un gran numero de ranuras. Una fuente de luz estacionaria se encuentra montada fija a un lado del disco, en el lado opuesto directamente enfrente del emisor de luz se hallan ubicadas dos fototransistores.

 

 Dichos fototransistores se encuentran desalineadas respecto a las ranuras del disco giratorio en en una distancia de 1/4 de la distancia existente entre dos ranuras, lo que permite disponer de las señales Va y Vb desfasadas 90º entre sí. Este desfasaje nos permitirá discernir sobre el sentido de giro del disco. Por lo tanto, al girar el disco las ranuras interrumpen el paso de la luz hacia las fototransistores, obteniéndose de éstas las tensiones Va y Vb con un corrimiento de 1/4 de ciclo o sea con un desfasadas 90º entre sí.

El numero de ranuras (N) que posee el disco dará la resolución en pulsos por vuelta del codificador y se obtendrá un pulso de tensión cada 360º/N grados de rotación del eje.

La señal que se obtiene de las fototransistor, debe ser acondicionada de manera de hacerla compatible con los niveles de tensión TTL.

 

Cuando el disco gira en la dirección de las manecillas del reloj se observa que el fototransistor 'A' recibe luz, mientras que el fototransistor 'B' está a oscuras, pero luego de una rotación adicional de 1/4 de la distancia entre ranuras, la celda 'B' tendrá luz incidente.

 

 

 

 

 

 

 

 

Cuando el disco gira en la dirección contraria de las manecillas del reloj se observa que el fototransistor 'B' es la que recibe la luz, mientras que el fototransistor 'A' está a oscuras, pero luego de una rotación adicional de 1/4 de la distancia entre ranuras, la celda 'A' tendrá luz incidente.

 

 

 

 

 

 

 

Por lo tanto para un giro continuo del eje del encoder se obtendrá la siguiente secuencia de valores binarios:
*Girando el eje en el sentido de las agujas del reloj, se obtendrá:

 2 - 3 - 1 - 0 - 2  y así sucesivamente.

*Girando el eje en el sentido contrario de las agujas del reloj, se obtendrá:

 1 - 3 - 2 - 0 - 1  y así sucesivamente.

A continuación ejemplo de código fuente en C:

La subrutina es llamada cada vez que se produce una interrupción por un cambio en el estado lógico de los pines PB4-PB5(recordar que los microcontroladores PIC poseen está característica).

Las variables utilizadas son:

AB_Bits_V -> indica el estado anterior de las lineas 'A' y 'B'.

AB_Bits_N -> indica el estado actual de las lineas 'A' y 'B'.

EncRotCont -> Contador de pulsos del encoder

Esta rutina determina si se ha producido algún error en la secuencia de los pulsos, en caso de error se lo indica con el flag 'flgEncRotOK = LO'.

Haciendo uso de la función lógica or exclusivo entre el estado lógico anterior y actual de las lineas 'A' y 'B' es posible determinar de manera muy sencilla el sentido de giro del eje del encoder.

El sentido de giro del encoder es indicado a travéz del flag 'flgEncRotDir'

#include <pic.h>
#include "encoder.h"
#include "general.h"


unsigned char EncRotCont;

bit flgEncRotDir;
bit flgEncRotOK;


void
Rot_Encoder(void)
{
static unsigned char AB_Bits_V;
unsigned char AB_Bits_N, Aux;

   AB_Bits_N
= ((ENCODER_PORT) & ENCODER_MASK)>>4; // Leo port del encoder y desplazo la cantidad

                                                   // de bits necesarios
                                                   // para obtenar la alineación correcta

   Aux = AB_Bits_N ^ AB_Bits_V;                    // Or exclusivo

   flgEncRotOK = LO;                               // Indico todavía no se sabe si hubo algún error

 

   if (Aux==0)                                     // Determino condiciones de error
     goto RotEncNOcmb;
  
else if (Aux==3)
     goto RotEncError;

   if(((AB_Bits_V<<1) ^ AB_Bits_N)&0x02)
    
{
    
flgEncRotDir = ENC_GIRA_IZQUIERDA;           // Indico que se gira hacia la IZQUIERDA
    
EncRotCont--;                                // Decremento el contador
    
}
   
 else
     {
     flgEncRotDir = ENC_GIRA_DERECHA;
             // Indico que se gira hacia la DERECHA
    
EncRotCont++;                                // Incremento el contador
 
   }

   flgEncRotOK = HI;
                              // Indico que se rotó el encoder

RotEncNOcmb:
RotEncError:
    AB_Bits_V = AB_Bits_N;
                        // Para que o haya errores
}

 


Abajo se observan fotografías de un codificador rotativo que he realizado en mi casa con partes de un viejo mouse, un eje de aluminio mecanizado y una carcasa de un motor de CC.

 

 
 

Vista del conformador de pulsos.

Vista del disco Vista del disco
Detalle del disco

Vista del codificador y su contenedor

Codificador ensamblado.

Codificador listo para funcionar. Tamaño comparativo del codificador de cuadratura.
 
Preparado por: David A. Valdez

 

Principal Arriba Comentarios Mapa del sitio Página de búsqueda de Nombre sencillo

©1999-2006 David Alejandro Valdez

 

Enviar correo electrónico a
 

valdezda@hotmail.com

 


1