Medidor de Ángulos Por Un Encoder Rotatorio

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 6

Medidor De Ángulos Por Un Encoder

Rotatorio
Richard Alejandro Pabon Benítez, Juan Felipe Caro Gil
Ing. Mecatronica, Facultad De Ingeniera, Departamento De Automática Y Electrónica
Universidad Autónoma De Occidente
Cali, Colombia

Resumen En este laboratorio se quiere probar el


Se realiza la detección de posición angular funcionamiento del encoder para medir un angulo
mediante el encoder rotario que entrega su señal al a partir de la posición y proporcionar una
microcontrolador Arduino MEGA en el que, en su visualización cada segundo del angulo medido en
microprocesador, ATmega 2560, está el código que un display LCD, implementando lenguaje C por
calcula la posición y muestra su valor en una medio de la utilización del software de Atmel
pantalla LCD. Studio 7, sin la utilización de librerías,
exceptuando las librerías para el manejo de los
puertos de entrada y salida del Arduino Mega e
interrupciones externas.
I. INTRODUCCION
II. MARCO TEORICO
En el mundo de la electrónica se han visto muchos
avances de lo mecánico a lo digital lo que ha A) Encoder
permitido facilitar el procesamiento de señales
mediante software y no hardware sin embargo Los codificadores rotatorios (conocidos
depende de la implementación a realizar, sin genéricamente como encoders) son mecanismos
embargo hay muchas aplicaciones que requieren utilizados para entregar la posición, velocidad y
aun el aspecto mecánico pero han sido aceleración del rotor de un motor. Sus principales
acondicionados para proporcionar una señal aplicaciones incluyen aplicaciones en robótica,
digital, sin embargo debido a su origen mecánico lentes fotográficas, aplicaciones industriales que
aun presenta fallos, como errores en las señales que requieren medición angular, militares, etc.
proporciona.
Un codificador rotatorio es un dispositivo
Un ejemplo de esto es el encoder rotatorio, este es electromecánico que convierte la posición angular
un dispositivo que permite determinar la posición de un eje, directamente a un código digital.
y velocidad angular mediante el giro de una perilla
sin limitante, con este es posible tener un registro Los tipos más comunes de encoders se clasifican
de estos valores en un Arduino. Los encoders en: absolutos y relativos (conocidos también como
fueron inventados teniendo en cuenta la estructura incrementales). Los encoders absolutos pueden
de un potenciómetro, debido a que el venir codificados en binario o gray. Dentro de los
potenciómetro era utilizado anteriormente para encoders incrementales, se encuentran los encoders
trabajar con las variables de posición y velocidad en cuadratura, ampliamente utilizados en motores
angular, sin embargo debido a al tope que este de alta velocidad y en aplicaciones en las que
posee no resultaba conveniente usarlo. Existen interesa conocer la dirección del movimiento del
diferentes tipos de encoders, cada encoder tiene eje.
una diferencia y es el número de pulsos que genera
por una revolución, donde algunos pueden ser de El tipo común de encoder incremental consiste de
30 pulsos o de 20 pulsos, o su funcionamiento. un disco solidario al eje del motor que contiene un
patrón de marcas o ranuras que son codificados por
un interruptor óptico (par led/fotodiodo o led/
fototransistor) generando pulsos eléctricos cada C) Arduino Mega con microcontrolador
vez que el patrón del disco interrumpe y luego Atmega2560
permite el paso de luz hacia el interruptor óptico a
medida que el disco gira. El microcontrolador basado en AVR RISC
Microchip de 8 bits de alto rendimiento y bajo
B) Encoder en cuadratura consumo combina 256KB de memoria flash ISP,
8KB SRAM, 4KB EEPROM, 86 líneas de E / S de
Corresponde a un tipo de encoder incremental que propósito general, 32 registros de trabajo de
utiliza dos sensores ópticos posicionados con un propósito general, contador de tiempo real, seis
desplazamiento de ¼ de ranura el uno del otro, temporizadores flexibles / contadores con modos
generando dos señales de pulsos digitales de comparación, PWM, 4 USART, interfaz serial
desfasada en 90º o en cuadratura. A estas señales de 2 hilos orientada a bytes, convertidor A / D de
de salida, se les llama comúnmente A y B. 16 canales y 10 bits, y una interfaz JTAG para
depuración en chip. El dispositivo alcanza un
Mediante ellas es posible suministrar los datos de rendimiento de 16 MIPS a 16 MHz y opera entre
posición, velocidad y dirección de rotación del eje. 4.5-5.5 voltios.
Si se incluye la señal de referencia, se le denomina
I (índice). El Arduino Mega 2560 es una tarjeta de desarrollo
de Hardware libre construida con el
Usualmente, si la señal A adelanta a la señal B (la microcontrolador Atmega 2560. El Arduino Mega
señal A toma valor lógico “1” antes que la señal 2560 tiene 54 pines de entrada/salida, de los cuales
B), se establece el convenio de que el eje está exactamente 14 de ellos pueden ser utilizados
rotando en sentido horario, mientras que si B como salidas de PWM (Modulación por ancho de
adelanta a A, el sentido será anti horario. pulso), cuenta con otras 16 entradas analógicas y 4
UARTs (puertos serial).

