Escolar Documentos
Profissional Documentos
Cultura Documentos
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:
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.
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.
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
// 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
}
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;
}
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;
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
= 0;
= 1;
= 1;
=
=
=
=
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
*
*
*
*
(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);
}
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);
}
}
10