Error implementing PID to a LFR

Thread Starter

Santosh_16k

Joined Aug 19, 2011
19
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
}
 
Top