Encoder de cuadratura

Pues bien, mientras se sigue cocinando la otra parte de la fuente…. 😛  Vamos a abordar algo que nos va a ser muy util tambien para la fuente: el encoder de cuadratura.

Pero…  ¿qué es un encoder?

Bueno, para no extender mucho esto, diremos que un encoder es un dispositivo o sensor que genera señales en respuesta al movimiento, y existen basicamente 2 tipos:  incremental y absoluto. Y su vez, cada tipo puede ser rotativo o lineal.

Para el caso de los encoders absolutos, la salida posee informacion acerca de la velocidad angular (si son encoders rotativos) o lineal, la direccion, y la posicion, ademas de mantener la información aun cuando se le quita la fuente de energia. En general, este tipo de encoders reduce la cantidad de codigo (en caso de usar microcontroladores) para la interpretacion, ya que tambien estan calibrados en la fabricacion y no es necesario hacerlo de nuevo. El punto que tienen en contra, para variar, es el precio y la disponibilidad, y entre mas precisos o mas resolucion, son mas caros!! :S

En los encoders incrementales por otro lado (que es el objetivo de este articulo), la información proporcionada basicamente solo es direccion y distancia recorrida (ya sea lineal o angular). Estos encoders son muy populares ya que ademas del precio mas accesible, la implementacion es mas sencilla de lo que aparenta.

Un encoder incremental o de cuadratura tiene una estructura de funcionamiento sencilla, que permite saber con muy pocos calculos el estado de lo que estemos controlando (un motor, la posicion de un brazo mecanico, el voltaje en una fuente 😉 )

La estructura básica del encoder de cuadratura es la siguiente:


Encoder

La imagen muestra un encoder rotativo de tipo mecanico, ya que es el mas comun y para efectos de este articulo, sencillo de explicar y de implementar. Tambien hay de tipo “optico” (sustituyendo los interruptores por opto-acopladores), de efecto hall (con la debida sustitucion de los switch por sensores), y demas…

Estos contactos mecanicos se van activando y descativando en una secuencia que nos permite saber la direccion y el numero de desplazamientos que han ocurrido en el encoder. En la imagen anterior tambien se puede ver como es la secuencia de activaciones dependiendo el sentido de giro. De hecho este tipo de secuencia esta en codigo grey de dos bits (cosa muy util para la detección de errores).

Ahora bien, gracias a este codigo podemos saber la direccion del giro que toma el encoder, para ilustrarlo mejor, veamoslo en forma de matriz:tablas

 

Como podemos ver si asumimos la salida “A” como el bit menos significativo y la salida “B” como el bit mas significativo, en la tabla de verdad podemos saber la direccion de giro si comparamos la posicion actual con la anterior.

En la imagen anterior tambien se ve una matriz a la que llamaremos “Matriz de incrementos” donde podemos comparar ese estado previo con el actual y saber como fue el desplazamiento. Por ejemplo si el estado anterior fue “00” y el estado actual del encoder es “10” (2 en binario) podemos saber que el encoder estaba “girando” en sentido antihorario, ya que la coordenada (00,10) (primero se avanza verticalmente y despues horizontal) resulta en un “-1”, o bien si el estado previo era “11” y el actual es “10”, en la matriz resulta “+1” que indica sentido horario.

Como ven esta matriz es muy util para saber en pocos pasos que ocurre con el encoder.

Ahora bien, ¿de que me sirve esta matriz o como la puedo aplicar? Esta tecnica de la matriz es muy util a la hora de usar microcontroladores y mas con lenguaje “C”, ya que en vez de estar nadando entre multiples “if-else” solo tenemos que acceder a una coordenada en la matriz para saber que paso, lo que simplifica las lineas de codigo y la velocidad de comprobacion.

Para ver mejor esto veamos un fragmento de codigo para apreciar la utilidad:


// Valor para definir el error
// En este caso no se analiza
#define ENC_ERROR 0

// Suponiendo que las salidas del encoder
// estan conectadas:
// A -> bit 0 del puerto de lectura
// B -> bit 1 del puerto de lectura
// solo se leen esos bits del puerto
#define ENCODER_IN  ( input_port() & 0x03 )

signed char M_inc[4][4] = { {0,         1,         -1,        ENC_ERROR},
{-1,        0,         ENC_ERROR, 1        },
{1,         ENC_ERROR, 0,        -1        },
{ENC_ERROR, -1,        1,        0         }
};

// La variable que puede alterar el encoder es por
// pase de parametros por referencia (puntero)
// Si hay cambio en encoder regresa el sentido o error
// +1 -> sentido horario
// -1 -> sentido antihorario
// Si no hay cambio, regresa cero
signed char encoder( int *variable )
{
// variables estaticas
//( se mantiene su valor entre llamadas de funciones )
static signed char previo, actual, inc;

// actualizacion
previo = actual;
actual = ENCODER_IN;

// detectamos el incremento (si lo hay)
inc = M_inc[previo][actual];

// incrementamos o decrementamos la variable
*variable += inc;

// regresamos el cambio (direccion o error)
return inc;
}

En el pseudo-codigo anterior, se usa la matriz de incrementos para saber que ha pasado con el encoder y ademas la funcion “encoder()” tambien puede cambiar una variable (en este caso una de tipo entero) que nos puede servir para determinar la “distancia” ( en este caso angular ) que ha recorrido el encoder.

Como pueden ver, no es nada dificil la interpretacion de un encoder rotativo de cuadratura. solo unos pocos pasos en lenguaje C jejeje 😛

Y ahora ¿que sigue? bueno, hay varios “modelos” de encoder de cuadratura, para efectos de este articulo seleccione unos “tipo potenciometro” como los que aparecen en la siguiente imagen.

IMG_0251

No son nada del otro mundo 😉 y diseñé una pequeña tarjeta basada en el chip MC14490P que es un integrado que “filtra” o “elimina” los rebotes mecanicos de los interruptores. Este chip tiene una ventaja: como es CMOS puede trabajar en un rango amplio de voltajes (hasta 18v!!) lo que lo hace una solucion casi natural para este ejemplo.

El diagrama es muy sencillo:

encoder_sch

Las salidas Ax y Bx son de los encoders y los Px son salidas de un “push-button” que viene integrado a este modelo de encoder. El diseño del PCB es el siguiente:

encoder_pcb

Los archivos de este diseño estan en formato DipTrace, en este link.

Bueno, espero que esto sea de ayuda para entender mejor esto de los encoders….

Sin mas por el momento.

Argos.

Anuncios

8 pensamientos en “Encoder de cuadratura

    • Hola, disculpa la demora. Para calcular la velocidad con el encoder, puedes usar un contador que reciba los pulsos y checarlo cada “x” tiempo de manera constante, por ejemplo cada segundo, y hacer el calculo de la velocidad a revoluciones por minuto multiplicando lo que salga en el contador por 60 (el minuto) y después dividirlo entre 64 (los pulsos por revolución). Otra forma es medir cuanto tiempo hay entre un pulso y otro y de allí deducir la velocidad . Con un microcontrolador tendría que ser relativamente sencillo. Hay ejemplos de tacómetros en google por montones.

      Saludos.

  1. muy buenos dias , gracias es muy buena explicacion se poco de esto
    mi pregunta tengo un brazo de robot sepro que al bajar eje z se disminuye la lectura de el encoder y al subir lo contrario logico yo requiero que sea inverso podras informarme algo de esto gracias

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s