PID算法 单片机 智能车 新手求救啊~~

Aewil 2011-10-18 07:02:15
这个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;

}





...全文
265 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Aewil 2014-04-03
  • 打赏
  • 举报
回复
现在在来补一下刀。。。程序中的turn_angle也不行,不能是固定的常数,应该是目前角度的偏移,例如要: turn_angle=turn_angle+x; 其中x是针对路径检测到的一个车头角度偏移量。
Aewil 2011-10-21
  • 打赏
  • 举报
回复
我发现问题了,就定义了I两次
sbit I=P2^4;
后来PID中积分系数有定义为I
所以PID中的I不行
的确需要好好整理
  • 打赏
  • 举报
回复
是飞思卡尔智能车吗???
我做过 PID也调试过~~~看了你的代码,需要好好整理啊
Aewil 2011-10-18
  • 打赏
  • 举报
回复
我试过只用P,但是车转得太厉害啦。。。我想用PID让它优化一下
I有什么错的地方吗?我发现不了啊~~~~
求救各位~~~
Linux_lee 2011-10-18
  • 打赏
  • 举报
回复
只用P就可以达到很好的效果,多调试下把

27,383

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