I was trying to use PID control in my Line Following Robot but the robot is not following the line as it should. I have used an array of 7 sensors and motors of 12V,2A.The micro controller used is ATmega128. Please tell me where have I gone wrong in the code.The code contains only the proportional part of PID.
Rich (BB code):
#include<avr/io.h>
#include<util/delay.h>
#include<avr/interrupt.h>
#define FREQ 11592000
#define prescaler 1
void t0_pwm_init(void);
void t2_pwm_init(void);
int OCR_value=0;
int node=0;
void motorl(int k)
{
int duty_cycle;
duty_cycle = k;
OCR0=(uint8_t)((duty_cycle*256)/100);
_delay_ms(1000);
}
void motorr(int k)
{
int duty_cycle;
duty_cycle = k;
OCR2=(uint8_t)((duty_cycle*256)/100);
_delay_ms(1000);
}
int PID()
{
int error=0;
int prior=6;
if(bit_is_set(PIND,PD0))
{
prior=12;
}
if(bit_is_set(PIND,PD1))
{
prior=10;
}
if(bit_is_set(PIND,PD1)&&bit_is_set(PIND,PD0))
{
prior=11;
}
if(bit_is_set(PIND,PD2))
{
prior=8;
}
if(bit_is_set(PIND,PD1)&&bit_is_set(PIND,PD2))
{
prior=9;
}
if(bit_is_set(PIND,PD3))
{
prior=6;
}
if(bit_is_set(PIND,PD3)&&bit_is_set(PIND,PD2))
{
prior=7;
}
if(bit_is_set(PIND,PD4))
{
prior=4;
}
if(bit_is_set(PIND,PD4)&&bit_is_set(PIND,PD3))
{
prior=5;
}
if(bit_is_set(PIND,PD5))
{
prior=2;
}
if(bit_is_set(PIND,PD5)&&bit_is_set(PIND,PD4))
{
prior=3;
}
if(bit_is_set(PIND,PD6))
{
prior=0;
}
if(bit_is_set(PIND,PD5)&&bit_is_set(PIND,PD6))
{
prior=1;
}
error=6-prior;
int correction=4*error;
return correction;
}
int main()
{
t0_pwm_init();
t2_pwm_init();
DDRD=0x00;
DDRC=0xFF;
int t=0;
int correction=0;
sei();
while(1)
{
correction=PID();
t=25-correction;
motorr(t);
t=25+correction;
motorl(t);
}
return 0;
}
void t0_pwm_init()
{
TCCR0=(1<<WGM00)|(2<<COM00)|(1<<CS00);
DDRB|=(1<<PB4); // selcetOC0 as output pin
}
void t2_pwm_init()
{
TCCR2=(1<<WGM20)|(2<<COM20)|(1<<CS20);
DDRB|=(1<<PB7); // selcetOC2 as output pin
}