En cuanto a la velocidad del microcontrolador


podemos decir que cuenta con un Cristal de 16MHz
y una memoria Flash de 256K. Maneja un rango de
voltaje de entrada de entre 7 y 12 volt, se
recomienda una tensión de entrada en 9 Volt.
Figura 1. Ejemplo de disco ranurado y señales
cuadradas con la señal de referencia La comunicación entre la tarjeta Arduino y la
computadora se establece a través del puerto serie,
cuenta con un convertidor interno USB – SERIE de
manera que no es necesario agregar ningún
dispositivo externo para programar el
microcontrolador.

Figura 2. Señales A y B en sentido horario y anti


horario
Figura 4. Tarjeta de Arduino Mega con de energía y ESCRIBIR, en esta se escribieron los
controlado atmega2560 fragmentos de código antes mencionados.

Seguidamente se hacen las primera definiciones y


declaraciones como variable C_ANG, los puertos
A y B de salida, puerto D de entrada, habilitación
de interrupción externa INT0 y por temporizador,
III. MONTAJE E IMPLEMENTACION definición de detección por flanco de bajada y
precarga de temporizador para 1 segundo,
Para la implementación física de este laboratorio se activación de modos de ahorro de energía,
usó el microcontrolador Arduinio Mega, el habilitación de interrupciones globales y antes de
enconder HY-040, una pantalla LCD 2x16, un entrar al bucle hace un llamado a In_LCD().
potenciómetro y capacitores. En cuanto a la
pantalla, se conecto los pines de comunicación al uint8_t C_ANG=0x00;
puerto A, los pines de control RS, E se conectaron
a los pines 0 y 1 del puerto B del microcontrolador EIMSK=0X01;
y el potenciómetro se conecto al control del EICRA=0X02;
contraste. Las salidas del ecnoder ClK y TM se
conectaron al pin0 del puerto D y pin1 del puerto F TIMSK1=0X01;
respectivamente a través de los capacitores para TCCR1B=0X06;
mitigar el anti rebote posiblemente generado. TCNT1H=0X0B;
TCNT1L=0XDC;
En cuanto a la solución generada en el software se SMCR=1;
usaron las interrupciones tanto externa como por sei();
timer y se elaboraron dos fragmentos de códigos
complementarios para la comunicación con la DDRA=0XFF; DDRB=0XFF;
pantalla y otra para generar tiempos de espera DDRC=0xFF; DDRD=0x00;
(delay). Las interrupciones generadas por el DDRF=0x00;
encoder se asociaron a la interrupción externa y la
medición de posición del mismo, en la interrupción In_LCD();
por temporizador al activarse se mostraba el ángulo
en pantalla. Los fragmentos de código hacen
referencia a las instrucciones necesarias para En el ciclo de ejecución el microprocesador entra
resetear, encender, limpiar, configurar y escribir en en modo ahorro de energía IDLE y permanece allí
la pantalla LCD; el otro fragmento es un conjunto hasta la activación de alguna de las dos
de ciclos en el que el microcontrolador no realiza interrupciones, en ese momento entra a la rutina de
ninguna operación, son comandos NOP, teniendo atención respectiva.
como resultado tiempos de espera, estos tiempos se
requiere para la comunicación entre while (1)
microcontrolador y pantalla. {
SLEEP_MODE_IDLE;
}
#define F_CPU 16000000UL
#include <avr/io.h>
//#include <util/delay.h> En la atención a la interrupción externa se
#include <avr/interrupt.h> incrementa el valor de la variable C_ANG, que
comienza en 0, hasta 30 en donde se resetea al valor
inicial, además se hace un llamado a la función
En el condigo principal se inicia definiendo la imprimir() y luego retorna a bucle. En la rutina de
frecuencia de CPU e incluyendo las librerías de atención del temporizador se carga nuevamente el
puertos de salida y entrada, interrupciones, ahorro
tiempo de 1 segundo en los registros TCNT1L y #define ee 0x65 /*e
TCTN1H para luego llamar a imprimir().

