Você está na página 1de 10

UNIVERSIDAD POLITCNICA DE

PACHUCA
MAESTRA EN MECATRNICA
SISTEMAS 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

Sistemas Programables y Reconfigurables

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 encoders

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

Sistemas Programables y Reconfigurables

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 encoder

2. OBJETIVO
El 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. DESARROLLO
El 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 Lattice

2. La segunda parte del proyecto est formada por el Microcontrolador


PIC18F26J13, el cual se encarga de hacer el conteo de los pulsos del
3

Sistemas Programables y Reconfigurables

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. RESULTADOS
Cdigo:
int num;
char bot, timer;
long v1, v2, v3, v4;
float e1, e2, e3, e4;
// Variables para lectura de timers
float 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
diaplay
char 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)
{
en3 = en3 + 1;
INTCON.INT0IF = 0;
}
else
{
if (INTCON3.INT1IF == 1)
{
en3 = en3 - 1;
INTCON.INT1IF = 0;

// Interrupcin externa 0

// Interrupcin externa 1

Sistemas Programables y Reconfigurables


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

Sistemas Programables y Reconfigurables


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;
RPINR4 = 0x0D;
RPINR6 = 0x0C;
RPINR15 = 0x0E;
RPINR1 = 0x00;
RPINR2 = 0x01;
RPINR3 = 0x02;
PPSCON.IOLOCK = 1;
}
void tmr0_conf()
{
//Configuracion del Timer0
T0CON.TMR0ON = 1;
T0CON.T08BIT = 0;
T0CON.T0CS = 1;
T0CON.T0SE = 0;
T0CON.PSA = 1;
}

// Habilitacin de remapeo
// Remapeo del Timer0
// Remapeo del Timer 3
// Remapeo del Timer 5
// Configuracin de la interrupcin externa 1
// Configuracin de la interrupcin externa 2
// Configuracin de la interrupcin externa 3
// Deshabilitacin de remapeo

// Habilita el Timer 0
// Se configura en modo de 16 bits
// Se configura como contador
1
// Transicin de bajo a alto
// 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;
T3CON.TMR3CS0 = 0;
T3CON.TMR3CS1 = 1;
T3CON.T3CKPS0 = 0;
T3CON.T3CKPS1 = 0;

// Habilita el Timer 3
// Selecciona la fuente
// Selecciona la fuente
// Pone el preescalador
// Pone el preescalador

del reloj el pin o T1CKI


del reloj el pin o T1CKI 1
en 1:1
en 1:1

Sistemas Programables y Reconfigurables


T3CON.T3OSCEN = 0;
T3CON.F2 = 1;
T3CON.RD16 = 1;
T3GCON.TMR3GE = 0;

// La fuente del reloj viene del T1CKI


// No sincronizar con la entrada de reloj externa
// Se configura en modo de 16 bits
// 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()
{
TMR0L = 0;
TMR0H = 0;
TMR1L = 0;
TMR1H = 0;
TMR3L = 0;
TMR3H = 0;
TMR5L = 0;
TMR5H = 0;
}

// Pone en 0 los timers usados para conteo

void inte_conf()
{
RCON.IPEN
= 0;
INTCON.PEIE
= 1;
interrupts
INTCON.TMR0IE = 0;
INTCON.TMR0IF = 0;
INTCON.INT0IE = 1;
INTCON.INT0IF = 0;
INTCON.RBIE
= 1;
INTCON.RBIF
= 0;
INTCON2.INTEDG0 = 0;
INTCON2.INTEDG1 = 0;
INTCON2.INTEDG2 = 0;
INTCON2.INTEDG3 = 0;

// Configuracin de Interrupciones

INTCON3.INT1IE
INTCON3.INT2IE
INTCON3.INT3IE
INTCON3.INT1IF
INTCON3.INT2IF
INTCON3.INT3IF
PIR1.TMR2IF
PIE1.TMR2IE
INTCON.GIE
}

= 1;
= 1;
= 1;
= 0;
= 0;
= 0;

// Interrupciones en modo de compatibilidad familia 16F


// bit6 Peripheral Interrupt Enable bit...1 = Enables all unmasked peripheral

// Habilita la interrupcin externa 0


// Habilita la interrupcion por cambio en el PORTB
//
//
//
//

La
La
La
La

interrupcin
interrupcin
interrupcin
interrupcin

0
1
2
3

se
se
se
se

habilita
habilita
habilita
habilita

por
por
por
por

flanco
flanco
flanco
flanco

de
de
de
de

bajada
bajada
bajada
bajada

// Habilita la interrupcin externa 1


// Habilita la interrupcin externa 2
// Habilita la interrupcin externa 3
// Limpia la bandera de interrupcin 1
// Limpia la bandera de interrupcin 2
// Limpia la bandera de interrupcin 3

= 0;
= 1;

// clear timer1 interupt flag TMR1IF


// enable Timer2 interrupts

= 1;

// bit7 global interrupt enable habilita con 1

Sistemas Programables y Reconfigurables

//Inicio del programa principal


void 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
p2
p3
p4

=
=
=
=

0;
0;
0;
0;

while(1)
{
if(timer == 1)
{
// e1=0; e2=0; e3=0; e4=0;
en1i = TMR0H<<8;
// Corrimiento de los bits ms significativos
en1i = en1i + TMR0L;
// Los 8 bits ms significativos se suman a los 8 menos significativos
en1d = TMR1H<<8;
// Corrimiento de los bits ms significativos
en1d = en1d + TMR1L;
// Los 8 bits ms significativos se suman a los 8 menos significativos
en2i = TMR3H<<8;
// Corrimiento de los bits ms significativos
en2i = en2i + TMR3L;
// Los 8 bits ms significativos se suman a los 8 menos significativos
en2d = TMR5H<<8;
// Corrimiento de los bits ms significativos
en2d = en2d + TMR5L;
// Los 8 bits ms significativos se suman a los 8 menos significativos
e1
e2
e3
e4

=
=
=
=

en1i - en1d;
en2i - en2d;
en3;
en4;

p1
p2
p3
p4

=
=
=
=

p1
p2
p3
p4

+
+
+
+

e1
e2
e3
e4

=
=
=
=

e1
e2
e3
e4

*
*
*
*

// Obtiene los pulsos sumando el incremento y decremento del encoder 1


// Obtiene los pulsos sumando el incremento y decremento del encoder 2
// Obtiene los pulsos del encoder 3
// Obtiene los pulsos del encoder 4

(e1*0.0245);
(e2*0.0245);
(e3*0.0245);
(e4*0.0245);

23.43;
23.43;
23.43;
23.43;

//
//
//
//

Conversin
Conversin
Conversin
Conversin

de
de
de
de

pulsos
pulsos
pulsos
pulsos

a
a
a
a

velocidad
velocidad
velocidad
velocidad

en
en
en
en

RPMs
RPMs
RPMs
RPMs

floattostr(p1,p1t);
floattostr(p2,p2t);
floattostr(p3,p3t);
floattostr(p4,p4t);
floattostr(e1,e1t);
floattostr(e2,e2t);

// Convierte valor de velocidad en rpms a cadena


// Convierte valor de velocidad en rpms a cadena

Sistemas Programables y Reconfigurables


floattostr(e3,e3t);
floattostr(e4,e4t);
res_tim();
timer = 0;

// Convierte valor de velocidad en rpms a cadena


// Convierte valor de velocidad en rpms a cadena
// Reset a todos los registros Timer

}
else
{
if (bot==1)
{
LCD_Cmd(_LCD_CLEAR);
// Limpia el LCD
Lcd_Out(1, 1,"D1=");
// Se imprime texto.
Lcd_Out(2, 1,"V1=");
// Se imprime texto.
Lcd_Out(1, 4,p1t);
// Se imprime texto.
Lcd_Out(2, 4,e1t);
// Se imprime texto.
Lcd_Out(1, 14,"Rad");
// Se imprime texto.
Lcd_Out(2, 14,"RPM");
// Se imprime texto.
//
delay_us(500);
}
else
{
if (bot==2)
{
LCD_Cmd(_LCD_CLEAR);
// Limpia el LCD
Lcd_Out(1, 1,"D2=");
// Se imprime texto.
Lcd_Out(2, 1,"V2=");
// Se imprime texto.
Lcd_Out(1, 4,p2t);
// Se imprime texto.
Lcd_Out(2, 4,e2t);
// Se imprime texto.
Lcd_Out(1, 14,"Rad");
// Se imprime texto.
Lcd_Out(2, 14,"RPM");
// Se imprime texto.
//
delay_us(500);
}
else
{
if (bot==3)
{
LCD_Cmd(_LCD_CLEAR);
// Limpia el LCD
Lcd_Out(1, 1,"D3=");
// Se imprime texto.
Lcd_Out(2, 1,"V3=");
// Se imprime texto.
Lcd_Out(1, 4,p3t);
// Se imprime texto.
Lcd_Out(2, 4,e3t);
// Se imprime texto.
Lcd_Out(1, 14,"Rad");
// Se imprime texto.
Lcd_Out(2, 14,"RPM");
// Se imprime texto.
//
delay_us(500);
}
else
{
if (bot==4)
{
LCD_Cmd(_LCD_CLEAR);
// Limpia el LCD
Lcd_Out(1, 1,"D4=");
// Se imprime texto.
Lcd_Out(2, 1,"V4=");
// Se imprime texto.
Lcd_Out(1, 4,p4t);
// Se imprime texto.
Lcd_Out(2, 4,e4t);
// Se imprime texto.
Lcd_Out(1, 14,"Rad"); // Se imprime texto.
Lcd_Out(2, 14,"RPM"); // Se imprime texto.
//
delay_us(500);
}
}

Sistemas Programables y Reconfigurables


}
}
}
}
}

Figura 7. Circuito en funcionamiento

10

Você também pode gostar