这个P(比例系数)可以用,D(微分系数)也可以用,但是I(积分系数)用不了,一用就错……为什么啊???郁闷死我了。。。一用积分系数就要死命的往左偏,没用的话可以用传感器巡线走。PS:智能车里的程序,L1、2、3、4、R1、2、3、4、I表示车前面的9个传感器
#include"sst89c51rd2.h"
sbit L1=P2^0;
sbit L2=P2^1;
sbit L3=P2^2;
sbit L4=P2^3;
sbit I=P2^4;
sbit R4=P2^5;
sbit R3=P2^6;
sbit R2=P2^7;
sbit R1=P0^0;
sbit D_PWM=P1^5; //舵机脉冲输出
sbit M_PWM=P1^3; //电机
sbit S=P0^7; //光电开关
sbit IN1=P1^2; //l298n的IN1口
sbit IN2=P1^7; //l298n的IN2口 用来控制电机正反转及停止
int t=0,i=0;
unsigned int k;
int turn_angle=24; //舵机角度控制
#define cycle 400
void delay(int t)
{
int i,j;
for(i=0;i<t;i++)
for(j=0;j<t;j++); //还没用到程序中,看调试时,哪里需要再加
}
void set_speed(unsigned int k)
{
CCAP0L=k;
CCAP0H=k;
}
void line_following()
{
if(!L4&&!L3&&!L2&&!L1&&I&&R1&&!R2&&!R3&&!R4) //右偏1
{turn_angle=25;
set_speed(0xff);}
else if(!L4&&!L3&&!L2&&L1&&I&&!R1&&!R2&&!R3&&!R4) //左偏1
{turn_angle=23;
set_speed(0xff); }
else if(!L4&&!L3&&!L2&&L1&&!I&&!R1&&!R2&&!R3&&!R4 ) //左偏2
{turn_angle=21;
set_speed(0xff);}
else if(!L4&&!L3&&!L2&&!L1&&!I&&R1&&!R2&&!R3&&!R4) //右偏2
{turn_angle=27;
set_speed(0xff);}
else if(!L4&&!L3&&L2&&L1&&!I&&!R1&&!R2&&!R3&&!R4) //左偏3
{turn_angle=21;
set_speed(0xff);}
else if(!L4&&!L3&&!L2&&!L1&&!I&&R1&&R2&&!R3&&!R4) //右偏3
{turn_angle=27;
set_speed(0xff);}
else if(!L4&&!L3&&L2&&!L1&&!I&&!R1&&!R2&&!R3&&!R4) //左偏4
{ turn_angle=20;
set_speed(0xff);}
else if(!L4&&!L3&&!L2&&!L1&&!I&&!R1&&R2&&!R3&&!R4) //右偏4
{turn_angle=28;
set_speed(0xff);}
else if(!L4&&!L3&&L2&&!L1&&!I&&!R1&&!R2&&!R3&&!R4) //左偏5
{turn_angle=19;
set_speed(0xff);}
else if(!L4&&!L3&&!L2&&!L1&&!I&&!R1&&R2&&R3&&!R4) //右偏5
{turn_angle=29;
set_speed(0xff);}
else if(!L4&&L3&&!L2&&!L1&&!I&&!R1&&!R2&&!R3&&!R4) //左偏6
{turn_angle=18;
set_speed(0xff);}
else if(!L4&&!L3&&!L2&&!L1&&!I&&!R1&&!R2&&R3&&!R4) //右偏6
{ turn_angle=30;
set_speed(0xff); }
else if(L4&&L3&&!L2&&!L1&&!I&&!R1&&!R2&&!R3&&!R4) //左偏7
{turn_angle=16;
set_speed(0xff);}
else if(!L4&&!L3&&!L2&&!L1&&!I&&!R1&&!R2&&R3&&R4) //右偏7
{ turn_angle=32;
set_speed(0xff);}
else if(L4&&!L3&&!L2&&!L1&&!I&&!R1&&!R2&&!R3&&!R4) //左偏8
{turn_angle=16;
set_speed(0xff);}
else if(!L4&&!L3&&!L2&&!L1&&!I&&!R1&&!R2&&!R3&&R4)// 右偏8
{turn_angle=32;
set_speed(0xff);}
else if(L4&&L3&&L2&&L1&&I&&R1&&R2&&R3&&R4)// 交叉口直走(与车子在赛道方向跑的有关)
{ turn_angle=24;
set_speed(0xff); }
}
void main()
{
IN1=1;
IN2=0; //电机正转
CMOD=0x02;
CL=0x00;
CH=0x00;
CCAP0L=0xff;
CCAP0H=0xff;
CCAPM0=0x42;
EC=1;
CR=1;
TMOD=0x12;//00100010定时器工作方式设置:工作方式2:8位自动重装
TH0=0xd2;//寄存器装入初值,此值将自动重装入TL0
TL0=0xd2;//寄存器装入初值
EA=1;//全局中断允许位:开全局中断
ET0=1;//定时器0中断允许位:开定时器0中断
TR0=1;//定时器0运行控制位:TMOD中Gate=0时,TR0=1即可启动定时器1,用于申请中断
while(1)
{
if(!S)
{
delay(50);
if(!S)
{
IN1=0; //电机停转
IN2=0;
}
}
else
{
IN1=1;
IN2=0; //电机正转
line_following();
}
}
}
void T0timer() interrupt 1 //利用定时中断输出PWM波
{
i++;
if(i<turn_angle)
D_PWM=1;
else
{
D_PWM=0;
}
if(i==cycle)
i=0;
}