毕业设计基于单片机的运水机器人设计Word文档格式.docx
《毕业设计基于单片机的运水机器人设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《毕业设计基于单片机的运水机器人设计Word文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
附件三:
元器件清单16
摘要:
命题要求设计自动运水机器人。
本设计是以STC89C52单片机为核心器件,应用红外开关,直流电机等器件,实现命题要求。
经过测试,该机器人达到所有命题所要求的技术指标。
在此基础之上,本设计添加了计时模块,使设计更具实用性。
关键词:
运水;
电机驱动;
探测传感器
运水机器人
Ⅰ、设计任务与要求
本任务为F题:
运水机器人。
设计任务具体内容如下:
图1-1参考图
图1-2路线图
1.1基本设计任务
依据命题题意,本设计采用直流电机带轮式小车带实现机器人的运动。
机器人上面要装有盛水容器,以便完成在A-C之间的运水任务。
当红外光电开关探测到黑色边线的时候停止小车运动,小车停在A区是通过手动控制小车重新运动,小车停在C区通过软件延时控制小车重新运动,这样达到循环运动,进而完成运水任务。
1.2控制设计任务
由于本设计采用手动完成整个过程中的装水、卸水任务,因此控制任务即为控制A-C之间的距离。
这里通过红外光电开关扫描是否达到黑色边线,即为判断是否达到题目要求的2000mm(黑色边线即为图1-2中的起始/返回边线),通过与软件配合,以完成要求。
1.3软件设计任务
机器人的所有动作由都要由软件控制实现。
用软件对红外开关扫描所得信号进行对比,以控制直流电机的停止/正反转。
通过软件对按键的识别控制硬件启动。
用软件来控制时间显示模块的计数周期。
Ⅱ、方案设计与论证
本设计主要需要完成运水小车在A-C之间运水任务。
利用红外光电开关对由黑色电胶布制作的起始/返回边线进行探测,再通过软件的配合,对探测结果进行分析,并控制小车车轮的停止/正反转,让小车在A-C之间固定距离内行进。
通过单片机与软件的集合对时间显示模块进行控制,达到显示时间的任务。
2.1电源选择方案
方案一:
采用双电源供电,在设计中,将CPU电源和电机驱动电源完全靠光电耦合器隔离,这样电机启动时的冲击信号就不会对CPU有影响,增加了系统的可靠性。
缺点是电路设计复杂,电路成本较高。
设计要求较低,且此方案较为复杂、成本高,故放弃。
方案二:
采用单电源供电,电机的驱动和CPU逻辑控制电源采用同一个电源。
该方案设计简单,而且成本较低,缺点是电机启动的瞬间电流过大,容易对上一级电路产生冲击,电路的稳定性不好。
这个方案已经可以满足实验的要求了,采用此方案。
2.2驱动电路选择方案
采用三极管驱动电机,滤波效果好,在单片机跟电机共用一个电源,在电流较高的情况下,单片机仍能不受干扰而正常工作。
优点:
电路压降较小,所以在大电流的情况下,发热很小。
缺点:
电路连接较为复杂,驱动功率较小,不适于大功率驱动。
该驱动电路的功率不能满足要求,故放弃此方案。
使用专用芯片L298所组成的电机驱动电路。
驱动芯片L298是驱动步进电机的专用芯片,我们利用它内部的桥式电路来驱动直流电机。
控制比较简单,电路简单,集成芯片简化了电路的复杂性,驱动功率大。
电路发热较大,成本略高。
结合作品要求,采用此方案。
2.3距离控制方案
直接采用软件控制距离,即:
根据小车的平均速度设定相应前进/后退时间,达到控制前行/后退目的。
无需其他硬件支持,节约成本,制作简单。
不易自动控制,距离控制不精确,多次循环后会导致小车偏离预定路径。
考虑到设计要求的距离控制精度较高,放弃此方案。
采用光电传感器根据固定在地面上的两个边线的探测(如:
固定在地面的两条黑色胶带)进行探测,通过固定边线之间的距离来达到距离控制的距离的目的,进而达到要求。
增加成本,增加软件设计难度,制作较为困难。
距离控制精确,易于自动控制。
由于本设计对距离有较高的要求,故采用此方案。
Ⅲ、总体设计
经过对各个方案分析比较,最终确定总方案如图3-1所示。
该系统所有模块都由主单片机控制。
其中,设计各个模块,包括单片机、显示模块、电机驱动、光电探测由四节AA电池供电。
电机驱动采用L298驱动芯片控制。
用光电传感器对边线的探测来控制距离。
通过单片机的机器周期计算时间计数周期,以达到计时目的。
图3-1系统方案图
3.1系统硬件电路设计
3.1.1探测传感器
探测传感器采用CNY-70反射式光电开关。
红外线光电开关属于光电接近开关,它利用被测物体对红外光束的遮光或反射,对所有能反射光线的物体均可检测,根据检测方式的不同,分为漫反射式、镜反射式、对射式、槽式、光纤式光电开关等。
图3-2为CNY-70的输入输出特性曲线:
图3-2CNY70特性曲线
从图3-2可以看出,随着发光管电流逐渐增加,输出电流逐渐变大,因此我们选择输入电流为20mA。
CNY-70的发光管的导通压降大约为1.5V,输入电压选择5V,因此电阻我们选择200
。
图3-3探测传感器
通过电压比较器,将传感器的输出电压转换成逻辑电平,通过单片机判断探测是否有黑线,然后通过软件调整,使小车能够完成B区的动作。
由于CNY-70受自然光影响,因此在使用时比较器比较电压采用电位器调节,通过手动调节适应不同的光照环境。
3.1.2电机驱动模块
L298芯片是一种高电压、大电流、高功率驱动器,其设计是为接受标准TTL逻辑电平信号和驱动电感负载的,例如继电器、圆筒形线圈、直流电动机和步进电动机。
每桥的三级管的射极是连接在一起的,相应外接线端可用来连接外设传感电阻。
可安置另一输入电源,使逻辑能在低电压下工作。
L298芯片是具有15个引出脚的多瓦数直插式封装的集成芯片。
图3-4电机驱动模块
3.2系统软件设计
3.2.1软件计时的分析与计算
单片机内部定时器有4种工作模式,方式0是13位计数器,由于计时时间过短,中断频率高,所以不选用此模式;
方式2是自动重装式计数器,是8位计数器,同样中断频率过高;
方式3也是8位计数器;
方式1是16位计数器,综合考虑,选用方式1做精确计时。
由于51单片机是12分频,因此机器周期=晶振频率/12。
在该设计中,选用频率为12MHz的晶振,因此机器周期=1μs。
定时1s需要1000000个机器周期,因此通过20次定时器中断完成1s的定时,每次完成50000个周期的定时,因此每次给定时器的初值应该是TH0=B0H,TL0=3CH。
3.2.3系统软件流程图
注:
D为电机转动方向标记。
图3-5系统流程图
Ⅳ、测试结果及结果分析
4.1测试仪器及工具
测试仪器及工具:
100ml量筒两个,卷尺(两米以上)一把,黑色电胶布一卷,大号水桶两个,水量充足。
4.2测试步骤
4.2.1测试前预备工作
①、用卷尺在地面标出两米距离,并用黑色电胶布在两米的两端各粘贴一条纵边线。
②、将水桶装满水,置于A端,量筒也置于A端,空水桶置于另外C端。
③、根据测试场地光照条件,将小车的探测器调试到最佳状态。
4.2.2正式测试
①、将小车置于初试边线,即有水的水桶的一端,启动小车电源。
②、用量筒量取100ml水置于小车上的水杯里。
按下出发键,同时秒表开始计时。
小车从A端,经过B区域到C端停止。
③、小车在C端停止后,数码管显示卸水倒计时8S,此时,取下车上的水,倒入空桶内,并将水杯放回小车,8S结束后,小车返回,数码管显示小车前进时间与卸水时间(8S)之和,并在此基础上继续计时。
④、小车返回A端后,秒表停止计时。
⑤、循环②-③-④步骤若干次。
⑥、关闭电源,清空水杯中的水。
清理测试现场。
4.3测试结果如下表
项目
趟次
小车显示运行一个周期时间(S)
实际运行一个周期时间(S)
运水量(mL)
第一趟
14S
14.56S
100mL
第二趟
14.23S
第三趟
15S
15.19S
第四趟
14.86S
第五趟
14.35S
第六趟
14.66S
第七趟
14.85S
第八趟
14.88S
第九趟
15.26S
第十趟
14.79S
表4-1调试结果
4.4测试结果分析
通过对测试数据的分析,可以看出,小车已经实现了在A-B-C-B-A区域较为稳定的循环运水过程,即小车已经实现了题目所给出的所有要求。
另外,小车显示每周期时间与实际每周期所用时间误差小于1S,达到了额外添加计时模块的目的。
通过计算,可得出小车的平均速度为0.63m/s,单位时间运水量大约为7mL/s。
Ⅴ、创新点
5.1添加计时模块
在题目要求之外,本设计增加了周期计时装置,在此基础上,若通过进一步改进,可自动显示小车平均速度。
据此又可以在没有其他额外装置的情况下大概知道电池电量(事先测量好小车在不同电量情况下的速度,并画出不同电量对应不同速度的曲线图,用实测速度与此曲线图对比可知大概电量)。
另外,通过简单计算,还达到了计算单位时间运水量的目的。
5.2实用性
①、将该设计用于餐厅、酒吧等餐饮场所,所用于传菜、续杯等较为简单的服务。
既可增加娱乐性和趣味性,亦可节省雇员成本。
②、用该设计取代某些高功耗、高压电机带动的传送带,降低能耗,增加安全系数。
Ⅵ、总结与心得
通过对该作品的制作,了解了各个模块之间相互协同工作的重要性,初步掌握如何控制好各个模块之间的关系。
通过对探测传感器的使用,了解了传感器在设计中的重要作用,有益于对传感器的进一步学习。
本次电子综合实践也锻炼了我们的动手能力,但最重要的是锻炼了如何解决问题的能力。
参考文献:
1、胡汉才.单片机原理及其接口技术.北京:
清华大学出版社,2005
2、阎石.数字电子技术基础.北京:
高等教育出版社,2001
3、童诗白华成英.模拟电子技术基础.北京:
4、郁有文等.传感器原理及工程应用.西安:
西安电子科技大学出版社,2008
参考程序如下:
#include<
REGX51.H>
#defineSEGPORT0P2
#defineSEGPORT1P0
#defineMOTOR_PORTP3
#defineFRONT_SENSORP1_4
#defineBACK_SENSORP1_5
#defineSTART_BUTTONP1_7
#defineSTOP_TIME8//卸水延时
#defineT_H(65536-50000)/256
#defineT_L(65536-50000)%256
//电机操作指令
#defineSTOP_MOTOR0X00
#defineRUN_FORWARD0x05
#defineRUN_BACK0X0A
unsignedcharcodedisptab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40};
//显示译码
unsignedcharcount=0;
//中断计数
unsignedcharmin=0;
unsignedcharsec=0;
unsignedcharmin_s;
unsignedcharsec_s;
unsignedcharsuccess=0;
//完成阶段标志
bitinput;
bitdirection=0;
bitshowflag=1;
/*******延时1ms***********/
voiddelay_ms(void)
{
unsignedchari,j;
for(i=5;
i>
0;
i--)
for(j=98;
j>
j--);
}
/*********延时n个ms***********/
voiddelay_nms(unsignedintt)
for(;
t>
t--)
delay_ms();
/********定时器初始化*********/
voidtimer_init()
TH0=T_H;
TL0=T_L;
TMOD=0X01;
ET0=1;
EA=1;
TR0=0;
//并不启动定时器
/******外围硬件初始化*********/
voiddevice_init()
count=0;
min=0;
sec=0;
success=0;
direction=0;
showflag=1;
SEGPORT0=disptab[sec%10];
//显示初始化值
SEGPORT1=disptab[min%10];
P3=STOP_MOTOR;
//停止马达
/********时钟中断子程********/
voidtimer()interrupt1
count++;
if(showflag==1)
if(count==20)
sec++;
if(sec==10)
{
sec=0;
min++;
if(min==10)
min=0;
}
/********主函数**********/
voidmain(void)
device_init();
timer_init();
//检测启动按键是否按下
while
(1)
START_BUTTON=0;
input=START_BUTTON;
if(input)
{
delay_nms(5);
input=START_BUTTON;
if(input)
success=1;
direction=0;
break;
}
TR0=1;
delay_nms(1000);
//待命延时
MOTOR_PORT=RUN_FORWARD;
//检测START键完成启动马达前进
//屏蔽起始黑线的检测
{
switch(success)
case1:
FRONT_SENSOR=0;
//检测前面的传感器
if(FRONT_SENSOR==1)//已经检测到前面传感器过线则开始检测后面的传感器
{
success=(direction)?
0:
2;
if(success==0)//返回时前轮过线则停止
{
MOTOR_PORT=STOP_MOTOR;
TR0=0;
}
else
success=direction?
1:
1;
case2:
//已经检测到前面传感器过线则开始检测后面的传感器
BACK_SENSOR=0;
if(BACK_SENSOR==1)
3;
elsesuccess=(direction)?
2:
case3:
MOTOR_PORT=STOP_MOTOR;
delay_nms(1500);
//刹车延时
min_s=min;
sec_s=sec;
sec=0;
while((sec+min*10)<
=STOP_TIME)//目的地卸货倒计时
showflag=0;
SEGPORT0=disptab[(STOP_TIME-min*10-sec)%10];
SEGPORT1=disptab[(STOP_TIME-min*10-sec)/10];
sec_s=sec_s+STOP_TIME+min_s*10;
//累加前面的时间
min=sec_s/10;
sec=sec_s%10;
showflag=1;
MOTOR_PORT=RUN_BACK;
success=2;
direction=1;
delay_nms(1000);
//屏蔽返回黑线检测;
总原理图如下:
附图一总原理图
元器件清单
元器件
用量
双驱动轮式小车
一辆
共阴数码管
两个
电阻电容
若干
AT89S52
一片
万能板
两块
按键
CNY-70
发光二极管
一个
铜柱
四个
L298
开关
铜丝
7805
晶振
矿泉水瓶
OP07
两片
AA干电池
小水杯
附表一元器件清单