UNIVERSIDAD DE LAS FUERZAS ARMADAS ESPE-L
INGENIERIA ELECTRONICA E INTRUMENTACION
INSTRUMENTACION Y SENSORES
ENCODER
Lenin Israel Chimbana Masabanda
lichimbana@[Link]
OBJETIVO:
Diseñar E Implementar Un Medidor De Revoluciones (Encoder) Y Verificar Mediante Una
Pantalla Lcd Su Funcionamiento De Las Revoluciones Que Marca Un Motor Dc.
MATERIALES Y EQUIPO
Pic16f877
Lcd
Moc7811
Resistencias
Pulsador
Lm311
Potenciómetros
Cables De Conexión
ENCODER
El encoder es un transductor rotativo, que mediante una señal eléctrica (normalmente un pulso o una señal
senoidal) nos indica el ángulo girado. Si este sensor rotatorio lo conectáramos mecánicamente con una
rueda o un husillo, también nos permitiría medir distancias lineales. Una clasificación de los encoder
según el tipo de información sobre la posición que generan sería:
Encoder incremental: La señal de salida se transmite por un hilo en el que se transmite un pulso por cada
ángulo girado, de tal forma que si tenemos un encoder de 1000 ppr, tendremos un pulso por cada
360º/1000= 0,360º. El inconveniente es que no disponemos de una referencia absoluta de la posición en la
que se encuentra el eje.
Encoder absoluto: La posición se da en valor absoluto mediante un bus paralelo. Es decir, que si
tenemos un encoder de 256 posiciones, tendremos un bus de 8 líneas que nos indicaran en binario cuál es
su posición (normalmente estos transductores codifican la posición en código gray para evitar errores). El
inconveniente de estos encoders es la cantidad de líneas que necesitamos leer y conectar y que debido a la
complejidad del disco óptico que codifica las posiciones la resolución no suele ser muy elevada.
FUNCIONAMIENTO:
Activamos una luz y esta luz llega a un detector que genera una tensión de salida, interruptor cerrado. Si no se
activa la luz o no le llega la luz al detector, este no genera ninguna tensión de salida, es decir interruptor
abierto.
Supongamos un encoder de 500 ppr. Las señales a lo largo del tiempo que vamos a obtener por los
canales A y B serán las siguientes:
Fig.1 Señales que envía y lee un Encoder
Fig.2 Diagrama Encoder
En cada revolución completa del encoder podremos contar 500 pulsos, con un flanco de subida (transición
de 0 a 1 ) y un flanco de bajada ( transición de 1 a 0 ) cada uno. Para determinar el ángulo girado por el
encoder se cuenta el número de flancos de subida ( o de bajada ) generados en un canal ( por ejemplo el A
) y la dirección vendrá determinada, en cada pulso, por el estado del otro canal, de tal forma que si esta a 0
determinamos que va en una dirección ( la que nosotros queramos ) y si es 1 ira en la dirección contraria.
PIC16F877
El microcontrolador PIC16F877 de Microchip pertenece a una gran familia de micro controladores de 8
bits (bus de datos) que tienen las siguientes características generales que los distinguen de otras familias:
- Arquitectura Harvard
- Tecnología RISC
- Tecnología CMOS
Fig.3 Diagrama de Pines Pic16f877
Funcionamiento LCD y sus Conexiones
Fig.4 Conexiones LCD
CODIGO ENCODER
#INCLUDE <16F877.h>
#DEVICE ADC=10
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOPROTECT,NOWDT,NOBROWNOUT,PUT,NOLVP
#INCLUDE <LCD.C>
#BYTE PORTA= 5
#byte PORTB= 6
#byte PORTC= 7
#BYTE PORTD= 8
long contador=0;
int16 duty=0;
int Timer2,Poscaler;
double RPM;
// LENIN CHIMBANA
//Interrubción por cambio en RB0
#INT_EXT
ext_isr()
{
contador++;
}
void main()
{
//Configura los Puertos del PIC
set_tris_a(0x01);
set_tris_b(0x01); //RB0 como entrada
set_tris_d(0);
//Configura la Entrada Analoga
setup_adc_ports(sAN0);
setup_adc(adc_clock_internal); //Reloj interno para la conversion analoga digital)
//Configura el PWM
// Generemos una Señal cuadrada de 1 Khz
Timer2=249; //Se carga timer 2 con 249 como lo vimos en la pagina
//Preescaler=4; //Preescaler
//Para el preescaler colocamos "t2_div_by_4"
Poscaler=1; //Preescaler solo puede tomar valores de: 1
setup_timer_2(t2_div_by_4,Timer2,Poscaler); //Configuracion de Timer 2 para establecer frec. PWM a
1kHz
setup_ccp1(ccp_pwm); //Configurar modulo CCP1 en modo PWM
//Habilita las Interrupcciones
enable_interrupts(int_ext); //Activa interrupcion por RB0
ext_int_edge(L_TO_H); //Activa interrupción por flanco de bajada
enable_interrupts(global); //Habilita interrupciones de forma global
lcd_init();
lcd_gotoxy(1,1);
LCD_PUTC("VELOCIDAD MOTOR");
//Hace por siempre
while(1)
{
//Lectura del Potenciometro
set_adc_channel(0); //Escoge el canal 0 de los puertos analogos
delay_us(100);
duty=read_adc(); //Almacena en duty el valor del voltaje del pot
set_pwm1_duty(duty);//10 bits= 1023 y 8bit= 255
delay_ms(999);
//da 10 pulsos en 1 giro completo
RPM=contador*60/20;
//Reinicia el contador de Pulsos
contador=0;
//Visualiza la Velocidad
lcd_gotoxy(1,2);
printf(lcd_putc,"RPM: %f ",RPM);
}
DIGARMAS DE SIMULACIONES
Fig.5 ENCODER
Fig.6 Medidor Velocidad
CONCLUSIONES:
Se puede concluir que mediante un opto colador se puede medir los impulsos que
envía una rueda de agujeros en un motor la cual nos envía pulsos de voltajes altos y
voltajes bajos 1 y 0
Mediante la programación de un Micro podemos ingresar una fórmula que nos
permite enviar señales a un LCD que nos indica las revoluciones por minuto que
este nos está generando
Esta práctica nos ayudó a verificar como podemos aplicarlo en diferentes
aplicaciones que utilicen este principio
RECOMENDACIONES:
Se puede recomendar de tener mucho cuidado con el opto acoplador y en la forma
de su conexión
Además tener muy encuentra el número de ranuras en el disco ya que a mayor
ranuras mayor es la resolución del Encoder
Ajustar la intensidad del LCD para poder ver unos datos visibles ya que a mayor
brillo es muy difícil de observar (Ajustar con un potenciómetro pin 15 y 16 LCD)
ANEXOS: