就是比较简单的循迹小车,可以循黑线的那种,因为在学PID,所以给它加了个PD控制,不过效果不太好这是实现PID控制的主要代码
- #include"PID.h"
- #include"Trace.h"
- extern int flag;
- int RK=6; //固定基准,不能变得
- int KP=4; //比例调节参数
- int out; //最后输出结果
- //int out0=40; //初始偏移分量
- int Td=7; //微分时间常数
- int Ti=1; //积分时间常数
- int T =1; //采样周期
- int Sk; //积分,微分
- int Dk;
- int Ek[]={0,0,0,0,0};
- /*================================================================
- 将flag的值与RK=5相减,当右边的红外对管检测到黑线时
- ,即flag为7 8 9 10 11 12时小车发生了左偏,增加左轮转速,减小右轮
- 将flag的值与RK=5相减,当左边的红外对管检测到黑线时
- ,即flag为5 4 3 2 1 0 时小车发生了右偏,增加右轮转速,减小左轮
- //================================================================*/
- void PID (int flag)
- {
- Ek[4]=Ek[3];
- Ek[3]=Ek[2];
- Ek[2]=Ek[1];
- Ek[1]=Ek[0];
- Ek[0]=RK-flag;
- //Sk = (T/Ti)*(Ek[0]+Ek[1]+Ek[2]+Ek[3]+Ek[4]);
- Dk = (Td/T)*(Ek[0]-Ek[1]);
- out = KP*Ek[0]+Sk+Dk;
- turn(25+out,25-out);
-
-
-
- }
-
复制代码
extern int flag;
int RK=6;
int KP=4;
int out;
//int out0=40;
int Td=7;
int Ti=1;
int T =1;
int Sk;
int Dk;
int Ek[]={0,0,0,0,0};
void PID (int flag)
{
Ek[4]=Ek[3];
Ek[3]=Ek[2];
Ek[2]=Ek[1];
Ek[1]=Ek[0];
Ek[0]=RK-flag;
//Sk = (T/Ti)*(Ek[0]+Ek[1]+Ek[2]+Ek[3]+Ek[4]);
Dk = (Td/T)*(Ek[0]-Ek[1]);
out = KP*Ek[0]+Sk+Dk;
turn(25+out,25-out);
}
void xunji (void)
{
if(count ==200)//采样周期
{
if(input==0x77)//0111 0 111
flag=6;
else if(input==0x7b)//0111 0 01
flag=7;
else if(input==0x7b)//0111 1 011
flag=8;
else if(input==0x75)//0111 1 001
flag=9;
else if(input==0x7d)//0111 1 101
flag=10;
else if(input==0x7c)//0111 1 100
flag=11;
else if(input==0x7e)//0111 1 110
flag=12;
else if(input==0x6d)//0110 0 111
flag=5;
else if(input==0x6f)//0110 1 111
flag=4;
else if(input==0x4f)//0100 1 111
flag=3;
else if(input==0x5f)//0101 1 111
flag=2;
else if(input==0x1f)//0001 1 111
flag=1;
else if(input==0x10)//0011 1 111
flag=0;
count=0;
}
PID (flag);
}
全部资料51hei下载地址:
循迹小车PID算法.rar
(42.84 KB, 下载次数: 133)
|