智能小车运动控制、 系统概述1、系统外形2、系统任务及指标通过红外传感器避开障碍物,完成巡墙行走要求中间不能人工改变小车的方位,且不 能触碰到障碍物,最后按完成时间、碰到障碍物的次数及完成的难度等级来给出成绩3、硬件安装 两个红外检测器、电阻若干、导线若干、小车本体、主控芯片、4 节 5号电池4、任务要求及步骤用 C 语言运用适当的控制算法对智能小车进行控制,用 C 语言软件设计出能完成避障 行走的C语言程序组装小车,调试并用USB串口下载程序,使小车通过红外传感器避开 障碍物,完成巡墙行走二、 程序设计1、设计思路本车运用红外线(IR)发射和接收器件探测道路当IR检测器没有检测到物体时,输 出为高电平;检测到物体时,输出为低电平因为左边红外接收连接到Pl_2,右边红外接 收连接到P3_5,左边红外发射连接到P1_3,右边红外红外发射连接到P3_6所以用命令 {#define LeftIR P1_2}以实现用LeftIR代替P1_2,以此类推本程序包括检测左右距离, 向前走,左、右转等功能需要用 delay_nus 或者 delay_nms 延时命令以确保小车运动的精 确性设定小车与墙壁保持设定距离SetPoint=1。
选定两个灵敏度不同的频率,要求小车发 射这两种不同频率的红外线,当只有其中一个频率检测到墙壁时,说明小车距离墙壁的距离 等于设定值,即Sidedistance=SetPoint,小车保持方向继续前行并检测;当两个频率都检测 到墙壁时,即小车与墙壁的距离小于我们的设定值,即SidedistancevSetPoint,此时要求小车 右转前行,背离墙壁方向并检测距离;当小车发射的两个频率都检测不到墙壁时,说明此时 小车与墙壁的距离大于我们的设定值,即Sidedistance>SetPoint,此时要求小车左转前行, 靠近墙壁方向并检测距离这样就实现了小车判断直线、左转和右转的运动2、设计流程图3、程序及说明 #include #include #include#define LeftIRP1_2 //左边红外接收连接到 P1_2#define SideIR P3_5#define LeftLaunch P1_3#define SideLaunch P3_6//右边红外接收连接到 P3_5//左边红外发射连接到 P1_3//右边红外发射连接到 P3_6#define SetPoint 1unsigned int time; int Sidedistance; int leftdistance; int irDetectLeft; int irDetectSide; int delayCount;//侧边的距离//左边的距离int m; int a,b,c;unsigned int frequency1[4]={5000,7000};unsigned int frequency[2]={4500,5000};void timer_init(void){IE=0x82;TMOD |= 0X01;//开总中断EA ,允许定时器0中断ETO//定时器0工作在模式1:16位定时器模式}void FreqOut(unsigned int Freq){time = 256 - (500000/Freq);TH0 = 0XFF;TL0 = time;TR0 = 1;delay_nus(800);TR0 = 0;//根据频率计算初值//高八位设 FF //低八位根据公式计算//启动定时器//延时//停止定时器}void Timer0_Interrupt(void) interrupt 1{LeftLaunch= ~LeftLaunch; //取反SideLaunch= ~SideLaunch;TH0 = 0XFF; //重新设值TL0 = time;void Get_lr_Distances(){unsigned int count; leftdistance=0;//初始化左边的距离for(count = 0;count<2;count++){FreqOut(frequency[count]);irDetectLeft = LeftIR; //左边接收if (irDetectLeft == 1)leftdistance++;}}void Get_lr_Distances1() {unsigned int count; int i,m; Sidedistance = 0;//初始化侧边的距离for(i=0;i<3;i++){for(count = 0;count<2;count++) {FreqOut(frequency1[count]); irDetectSide=SideIR; if(irDetectSide == 1) Sidedistance++;}if(i==0) a=Sidedistance;if(i==1) b=Sidedistance; else c=Sidedistance; if((a==b)||(a==c)||(b==c)) m=1;elsem=0;}}void Forward(void){int i;for( i=1;i<=26;i++){//侧边接收//向前行走子程序P1_1=1; delay_nus(1700); P1_1=0; P1_0=1; delay_nus(1300);P1_0=0; delay_nms(20);}}void Forward1(void){int i;for( i=1;i<=15;i++){ P1_1=1; delay_nus(1600);P1_1=0;P1_0=1; delay_nus(1400); P1_0=0; delay_nms(20);}}void Left_Turn(void){int i;for( i=1;i<=15;i++){P1_1=1;delay_nus(1450);P1_1=0;P1_0=1;delay_nus(1450);P1_0=0;delay_nms(20);}}void Left_Turn1(void){int i;for( i=1;i<=10;i++){P1_1=1;delay_nus(1450);//向前缓慢行走子程序//左转子程序//向左微转子程序P1_1=0;P1_0=1;delay_nus(1450);P1_0=0;delay_nms(20);}}void Right_Turn(void){int i;for( i=1;i<=15;i++){P1_1=1;delay_nus(1550);P1_1=0;P1_0=1;delay_nus(1550);P1_0=0;delay_nms(20);}}void Right_Turn1(void){int i;for( i=1;i<=10;i++){P1_1=1;delay_nus(1550);P1_1=0;P1_0=1;delay_nus(1550);P1_0=0;delay_nms(20);}}void Backward(void){int i;for( i=1;i<=8;i++){P1_1=1;delay_nus(1400);P1_1=0;P1_0=1;//右转子程序//向右微转子程序//向后行走子程序delay_nus(1600);P1_0=0;delay_nms(20);}}int main(void){uart_Init();timer_init();delay_nms(2000);while(1){ Get_lr_Distances1();Get_lr_Distances();if((a+b+c)<=4){ if(leftdistance>1) Forward();// if(leftdistance<=SetPoint) else{Left_Turn();Forward();} /*if(leftdistance<1) { Backward();Left_Turn(); Forward1();}*/} /*if((a+b+c)==0){ if(leftdistance>1)Left_Turn1();if(leftdistance==SetPoint) {Left_Turn();Forward();} if(leftdistance<1){ Backward(); Left_Turn(); Forward1();}} */if((a+b+c)>=5){ if(leftdistance>1){//Backward();Right_Turn1();Forward1();}if(leftdistance<=SetPoint){Left_Turn();Forward();}/*if(leftdistance<1){Backward();Left_Turn();Forward1();}*/}}}三、 心得体会此次小车智能控制课程设计,是自动化专业卓越工程师实验班特别开设的,历时三周。
在整个设计过程中,虽困难重重,但苦中有乐他不仅让我们更加熟练的掌握了 C 语言, 而且增加了我们的自学能力与实际动手的操作能力,更锻炼了我们的创新能力设计之初, 我们对他感觉很陌生,不知从哪里下手,随着每天在图书馆与网上的查找资料,我们逐渐了 解了时间转瞬已过,小车程序在我们的努力中逐渐成形,功能越来越完善,我们也由衷的 高兴以后,我坚信我们可以保持这种高效的学习动力与能力,完成我们心中的目标!四、 参考资料1、《自动控制原理》 胡寿松 北京:科学出版社2、 《反馈控制问题——使用MATLAB及其控制系统工具箱》[美]迪安・K •弗雷德里克 西安:西安交通大学出版社3、 《现代控制工程(第三版)》 [美] Katsu。