小车循迹控制程序设计.docx
《小车循迹控制程序设计.docx》由会员分享,可在线阅读,更多相关《小车循迹控制程序设计.docx(16页珍藏版)》请在冰豆网上搜索。
![小车循迹控制程序设计.docx](https://file1.bdocx.com/fileroot1/2022-12/16/8a38c298-5451-4899-bc34-1f8e82bb03f1/8a38c298-5451-4899-bc34-1f8e82bb03f11.gif)
小车循迹控制程序设计
武汉理工大学华夏学院
课外自主实验分析报告
实验名称小车循迹控制程序设计
专业软件工程
班级
学号
姓名
课外实验设计计划
学生姓名:
万志雄专业班级:
软件1111
实验题目:
小车循迹控制系统设计(路线3)
实验器材:
1、硬件设备:
MCS-51单片机最小系统板、四个QTI传感器、两个舵机、
两个车轮、锂电池、ISP下载线、面包板;
2、软件环境:
KeilC51、progisp下载器。
实验任务:
(在规定的时间内完成下列任务)
1.完成硬件设计并连线,以MCS-51单片机为控制核心,根据4个QTI传感器采集到的数据控制舵机的运转,进而控制车轮的速度和方向,并画出硬件原理图和实验连线图;
2.用C语言编程实现以下小车行驶线路(地图见下页):
起始点→中心点→D点,旋转360度→黑色点,旋转180度→原路返回。
时间安排:
各时间段的任务可以交替进行
时间
设计内容
第一天
设计题目,实物演示、规划任务、查找相关资料
第二天
进行需求分析,完成总体设计
第三天
硬件详细设计,连接实验电路,软件详细设计,编写程序;
第四天
调试程序、测试系统、总结;
第五天
总结后完成设计报告。
指导教师签名:
2014年6月30日
教研室主任(或责任教师)签名:
2014年6月30日
起始点
第1章实验分析
1.1实验设计题目
小车循迹控制系统设计(路线3)
1.2实验设计任务及要求
1.2.1实验总体任务
(1)硬件部分:
完成硬件设计并连线,以MCS-51单片机为控制核心,随时采集4个QTI传感器的数据控制舵机的运转,进而控制车轮的速度和方向。
(2)软件部分:
用C语言编程实现小车行驶线路:
起始点→中心点→D点(旋转360度)→黑色点→然后旋转180度→原路返回。
1.2.2任务
使用KeilC51编程软件采用C语言编程实现小车路线3的总体调试,同时不断修正小车的路线。
1.2.3实验设计要求
完成硬件原理图设计、小车模型构建、软件编程、调试、运行等一整套工作任务。
控制软件使用C语言编程;系统联调,提交一个满足要求的小车循迹控制系统设计。
1.3软硬件运行环境及开发工具
以MCS-51单片机为控制核心,根据4个QTI传感器采集的数据控制舵机的运转,Windowsxp操作系统PC机一台。
KeilC51编程软件、progisp下载器、串口调试小助手等软件。
第2章概要设计
2.1小车软硬件设计原理
2.1.1小车硬件设计原理
小车前面有4个qti感应器来随时采集数据,当探测为黑线的时候,返回值为1,当探测为白线的时候,返回值是0,只有当中间那个qti返回值全为1的时候,才走在黑线上,根据返回的状态来控制小车舵机的速度。
2.1.2小车软件设计原理
将整个过程分为五部分来实现,分别为起点到中心点,中心点到D点,D点到黑色点,黑色点到中心点,中心点到起始点。
在运动过程中还需设计旋转45度和180度和360度的旋转子模块,当小车偏离轨迹候后,需设计修正子模块。
2.2功能设计原理及实现方法
2.2.1小车前进功能实现
此模块原理是向伺服电机输出若干个PWM波,波形的占空比可控制小车移动,通过
时间宽度和延时产生信号,作用于电机,从而控制其运动。
在本次设计中,向伺服电机PWM波过程已经被模块化在头文件中,即motion()函数中,通过对motion()函数的三个参数进行设置来实现控制电机转动从而控制小车前进。
motor_motion(uint16_tleft_val,uint16_tright_val,uint8_tcount)例:
其中参数left_val:
左边电机的高电平时间宽度;
right_val:
右边电机的高电平时间宽度;count:
脉冲数目
2.2.2小车旋转功能实现
小车旋转的原理是调整两轮的移动方式、速度及移动步数。
当需旋转360度时,将
左轮设置为快速后退状态,右轮为快速前进状态,多次调试测出旋转所需的步数.
2.2.3小车偏移修正功能设计
小车偏移修正功能即对小车传感器信号状态进行检测并作出相应的处理的过程,在修正过程中偏移情况及其代码和信号状态如下:
voidmodify(){
if((P22_state()&&(!
P23_state()))||(P21_state()&&(!
P22_state())&&(!
P23_state())&&(!
P24_state())))
{
motor_motion(1470,1700,1);//左转修正
}else
if(((!
P22_state())&&P23_state())||((!
P21_state())&&(!
P22_state())&&(!
P23_state())&&P24_state()))
{
motor_motion(1300,1550,1);//右转修正
}
else{
motor_motion(1700,1300,1);
}
}
(1)当小车发生右偏移时,各传感器状态信号如下:
0
通过判断语句:
if((P22_state()&&(!
P23_state()))||(P21_state()&&(!
P22_state())&&(!
P23_state())&&(!
P24_state())))判断小车是否向左偏移,若发生偏移此时通过调节左右轮的速度来实现,左偏时调用motor_motion(1770,1740,1)实现左轮前进速度大于右轮前进速度来实现向右偏移来对偏移进行修正。
(2)当小车发生右偏移时,各传感器状态信号如下:
0
通过判断语句:
if(((!
P22_state())&&P23_state())||((!
P21_state())&&(!
P22_state())&&(!
P23_state())&&P24_state()))判断小车是否向右偏移。
若发生偏移,此时通过调节坐游轮的速度来实现,右偏时调用motor_motion(1550,1300,1),通过调节左右轮的速度,当右轮速度大于左轮速度进行修正。
2.3.1编程头文件
(1)各个头文件如下图
图2.1
(2)delay.h头文件实现延时功能,帮助系统更加理性化,易于操作。
例如小车开始部分延时3秒。
delay.h头文件详细代码如下:
voiddelay_nus(unsignedinti)
{
i=i/10;
while(--i);
}voiddelay_nms(unsignedintn)
{
n=n+1;
while(--n)
delay_nus(900);//进行时间补偿
}
(3)qti.h头文件其作用是获取4个QTI传感器采集的信号。
为51单片机提供判断的输入数据。
qti.h头文件P21口实例详细代码如下:
/*
函数名称:
P21_state()
功能:
获得左边第一个QTI的返回信号
参数:
无参数
返回值:
1:
高电平,看到黑线;0:
低电平,看到白线
*/
intP21_state()
{
return(P2&0x02)?
1:
0;
}
(4)global.h头文件其作用是定义用到的数据类型、变量。
方便程序设计,简化程序结构。
详细代码如下:
#ifndefGLOBAL_H
#defineGLOBAL_H
typedefunsignedintuint16_t;
typedefunsignedcharuint8_t;
typedefunsignedcharbool;
#definetrue1
#definefalse0
#endif
(5)motion.h头文件其作用是控制两个舵机运转。
详细代码如下:
#include"Global.h"
sbitleft_motor=P1^0;//左电机接口
sbitright_motor=P1^1;//右电机接口
#defineLEFT_FWD1700//高电平时间定义,单位微秒
#defineLEFT_BWD1300
#defineLEFT_SMALL_FWD1530
#defineLEFT_SMALL_BWD1450
#defineRIGHT_FWD1300
#defineRIGHT_BWD1700
#defineRIGHT_SMALL_FWD1450
#defineRIGHT_SMALL_BWD1530
函数名称:
motor_motion(uint16_tleft_val,uint16_tright_val,uint8_tcount)
作用:
向伺服电机输出若干个PWM波,波形的占空比可控制
参数:
left_val:
左边电机的高电平时间宽度;right_val:
右边电机的高电平时间宽度;count:
脉冲数目
返回值:
无返回值
voidmotor_motion(uint16_tleft_val,uint16_tright_val,uint8_tcount)
{
uint8_ti;
for(i=0;i{
left_motor=1;
delay_nus(left_val);
left_motor=0
right_motor=1;
delay_nus(right_val);
right_motor=0;
delay_nms(20);//输出一定数量的PWM波形
}
}
第3章详细设计
3.1硬件设计与实现
小车是由多个硬件零件组装而成,每个零件负责不同的功能,根据设计任务和要实现的主要功能,来进行硬件设计。
硬件设计原理图如下:
图3.1总体电路图
图3.3灰度QTI传感器
3.2系统主程序流程
小本系统设计了五个个模块,分别为起点到中心点路线模块、中心点到D点、D点黑色点、黑色点到中心点、中心点返回到起始点路线模块。
通过对每个功能模块的调用实现系统要求的功能。
3.3功能模块详细设计
3.3.1起始点到中心点路线模块设计
起点到中心点,主要是从开始就前进,在前进过程中不停检测传感器传过来的信号,通
过判断小车是否偏离路线后决定是否修正。
程序代码如下while
(1){
motor_motion(1700,1300,1);
modify();
if(P22_state()&&P23_state()&&P21_state()&&!
P24_state()){
//motor_motion(1500,1500,0);//中心点停
motor_motion(1500,1300,18);//右转45度
break;
}
}
3.3.2中心点到D点路线模块设计
中心点到B点,主要是从开始就前进,在前进过程中不停检测传感器传过来的信号,通
过判断小车是否偏离路线后决定是否修正。
如果检测到0000信号,则执行旋转360度程序。
设计函数centerToD()来实现此模块功能。
程序代码如下:
while
(1){
motor_motion(1700,1300,1);
modify();
if(!
P21_state()&&!
P22_state()&&!
P23_state()&&!
P24_state()){
//motor_motion(1500,1500,0);//D点停
motor_motion(1300,1300,150);//转360度
break;
}
}
程序流程图如下:
是
退出循环
图3.3中心点到D点模块流程图
3.3.3D点到黑色点路线模块设计
D点到黑色点前进过程中也要进行检测修正,当遇到1111信号时,执行旋转180度,其代码为:
while
(1){
motor_motion(1700,1300,1);
modify();
if(P21_state()&&P22_state()&&P23_state()&&P24_state()){
motor_motion(1300,1300,75);//转180度
break;
}
}
程序流程图如下:
是
退出循环
图3.4D点到黑点模块流程图
3.3.4白色点到中心点模块设计
白色点到中心点循迹过程中,不断地通过传感器检测信号,进行路线修正。
当第一次检测到1111信号时,这表示已经到达中心点。
采用的函数和刚开始去中心点的一样,模块程序代码如下:
while
(1){
motor_motion(1700,1300,1);
modify();
if(P21_state()&&P22_state()&&P23_state()&&P24_state()){
//motor_motion(1500,1500,0);//回到中心点停
motor_motion(1700,1500,18);//向左转45度
break;
}
}
程序流程图如下:
是
退出循环
图3.5黑点到中心点模块流程图
3.3.5中心点到起始点路线模块设计
while
(1){
motor_motion(1700,1300,1);
modify();
if(P21_state()&&P22_state()&&P23_state()&&P24_state()){
motor_motion(1500,1500,0);//回到起始点
break;
}
}
程序流程图如下:
是
退出循环
图3.6中心点到D点出发点模块流程图
第4章系统调试与操作说明
4.1系统调试
4.1.1直线调试
主要是判断小车是否能沿着黑线向前走,方法:
让程序只有函数modify(),main()函数中只有motor_motion(1700,1300,1)这条语句;并烧写到小车中,把小车放在一条黑线上,看它是否能一直在黑线上前进,若不能,再qti是否连接正确,直至小车能一直走在直线上。
4.1.2达到黑色终点点调试
主要判断小车能否到黑色终点,并原地旋转180度,方法:
将自己模块程序烧写到小车中,放在黑点上面,观察小车能否到黑色终点旋转前进到中心点并并原地旋转180度,注意看其角度是否正常。
4.2调试中遇到的问题
调试的时候,是在黑色终点处的时候,旋转度数不足。
多次调试后为motor_motion(1300,1300,75)。
4.3操作说明
在KeilC51中写好的程序进行编译生成.hex文件,然后通过ISP下载线和progisp软件将已生成的.hex文件烧写到单片机中。
当烧写成功后,拔掉下载线,然后在已设定好的路径上,摆正小车的位置,打开小车上的开关。
观察小车是否按照预定的路径进行行驶。
第5章总结和体会
整个过程中,从需求分析到设计、编码、测试,我都力求规范化和文档化,努力让自己以前学的知识运用到本系统的开发中,尽量保证整个系统的开发进度和质量,顺利完成这次的课程设计。
不过,在实验过程中,好多知识都是随学随用,就增加了很多不必要的麻烦。
虽说这些都会消耗系统开发的时间,但在同学以及自己的不断努力下,不怕麻烦,不怕重复,当克服了这些问题之后,我会感觉到自己的知识在一点一滴地积累,不知不觉中增加。
我相信,只要肯钻研,只要挤时间,一切自己想要的知识都可以掌握。
通过本次课程设计,我对小车循迹系统经典问题有了进一步的了解,尤其是在软件与硬件的结合方面有了新的认识。
在这次课程设计中,由于没有掌握好进程同步中的一些关键知识,导致在实际操作中遇到了很多问题,比如说对单片机借口的不熟悉。
此次课程设计使我明白,在程序设计中,我们需要有一个清晰的整体结构,然后针对每个模块逐步实现其功能,在设计中也需要有严谨和认真的态度,才会更好的完成一项任务。
第6章参考文献
[1]尹志宇、郭晴,单片机入门,北京:
清华大学出版社,2011.07
[2]黄维通、王晓英,万能的51单片机,北京:
清华大学出版社,2011.01
[3]庞娅娟、房大伟51单片机简明教程,北京:
人民邮电出版社,2009.10
[4]王小科、王军、赵会东,单片机开发案例全程实录(第二版),北京:
清华大学出版社2011.01
附录:
#include"reg52.h"
#include"delay.h"
#include"qti.h"
#include"motion.h"
#include"Global.h"
voidmodify(){
if((P22_state()&&(!
P23_state()))||(P21_state()&&(!
P22_state())&&(!
P23_state())&&(!
P24_state())))
{
motor_motion(1470,1700,1);//左转修正
}else
if(((!
P22_state())&&P23_state())||((!
P21_state())&&(!
P22_state())&&(!
P23_state())&&P24_state()))
{
motor_motion(1300,1550,1);//右转修正
}
else{
motor_motion(1700,1300,1);
}
}
voidmain(void){
while
(1){
motor_motion(1700,1300,1);
modify();
if(P22_state()&&P23_state()&&P21_state()&&!
P24_state()){
motor_motion(1500,1300,18);//右转45度
break;
}
}
while
(1){
motor_motion(1700,1300,1);
modify();
if(!
P21_state()&&!
P22_state()&&!
P23_state()&&!
P24_state()){
motor_motion(1300,1300,150);//转360度
break;
}
}
while
(1){
motor_motion(1700,1300,1);
modify();
if(P21_state()&&P22_state()&&P23_state()&&P24_state()){
motor_motion(1300,1300,75);//转180度
break;
}
}
while
(1){
motor_motion(1700,1300,1);
modify();
if(P21_state()&&P22_state()&&P23_state()&&P24_state()){
motor_motion(1700,1500,18);//向左转45度
break;
}
}
while
(1){
motor_motion(1700,1300,1);
modify();
if(P21_state()&&P22_state()&&P23_state()&&P24_state()){
motor_motion(1500,1500,0);//回到起始点
break;
}
}
}
照片:
设计者:
万志雄
日期:
2014年6月5日