Medir velocidad con encoder

12
UNIVERSIDAD POLITÉCNICA DE PACHUCA MAESTRÍA EN MECATRÓNICA SISTEMAS PROGRAMABLES Y RECONFIGURABLES PROYECTO: MEDICION DE DESPLAZAMIENTO Y VELOCIDAD EN UN ENCODER UTILIZANDO EL PIC 18F26J13 Y EL LENGUAJE DE PROGRAMACIÓN MIKRO C PERIODO: ENERO – ABRIL 2015

description

Practica para medir velocidad con un encoder usando el pic 18f23j13

Transcript of Medir velocidad con encoder

Sistemas Programables y Reconfigurables

UNIVERSIDAD POLITCNICA DE PACHUCAMAESTRA EN MECATRNICASISTEMAS PROGRAMABLES Y RECONFIGURABLES

PROYECTO: MEDICION DE DESPLAZAMIENTO Y VELOCIDAD EN UN ENCODER UTILIZANDO EL PIC 18F26J13 Y EL LENGUAJE DE PROGRAMACIN MIKRO C

PERIODO:ENERO ABRIL 2015

1. INTRODUCCION Unos de los mtodos ms utilizados para sensar velocidades, es utilizando medios pticos digitales. Este procedimiento debe su popularidad al gran desarrollo actual de tcnicas de este tipo. La captacin optoelectrnica consiste bsicamente en un LED, el cual emite una luz infrarroja, para no ser perpetuada por la iluminacin del ambiente. Enfrente del LED se dispone un fototransistor el cual capta la luz emitida por el diodo.Entre ambos elementos, se hace pasar un disco perforado o un disco con pelcula con zonas trasparentes y zonas sombreadas. Las zonas transparentes y opacas dejan pasar e interrumpen, alternativamente, el haz luminoso del LED, con lo cual el fototransistor conduce y se bloquea sucesivamente.

Figura 1. Disco ranurado utilizado en los encodersEl uso de optoacopladores presenta una serie de ventajas sobre otros sistemas: Su operacin y funcionamiento son muy sencillos. Presentan un aislamiento galvnico muy alto entre la entrada y la salida. Permite la transmisin de impulsos de larga duracin (impulsos mantenidos) Impiden el paso de interferencia entre los dos circuitos acoplados por este medio El codificador ptico o encoder es uno de los dispositivos de ms amplio uso en el mundo de la electrnica industrial, pues permite conocer la posicin, velocidad y aceleracin de elementos que se mueven en el espacio. El encoder utilizado para el desarrollo de esta prctica es un dispositivo que entrega 256 pulsos por revolucin.

Figura 2. Ejemplo de un motor con encoder2. OBJETIVOEl objetivo de la prctica es disear un circuito que sea capaz de leer la velocidad y desplazamiento angular de cuatro encoders, datos que podrn ser visualizados en un LCD; adems deber tener la capacidad de reconocer el sentido de giro del mismo.3. DESARROLLOEl presente proyecto se divide en dos partes: 1. El CPLD ispMACH LC4032V de Lattice, el cual tiene la funcin de decodificar el sentido de giro de los cuatro encoders, labor que realiza utilizando un arreglo de varias compuertas y un flip-flop JK (para cada encoder). El circuito utilizado para decodificar as como el CPLD se muestran en las figuras 3 y 4 respectivamente.

Figura 3. Circuito decodificador de encoder

Figura 4. CPLD ispMACH LC4032V de Lattice2. La segunda parte del proyecto est formada por el Microcontrolador PIC18F26J13, el cual se encarga de hacer el conteo de los pulsos del encoder y convertirlos en posicin y velocidad angular. Se eligi este PIC debido a que es un poderoso instrumento pues cuenta con 8 timers, pines remapeables, interrupciones externas, entre otras caractersticas.

Figura 5. PIC 18F26J13 4. RESULTADOSCdigo:int num;char bot, timer;long v1, v2, v3, v4;float e1, e2, e3, e4; // Variables para lectura de timersfloat p1, p2, p3, p4;int en1, en2, en3, en4, en1i, en1d, en2i, en2d, en3i, en3d, en4i, en4d;char e1t[14], e2t[14], e3t[14], e4t[14]; // Variables para desplegar los valores del timer en diaplaychar p1t[14], p2t[14], p3t[14], p4t[14];

//Definicion pines para el LCD.sbit LCD_RS at RC7_bit;sbit LCD_EN at RC6_bit;sbit LCD_D7 at RB3_bit;sbit LCD_D6 at RB2_bit;sbit LCD_D5 at RB1_bit;sbit LCD_D4 at RA2_bit;

//Definicion de registros TRIS para el LCD.sbit LCD_RS_Direction at TRISC7_bit;sbit LCD_EN_Direction at TRISC6_bit;sbit LCD_D7_Direction at TRISB3_bit;sbit LCD_D6_Direction at TRISB2_bit;sbit LCD_D5_Direction at TRISB1_bit;sbit LCD_D4_Direction at TRISA2_bit;

