tak_iiec@yahoo.com
Newbie level 6
- Joined
- Feb 28, 2011
- Messages
- 11
- Helped
- 1
- Reputation
- 2
- Reaction score
- 1
- Trophy points
- 1,283
- Activity points
- 1,420
Dear All
I am making a project: Sun tracking
I am using pic16F877 and L298 and the code is in PIC Mikroc. I am stuck since many days as Motor is not running in proteus.
Kindly help how to set PWM duty cycle and how to control the speed. My complete code given below: Two LDRs are used to track the position of sun. i am giving CCP1 output to ENA pin of L298.
I dont know where the problem lies.
Plz help me out
//********************************************************************************
//POWER Window Motor Based Sun Tracker
// MCU: 16F877
// XTAL: 4MHz
// 2 LDR are used to track the position of sun
//*******************************************************************************
unsigned short current_duty;
unsigned int LDR1,LDR2;
int Error1, Error2;
void main() {
ADCON1 = 0x00;; // All analog pins AN0-AN7 are used set to analog and result id left justified.
ADCON0 = 11000111 ; // ANO
ADCON0 = 11001111 ; // AN1
TRISA = 0XFF;
TRISB = 0x00;
PORTB = 0x00;
TRISC = 0x00;
PORTC = 0x00;
CCP1CON=0b00001100; // CCP is used as PWM Mode
/*T2CON=0b00000111; // Timer2 is ON and Prescalar value is 16
PR2=255; // 0xFF : Timer prescalar value is 1, 4 or 16*/
PWM1_Init(5000);
PWM1_Start();
current_duty=25;
PWM1_Set_Duty(current_duty); // PWM Duty cycle (0-255(100%))
//*******************************************************************************
do{
start:
LDR1 = ADC_read(0); // ANO/RA0
LDR2 = ADC_read(1); // AN1/RA1
//Error = LDR1-LDR2 || LDR2-LDR1;
Error1 = LDR1-LDR2;
Error2 = LDR2-LDR1;
if((LDR1 && LDR2>=200) && (LDR1 && LDR2<=900)) {
if ((Error1 ||Error2) >=30) {
//if(LDR1<500 && LDR2>900) {
if(LDR2>LDR1) { //right brighter
PORTB.RB3 = 1;
PORTB.RB4 = 0;
Delay_ms(40);
current_duty=255;
PWM1_Set_Duty(current_duty);
Delay_ms(40);
}
//else if(LDR2<500 && LDR1>900) { // left brighter
if(LDR1>LDR2) {
PORTB.RB3 = 0;
PORTB.RB4 = 1;
Delay_ms(40);
current_duty=255;
PWM1_Set_Duty(current_duty);
}
}
else
PORTB.RB3 = 0;
PORTB.RB4 = 0;
delay_ms(2000);
}
} while(1);
}
I am making a project: Sun tracking
I am using pic16F877 and L298 and the code is in PIC Mikroc. I am stuck since many days as Motor is not running in proteus.
Kindly help how to set PWM duty cycle and how to control the speed. My complete code given below: Two LDRs are used to track the position of sun. i am giving CCP1 output to ENA pin of L298.
I dont know where the problem lies.
Plz help me out
//********************************************************************************
//POWER Window Motor Based Sun Tracker
// MCU: 16F877
// XTAL: 4MHz
// 2 LDR are used to track the position of sun
//*******************************************************************************
unsigned short current_duty;
unsigned int LDR1,LDR2;
int Error1, Error2;
void main() {
ADCON1 = 0x00;; // All analog pins AN0-AN7 are used set to analog and result id left justified.
ADCON0 = 11000111 ; // ANO
ADCON0 = 11001111 ; // AN1
TRISA = 0XFF;
TRISB = 0x00;
PORTB = 0x00;
TRISC = 0x00;
PORTC = 0x00;
CCP1CON=0b00001100; // CCP is used as PWM Mode
/*T2CON=0b00000111; // Timer2 is ON and Prescalar value is 16
PR2=255; // 0xFF : Timer prescalar value is 1, 4 or 16*/
PWM1_Init(5000);
PWM1_Start();
current_duty=25;
PWM1_Set_Duty(current_duty); // PWM Duty cycle (0-255(100%))
//*******************************************************************************
do{
start:
LDR1 = ADC_read(0); // ANO/RA0
LDR2 = ADC_read(1); // AN1/RA1
//Error = LDR1-LDR2 || LDR2-LDR1;
Error1 = LDR1-LDR2;
Error2 = LDR2-LDR1;
if((LDR1 && LDR2>=200) && (LDR1 && LDR2<=900)) {
if ((Error1 ||Error2) >=30) {
//if(LDR1<500 && LDR2>900) {
if(LDR2>LDR1) { //right brighter
PORTB.RB3 = 1;
PORTB.RB4 = 0;
Delay_ms(40);
current_duty=255;
PWM1_Set_Duty(current_duty);
Delay_ms(40);
}
//else if(LDR2<500 && LDR1>900) { // left brighter
if(LDR1>LDR2) {
PORTB.RB3 = 0;
PORTB.RB4 = 1;
Delay_ms(40);
current_duty=255;
PWM1_Set_Duty(current_duty);
}
}
else
PORTB.RB3 = 0;
PORTB.RB4 = 0;
delay_ms(2000);
}
} while(1);
}