You are on page 1of 8

/**************************CONFIGURACION PIC**********************************/

#include <16F877A.h>

#device adc=10

#use delay(clock=20000000)

#fuses HS,NOLVP,NOWDT

#include <lcd.c> // Libreria de LCD, por DEFAULT Puertob

/*****************************************************************************/

/************************CONFIGURACION
PUERTOS********************************/

//#byte trisa=0x85

//#byte trisb=0x86

//#byte trisc=0x87

#byte trisd=0x88

//#byte trise=0x89

//#byte puerto_a=5

//#byte puerto_b=6

//#byte puerto_c=7

#byte puerto_d=8

//#byte puerto_e=9

/*****************************************************************************/

/************************DEFINE BITS******************************************/

/*#BIT S1 = 0x06.0 //RB0

#BIT S2 = 0x06.1 //RB1

#BIT S3 = 0x06.2 //RB2

#BIT S4 = 0x06.3 //RB3


#BIT BA = 0x06.4 //RB4

#BIT BP = 0x06.5 //RB5

#BIT MOTORCW = 0x07.0 //RC0

#BIT MOTORCC = 0x07.1 //RC1 */

/*****************************************************************************/

/************************DEFINIR FUNCIONES************************************/

//VOID girarmotorcw ();

/*****************************************************************************/

/
*******************************MAIN******************************************/

VOID main ()

//**********Config. Encoders**********

INT16 C1, C2, C3; //lectura de ADC

INT16 A1, A2, A3; ////lectura de potenciometros proporcional al le

FLOAT p, p1,p2,p3; //lectura de voltaje

INT16 dif1,div1,mult1,sum1,mult11;

INT16 dif2,div2,mult2,sum2,mult21;

//**********Config. PWM**********

LONG dutycicle; // Variable que determina el ciclo de trabajo

// 16 bits, aunque la resolucion depende de la frecuencia

//pero si se pone un Int o SHORT, habra problemas porque no


//alcanzara la maxima resolucion

setup_timer_2 (T2_DIV_BY_16, 255, 1); //Config.Timer2 con tabla de la datasheet

//del PIC, esto fija el periodo de la seal

//PWMperiodo = (PR2 + 1) * 4 * Tosc * TMR2prescaler

setup_ccp1 (CCP_PWM); //Config. del modulo ccp en modo PWM en Puerto C2

setup_ccp2 (CCP_PWM); //Config. del modulo ccp en modo PWM en Puerto C1

//set_pwm1_duty (0); //Determinar ciclo de trabajo con formula

//Siendo Tosc = 1 / frecuenciaoscilador, ejemplo 1 / 4mhz

// (ccprxl:ccpxcon5:4) es el "Valor" que fija el ciclo de trabajo

//PWMdutycicle = (ccprxl:ccpxcon5:4) * Tosc * TMR2prescaler

//entonces; Valor = PWMdutycicle / (TMR2prescaler) (1 / frecuenciaoscilador)

//**********Config. Entradas Analogicas**********

setup_adc_ports (AN0_AN1_AN3); //Canal 0, 1, 3 analgico

setup_adc (ADC_CLOCK_INTERNAL); //Fuente de reloj RC INTERNA

//**********Config I / O**********

set_tris_d (0b00000000); // Salidas LCD Puerto D

//**********Inicio LCD**********

lcd_init (); // Se inicia la LCD


lcd_putc ("\f"); // Se borra la LCD, \n para ir a siguiente linea

lcd_gotoxy (1, 1);

printf (lcd_putc, "Leyendo Encoders");

delay_ms (500);

lcd_putc ("\f");

delay_ms (20);

lcd_gotoxy (1, 1) ;

printf (lcd_putc, "E1=%4ld" " E2=%4ld", C1, C2); // Se escribe el valor

//inicial del Encoder 1 y 2

lcd_gotoxy (1, 2) ;

printf (lcd_putc, "E3=%4ld" " T=%4ld", C3, A1); // Se escribe el valor

//inicial del Encoder 3

FOR (;;)

//Encoder 1

set_adc_channel (0); //Habilitar channel 0 analogico

delay_us (20);

C1 = read_adc (); //Lectura channel 0 analogico proporcional al


//A1 = C1 / 1023 * 1000; //periodo del pwm proporcional al

//valor analogico del potenciometro

//1023 por que es el valor maximo, de

//0 - 1023, osea 1024 bits

//DutyCicle Proporcional exacto =

// (read_adc / resolucionadc * ccprxl:ccpxcon5:4

p1 = ( 5 * C1 / 1024.0); //Conversin a tensin, Por si quisiera mostrar

//el voltaje

lcd_gotoxy (1, 1) ;

printf (lcd_putc, "E1=%4ld" " E2=%4ld", C1, C2);

delay_ms (100);

//Encoder 2

set_adc_channel (1); //Habilitar channel 0 analogico

delay_us (20);

C2 = read_adc (); //Lectura channel 1 analogico

p2 = ( 5 * C2 / 1024.0); //Conversin a tensin, Por si quisiera mostrar

//el voltaje

lcd_gotoxy (1, 1) ;

printf (lcd_putc, "E1=%4ld" " E2=%4ld", C1, C2);

delay_ms (100);

//Encoder 3

set_adc_channel (3); //Habilitar channel 0 analogico

delay_us (20);
C3 = read_adc (); //Lectura channel 3 analogico

p3 = ( 5 * C3 / 1024.0); //Conversin a tensin, Por si quisiera mostrar

//el voltaje

lcd_gotoxy (1, 2) ;

printf (lcd_putc, "E3=%4ld" " T=%4ld", C3, A1);

delay_ms (100);

//**********PWM1 y PWM2 en CCP1 y CCP2 con Giro**********

if ( (C1<=522) && (C1>=502) )

{set_pwm1_duty (0) ;

set_pwm2_duty (0) ;

A1 = 0;

lcd_gotoxy (1, 2) ;

printf (lcd_putc, "E3=%4ld" " T=%4ld", C3, A1);

delay_ms (100);}

else if (C1<502)

{dif1 =502-C1;

div1 = dif1/1023;

mult1 = div1*1000;

sum1 = mult1+10;

mult11 = sum1*2;

A1 = mult11;
set_pwm1_duty (A1);

set_pwm2_duty (0) ;

lcd_gotoxy (1, 2) ;

printf (lcd_putc, "E3=%4ld" " T=%4ld", C3, A1);

delay_ms (100);}

else if (C1>522)

{dif2 =C1-522;

div2 = dif2/1023;

mult2 = div2*1000;

sum2 = mult2+10;

mult21 = sum2*2;

A1 = mult21;

set_pwm1_duty (0);

set_pwm2_duty (A1) ;

lcd_gotoxy (1, 2) ;

printf (lcd_putc, "E3=%4ld" " T=%4ld", C3, A1);

delay_ms (100);}

}//Main

/*****************************************************************************/
/************************FUNCIONES********************************************
/

/* VOID girarmotorcw ()

MOTORCW = 1;

MOTORCC = 0;

*/

/*****************************************************************************/

You might also like