void interrupt(){ INTCON.GIE = 0; if (INTCON.INT0IF == 1) // Interrupcin externa 0 { en3 = en3 + 1; INTCON.INT0IF = 0; } else { if (INTCON3.INT1IF == 1) // Interrupcin externa 1 { en3 = en3 - 1; INTCON.INT1IF = 0; } else { if (INTCON3.INT2IF == 1) // Interrupcin externa 2 { en4 = en4 + 1; INTCON3.INT2IF = 0; } else { if (INTCON3.INT3IF == 1) // Interrupcin externa 3 { en4 = en4 - 1; INTCON.INT3IF = 0; } else { if (PIR1.TMR2IF == 1) // Timer 2 interrupt flag { PORTC.F5 = ~PORTC.F5; // Toggle PORTB bit1 LED timer = 1; PR2 = 114; // PR2 (Timer2 Match value) PIR1.TMR2IF = 0; // Clears TMR2IF bit 1 TMR2IF: TMR2 to PR2 Match Interrupt Flag bit } void osc_conf(){ //Configuracin del oscilador interno OSCCON.IRCF0 = 1; // Configura el oscilador interno a 8MHz OSCCON.IRCF1 = 1; // Configura el oscilador interno a 8MHz OSCCON.IRCF2 = 1; // Configura el oscilador interno a 8MHz}

void port_conf(){ //Configuracin de puertos PORTA = 0x00; // Inicializa el puerto A LATA = 0x00; // Limpia el puerto A ANCON0 = 0xFF; // Habilita los 8 bits como digitales TRISA = 0xF3; // Configura puerto A como entradas PORTB = 0x00; // Inicializa el puerto B LATB = 0x00; // Limpia el puerto B ANCON1 = 0xFF; // Habilita el puerto B como digital TRISB = 0xF1; // Configura el puerto B como salidas INTCON2.F7 = 0; // Habilitacion de resistencias pull-up PORTC = 0x00; // Inicializa el puerto C LATC = 0x00; // Limpia el puerto C TRISC = 0x0F; // Configura el puerto C como salidas CM1CON = 0x00; //Desabilita los comparadores analgicos CM2CON = 0x00; //Desabilita los comparadores analgicos CM3CON = 0x00; //Desabilita los comparadores analgicos}

void lcd_conf(){ //Configuracin e inicializacin del LCD. Lcd_Init(); //Inicializa el LCD. Lcd_Cmd(_LCD_CURSOR_OFF); //Se apaga el cursor. LCD_Cmd(_LCD_CLEAR); //Limpia el LCD Lcd_Out(1, 1,"Ingresa numero"); //Se imprime texto. Lcd_Out(2, 1,"de encoder"); //Se imprime texto. delay_ms(1000);}

void tmr2_conf(){ //Configuracion del Timer 2 en modo temporizador //Timer2 Registers Prescaler= 16 - TMR2 PostScaler = 5 - PR2 = 250 - Freq = 100.00 Hz - Period = 0.01000 seconds T2CON |= 72; // bits 6-3 Post scaler 1:1 thru 1:16 T2CON.TMR2ON = 1; // bit 2 turn timer2 on; T2CON.T2CKPS1 = 1; // bits 1-0 Prescaler Rate Select bits T2CON.T2CKPS0 = 0; PR2 = 125; // PR2 (Timer2 Match value)}

void remap_conf(){ PPSCON.IOLOCK = 0; // Habilitacin de remapeo RPINR4 = 0x0D; // Remapeo del Timer0 RPINR6 = 0x0C; // Remapeo del Timer 3 RPINR15 = 0x0E; // Remapeo del Timer 5 RPINR1 = 0x00; // Configuracin de la interrupcin externa 1 RPINR2 = 0x01; // Configuracin de la interrupcin externa 2 RPINR3 = 0x02; // Configuracin de la interrupcin externa 3 PPSCON.IOLOCK = 1; // Deshabilitacin de remapeo}

void tmr0_conf(){ //Configuracion del Timer0 T0CON.TMR0ON = 1; // Habilita el Timer 0 T0CON.T08BIT = 0; // Se configura en modo de 16 bits T0CON.T0CS = 1; // Se configura como contador 1 T0CON.T0SE = 0; // Transicin de bajo a alto T0CON.PSA = 1; // El preescalador no esta asignado}

void tmr1_conf(){ //Configuracion del Timer1 T1CON.TMR1ON = 1; // Habilita el Timer 1 T1CON.TMR1CS0 = 0; // Selecciona la fuente del reloj, ya sea T1OSC o T1CKI T1CON.TMR1CS1 = 1; // Selecciona la fuente del reloj, ya sea T1OSC o T1CKI 1 T1CON.T1OSCEN = 0; // La fuente del reloj viene del T1CKI T1CON.F2 = 1; // No sincronizar con la entrada de reloj externa T1CON.T1CKPS0 = 0; // Pone el preescalador en 1:1 T1CON.T1CKPS1 = 0; // Pone el preescalador en 1:1 T1CON.RD16 = 1; // Se configura en modo de 16 bits T1GCON.TMR1GE = 0; // Timer 1 cuenta independientemente de la compuerta del timer 1}

void tmr3_conf(){ //Configuracin del Timer 3 T3CON.TMR3ON = 1; // Habilita el Timer 3 T3CON.TMR3CS0 = 0; // Selecciona la fuente del reloj el pin o T1CKI T3CON.TMR3CS1 = 1; // Selecciona la fuente del reloj el pin o T1CKI 1 T3CON.T3CKPS0 = 0; // Pone el preescalador en 1:1 T3CON.T3CKPS1 = 0; // Pone el preescalador en 1:1 T3CON.T3OSCEN = 0; // La fuente del reloj viene del T1CKI T3CON.F2 = 1; // No sincronizar con la entrada de reloj externa T3CON.RD16 = 1; // Se configura en modo de 16 bits T3GCON.TMR3GE = 0; // Timer 3 cuenta independientemente de la compuerta del timer 3}

void tmr5_conf(){ //Configuracin del Timer 5 T5CON.TMR5ON = 1; // Habilita el Timer 5 T5CON.TMR5CS0 = 0; // Selecciona la fuente del reloj el pin o T1CKI T5CON.TMR5CS1 = 1; // Selecciona la fuente del reloj el pin o T1CKI 1 T5CON.T5CKPS0 = 0; // Pone el preescalador en 1:1 T5CON.T5CKPS1 = 0; // Pone el preescalador en 1:1 T5CON.T5OSCEN = 0; // La fuente del reloj viene del T1CKI T5CON.F2 = 1; // No sincronizar con la entrada de reloj externa T5CON.RD16 = 1; // Se configura en modo de 16 bits T5GCON.TMR5GE = 0; // Timer 5 cuenta independientemente de la compuerta del timer 5}

void res_tim() // Pone en 0 los timers usados para conteo{ TMR0L = 0; TMR0H = 0; TMR1L = 0; TMR1H = 0; TMR3L = 0; TMR3H = 0; TMR5L = 0; TMR5H = 0;}

void inte_conf() // Configuracin de Interrupciones{ RCON.IPEN = 0; // Interrupciones en modo de compatibilidad familia 16F INTCON.PEIE = 1; // bit6 Peripheral Interrupt Enable bit...1 = Enables all unmasked peripheral interrupts INTCON.TMR0IE = 0; INTCON.TMR0IF = 0; INTCON.INT0IE = 1; // Habilita la interrupcin externa 0 INTCON.INT0IF = 0; INTCON.RBIE = 1; // Habilita la interrupcion por cambio en el PORTB INTCON.RBIF = 0; INTCON2.INTEDG0 = 0; // La interrupcin 0 se habilita por flanco de bajada INTCON2.INTEDG1 = 0; // La interrupcin 1 se habilita por flanco de bajada INTCON2.INTEDG2 = 0; // La interrupcin 2 se habilita por flanco de bajada INTCON2.INTEDG3 = 0; // La interrupcin 3 se habilita por flanco de bajada

INTCON3.INT1IE = 1; // Habilita la interrupcin externa 1 INTCON3.INT2IE = 1; // Habilita la interrupcin externa 2 INTCON3.INT3IE = 1; // Habilita la interrupcin externa 3 INTCON3.INT1IF = 0; // Limpia la bandera de interrupcin 1 INTCON3.INT2IF = 0; // Limpia la bandera de interrupcin 2 INTCON3.INT3IF = 0; // Limpia la bandera de interrupcin 3

PIR1.TMR2IF = 0; // clear timer1 interupt flag TMR1IF PIE1.TMR2IE = 1; // enable Timer2 interrupts

INTCON.GIE = 1; // bit7 global interrupt enable habilita con 1}

//Inicio del programa principalvoid main(){ osc_conf(); // Funcion de configuracin del oscilador port_conf(); // Funcion que habilita los puertos lcd_conf(); // Funcin que configura el LCD tmr2_conf(); // Funcin que configura el Timer 2 remap_conf(); // Remapeo de perifericos tmr0_conf(); // Funcin que configura el Timer 0 tmr1_conf(); // Funcin que configura el Timer 1 tmr3_conf(); // Funcin que configura el Timer 3 tmr5_conf(); // Funcin que configura el Timer 5 res_tim(); // Borra los Timers usados para conteo inte_conf(); // Configuracin de interrupciones

bot=1; p1 = 0; p2 = 0; p3 = 0; p4 = 0; while(1) { if(timer == 1) { // e1=0; e2=0; e3=0; e4=0; en1i = TMR0H