ISR(INT0_vect){ void delay_ms(uint8_t x ){

C_ANG++; uint8_t j;
uint8_t i;
if (C_ANG>19){
C_ANG=0; for (j=0;j<=x;j++){
}
imprimir(C_ANG); for(i=0;i<=11;i++){
}
asm("LDI R16,0xFF");
asm("loop1:");
ISR(TIMER1_OVF_vect){ asm("NOP");
asm("NOP");
TCNT1H=0X0B; asm("DEC R16");
TCNT1L=0XDC; asm("BRNE loop1");
}
imprimir(C_ANG); }
} }

void LCD_Inst(uint8_t Inst){


In_LCD e imprimir hacen parte del fragmento de
código encargado de la comunicación con pantalla PORTB &=~(1<<PORTB0);
en las cuales se hacen llamados a la función PORTB &=~(1<<PORTB1);
delay_ms() que hace parte del otro fragmento de delay_ms(1);
código. Estas funciones pertenecen a la librería
ESCRIBIR en la que previamente a implementar PORTB |=(1<<PORTB1);
las funciones llamadas en el código principal se
definieron variables alfanuméricas asociadas a PORTA = Inst;
instrucciones de comunicación y caracteres en delay_ms(1);
código ASCII.
PORTB &=~(1<<PORTB1);
En la función In_LCD se resetea, se configura tipo delay_ms(1);
de comunicación, se clarea la pantalla, se ajusta el }
cursor en la primera posición y se escribe “El
Angulo es:”. En imprimir se lee el valor de C_ANG
y este entra en el condicional correspondiente que void LCD_Cart(uint8_t data){
determina el valor de ángulo y envía los caracteres
a la segunda línea de la pantalla. También se hace PORTB |=(1<<PORTB0);
uso de otras funciones tales como lcd_inst y PORTB &= ~(1<<PORTB1);
lcd_dato en las cuales se recibe la instrucción y el
carácter que son enviados a la pantalla. delay_ms(1);

#define n0 0x30 //1 PORTB |= (1<<PORTB1);


#define n1 0x31 //1
#define n2 0x32 //2 PORTA = data;

#define Aa 0x41 /*A delay_ms(1);


#define Ee 0x45 /*E PORTB &= ~(1<<PORTB1);
delay_ms(1); ramos.elo.utfsm. 2019. Encoder. [ONLINE]
} Available at:
http://ramos.elo.utfsm.cl/~elo212/docs/Encoders-
void In_LCD(void){ jvr-v01.pdf. [Accessed 18 October 2019].

LCD_Inst(lcd_Reset); ingmecafenix. 2019. Encoder ¿como funciona? y


delay_ms(1); sus tipos. [ONLINE] Available at:
LCD_Inst(lcd_Reset); https://www.ingmecafenix.com/automatizacion/en
delay_ms(1); coder/. [Accessed 18 October 2019].
LCD_Inst(lcd_Reset);
delay_ms(1); mexico.newark. 2019. ATMEGA2560-16AU -
MICROCONTROLLER MCU, 8 BIT, ATMEGA,
LCD_Inst(lcd_Set8bit); 16MHZ, TQFP-100. [ONLINE] Available at:
delay_ms(1); https://mexico.newark.com/microchip/atmega256
0-16au/microcontroller-mcu-8-bit-
LCD_Inst(lcd_Off); atmega/dp/68T2776. [Accessed 18 October 2019].
delay_ms(1);
electrontools. 2019. ARDUINO MEGA 2560
LCD_Inst(lcd_Clc); CARACTERÍSTICAS. [ONLINE] Available at:
delay_ms(1); https://www.electrontools.com/Home/WP/2018/0
6/19/arduino-mega-2560-caracteristicas/.
LCD_Inst(lcd_EnMode); [Accessed 18 October 2019].
delay_ms(1);

LCD_Inst(lcd_On);
delay_ms(1);
}

IV. CONCLUSIONES

 La implementación del código en lenguaje


de medio/alto nivel como lo es C, facilitan
el desarrollo de las aplicaciones.
 En la comunicación entre el
microprocesador y dispositivos externos es
necesario tener en consideración los
tiempos de espera entre instrucciones para
acceder a ellos.
 En interrupciones suele ocurrir el
fenómeno de rebote por lo que es necesario
tomar medidas para suprimirlo pues como
señal intrusa puede causar fallas en el
proceso.
 El dispositivo Arduino Mega resulta muy
versátil para el desarrollo de múltiples
proyectos y aplicaciones.

REFERENCIAS

También podría gustarte