第六章 结论
本设计自参赛以来经过查找资料,设计机构,组装车模,分析问题,编写程序阶段工作,直到系统成型,一共经过了五个月的时间,其间尝试了两路电感控制,四路电感做差控制;六点感“二”字排法等算法,最后我们选择了六路传感器作为最终的方案,能车控制系统的设计中所完成的工作如下:
(1)研究了传感器的排布对控制策略的影响,提出了合适的传感器排布方式,提高了寻线的准确性。
(2)并在实验的基础上证明了在本系统中电机可以近似为一阶系统,并由此完成了电机PID算法。
(3)在机构结构上进行了大量的理论分析及改进,并在此基础上完成了刹车制动算法。
由于水平有限,并且时间不足,有许多技术与算法都没有深入的研究,需要在以后继续研究中不断的完善,总结如下:
(1) 电机的PID并不能将电机的加速性能很好的表现出来。 (2) 电路的可靠性,抗高频电磁干扰的性能有待提高。 (3) 对路况信息的处理还有待提高,特别是有用信息的提取。
附页:
#include
#include \#include
#include
#pragma LINK_INFO DERIVATIVE \
#define Led5 PORTE_PE5 #define Led6 PORTE_PE6 #define KEY PORTB_PB3
#define Led_left PORTB_PB5 #define Led_right PORTB_PB7
uchar n,r=0,z,flag,Flag=0; uchar count=0;
static unsigned int waittime = 0;
uchar FB=90,SH=45,SH1=45,V1=90,V2=90, V3=85,V4=150,V5=90,V6=90;
unsigned int AD_1; //AD 转换结果 unsigned int AD_2; //AD 转换结果 unsigned int AD_3; //AD 转换结果 unsigned int AD_4; //AD 转换结果 unsigned int AD_5; //AD 转换结果 unsigned int AD_6; //AD 转换结果
signed int Speed,x1,x2,y,x11,x22; //速度转换值 unsigned int time,numm,m;
unsigned int numm_last0,numm_last1,numm_last2, num_last0,num_last1,num_last2;
//-------------延时子程序--------------// void delay(unsigned int xms) {
int a,b,c;
for(c=0;c for(a=0;a<=50;a++) { for(b=0;b<=200;b++); } } } ///////////////////////////////////// //// 电机 PID 定义 ///////////////////////////////////// //int SetPoint=0; //设定目标 Desired Value int FeedBack=0; float KKp=0.5; //比例常数 Proportional Const float KKi=0; float KKd=0.6; //微分常数 Derivative Const signed int EE0=0; //当前误差 signed int EE1=0; //Error[-1] signed int EE2=0; //Error[-2] signed int EError0=0,EError1=0; signed int iiIncpid=0; int sp=0; int pp; /////////////////////////////// /// PID 定义 ////////////////////////////// float Kp=4.5; //比例常数 Proportional Const 5.2 float Ki=1.5; float Kd=3.5; //微分常数 Derivative Const signed int E0=0 ; //当前误差 signed int E1=0; //Error[-1] signed int E2=0; //Error[-2] signed int Error0=0,Error1=0; signed int iIncpid=0; ///////////////////////////////////// ///////////////////////////////////// //// 电机 PID ///////////////////////////////////// //////////////////////////////////// unsigned int Motor_PID(int cch1,int cch2 ) { //cch2=cch2/3; EE0=cch1-cch2; //增量计算 EError0=EE0-EE1; EError1=EE1-EE2; iiIncpid=(int)(KKi*EError0+KKp*EE0+KKd*(EError0-EError1)); EE1=EE0; EE2=EE1; //存储误差,用于下次计算 sp+=iiIncpid; if(sp>90) sp=90; if(sp<10) sp=10; return sp; } ////////////////////////// //////////速度/////////// ///////////////////////// void Sudu(int SetPoint) { pp=Motor_PID(SetPoint,FeedBack); PWMDTY1=pp; } /////////////////////////////// ///////舵机 PID /////////////// /////////////////////////////// int Steer_PID(signed int ch1 ,signed int ch2 ) { E0=ch1-ch2; //增量计算 Error0=E0-E1; Error1=E1-E2; iIncpid=(int)(Ki*Error0+Kp*E0+Kd*(Error0-Error1)); E1=E0; E2=E1; //存储误差,用于下次计算 return iIncpid; } ////////////////////////////// //////////刹车//////////////// //////////////////////////// void shacheV(int sh_v) { PWME_PWME0=1; PWME_PWME1=0; PWMDTY0=sh_v; while(FeedBack>FB); PWME_PWME0=0; PWME_PWME1=1; flag=0; Led_right=1; Led_left=1; } /////////////////////////// /////////按键检测/////////// //////////////////////////// void KEY_SCAN(void) { if(KEY==0) { delay(10); if(KEY==0) { while(!KEY); z++; if(z==1) { FB=85; SH=45; SH1=45; V1=80; V2=80; V3=80; V4=150; V5=90; V6=80; Led_left=0; Led_right=1; delay(500);