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.
|