基于单片机智能小车毕业设计.docx
《基于单片机智能小车毕业设计.docx》由会员分享,可在线阅读,更多相关《基于单片机智能小车毕业设计.docx(44页珍藏版)》请在冰豆网上搜索。
基于单片机智能小车毕业设计
基于单片机智能小车毕业设计
4.2.2电机驱动程序的设计....................................................................................20
4.3循迹模块程序的设计22
4.3.1循迹模块流程图22
4.3.2循迹模块程序的设计22
4.4测距壁障模块程序的设计24
4.4.1超声波测距模块流程图24
4.4.2超声波测距模块程序的设计25
4.5显示模块程序的设计26
4.5.1显示模块流程图26
4.5.2显示模块程序的设计26
第5章系统软硬件的调试29
5.1软件程序的调试29
5.2硬件电路的焊接与调试30
参考文献31
附录1原理图32
附录2源程序33
附录3实物图43
致谢.....................................................................................................................................44
作品(软件)使用说明书..45
第1章绪论
1.1智能小车的意义和作用
智能的出现,为我们的生活和生产带来了很大的便利,同时也是以后的发展方向,智能就是可以在一个特定的环境中按照我们前面设定好的模式去自动的运作,它并不需要我们去人为的管理,就可以达到我们前面设定的目标,它的应用领域很广,如可以应用于工业控制、科学勘探、智能家居等领域。
而智能小车就是智能的一个简单的应用,智能小车就是智能化玩具中的一种,由于这类智能玩具具有较好的交互性,可控性,能够按照人们设定的模式去自动运作也深受人们的喜欢。
另外,智能小车还可以应用于危险搜索、机器人等许多方面,尤其在机器人方面具有很好的发展前景。
因此,智能化小车的研究不仅具有很大的现实意义,还具有极为广阔的应用前景和市场价值。
1.2智能小车的现状
智能小车的研究、开发和应用涉及传感技术、电气技术、电气控制技术、智能控制等学科,智能控制技术是一门跨科学的综合性技术,当代研究十分活跃,应用日益广泛的领域[1]。
众所周知机器人技术的发展是一个国家高科技水平和工业自动化程度的重要标志和体现。
因此目前世界各国都在开展对机器人技术的研究。
机器人由于有很高的灵活性、可以帮助人们提高生产率、改进产品质量等优点,在世界各地的生产生活领域得到了广泛的应用[2]。
智能小车正是模仿机器人的一种尝试。
它是一种以汽车电子为背景,涵盖多学科的科技创新性设计,一般主要由路径识别、速度采集、角度控制以及车速控制等模块组成。
这种智能小车能够自动搜寻前进路线,还能爬坡,感知前方的障碍物,并自动寻找前进方向,避开障碍物。
另外如果加入相关声光讯号后,更能体现出智能化和人性化的一面。
第2章方案设计与论证
2.1主控系统
由于单片机具有价格低廉,资源丰富、有较为强大的控制功能,故本次设计采用STC89C52单片机作为整个系统的核心,用其控制行进中的小车以实现其既定的性能指标。
STC89C52是一个超低功耗的增强型51单片机,和标准51系列单片机相比较它的运算速度更快,有超强的抗干扰能力,同时还支持ISP在线编程,片上集成了512字节的随机存取数据存储器(RAM),并且片内含8k字节空间的可以反复擦写1000次的Flash只读存储器,32个I/O口,以及3个16位可编程定时计数器。
其指令系统和传统的8051系列单片机指令系统完全兼容,降低了系统软件设计的难度,电路设计简单、价格低廉,在后来的实验中我们发现,STC89C52精确度和运算速度也都完全符合我们系统的要求。
2.2电源模块
由于本系统需要给整个智能小车系统供电,考虑了以下几种方案:
方案一:
采用4节1.2V可充电电池组。
在电充满时4节电池电压可以达到5v且可充电电池组具有较强的电流驱动能力及稳定的电压输出性能,但是直流电机工作时会对LCD1602显示造成干扰,使其显示不稳定。
故放弃此方案。
方案二:
使用双电源供电,将9v可充电方块电池电压降压、稳压到5V后给单片机系统和LCD1602及其它芯片供电。
另外采用4节1.2V可充电电池组为直流电机供电,经测试在用此种供电方式下,单片机和传感器工作稳定,直流电机工作良好,LCD显示也很稳定,小车也能长时间工作。
综上考虑,我们选择了方案二来完成智能小车整个系统的供电。
2.3电机驱动模块
2.3.1电机模块选择与论证
方案一:
使用步进电机作为智能小车系统的驱动电机,因为步进电机的转动角度可以精确的定位,这样就可以比较精确的定位小车的前进距离和位置。
但是由于步进电机的输出力矩偏低,并且会随着电机转速的升高而下降,在达到较高的转速时其输出的力矩会急剧下降,因此不适于小车等对速度有着一定要求的系统。
经过综合分析比较决定放弃此方案。
方案二:
使用直流减速电机作为智能小车系统的驱动电机。
直流减速电机的转动力矩比较大,而且体积较小,重量也很轻,使用方便。
另外小车电机内部还装有减速齿轮组,所以并不需要去考虑调速的功能,可以很方便的通过单片机来控制直流减速电机的正传、反转、停止操作。
综合以上考虑选择方案二的直流减速电机作为整个智能小车的驱动电机。
2.3.2电机驱动模块选择与论证
方案一:
采用继电器对电动机进行控制,通过切换电动机的开关来调整小车的速度。
这个方案的优点是电路相对比较简单,但是它的缺点也比较多,如:
继电器的响应时间偏慢,寿命较短,容易损坏,可靠性也不是很高。
故决定放弃此方案。
方案二:
采用专用的电机驱动芯片L298N来控制直流减速电机,L298N芯片(如图2-3)是一个具有高电压大电流的全桥驱动芯片,一片L298N芯片可以分别的控制两个直流减速电机,在6~46V的电压下,可以提供2A的额定电流,并且具有过热自动关断和电流反馈检测功能,安全可靠。
该芯片是利用TTL电平进行控制的。
通过单片机的IO口输出高低电平来改变芯片控制端的输入电平,即可以实现对电机进行正转、反转和停止操作。
另外为了保证L298N的正常工作,我还安装了8个续流二极管1N4007。
用该芯片作为电机驱动,驱动能力大、操作方便、稳定性好、性能优良。
综合以上分析与论证我们选择方案二的驱动芯片L298N作为整个智能小车系统的电机驱动电路。
图2-3L298N
2.4循迹模块
方案一:
用光敏电阻来探测。
光敏电阻的阻值会随着周围环境光线的变化而变化[6]。
因此当光敏电阻在黑色轨迹的上方和白色轨迹的上方时,阻值会发生较为明显的变化。
将阻值的变化值输入到电压比较器就可以输出高低电平。
单片机就可以根据反馈来的不同的电平信号,发出相应的控制操作命令来控制小车的左转,右转,前进或者停止。
但实际效果并不理想,误测几率偏大、容易受外界的光线环境的影响,不能够稳定的工作。
因此考虑其它更加稳定的方案。
方案二:
采用红外反射式光电管完成系统循迹[3]。
TCRT5000(如图2-4)是一种一体化反射型光电探测器,传感器采用高发射功率红外光电二极管和高灵敏度光电晶体管组成,其发射器是一个砷化镓红外发光二极管,而接收器是一个高灵敏度,硅平面光电三极管。
它是利用了光的反射原理,当光线照射在白纸上,反射量会比较大,反之,当光照射在黑色物体上,反射回去的量比较少,因为黑色会吸收光,这样就可以判断黑胶带带轨道的走向。
采用红外线发射,外面可见光对接收信号的影响较小,利用红外对管对黑线边界进行检测,再用LM393对检测信号进行比较,取反,送单片机进行处理。
此光电对管电路简单,工作性能稳定。
经测试方案二不论是在黑暗或者是强光照射下,智能小车系统均可以很稳定的工作,对外界环境的适应能力比较强。
因此我们选择方案二。
图2-4TCRT5000
2.5测速模块
方案一:
采用霍尔传感器检测轮子上的小磁铁从而给单片机中断脉冲,通过单位时间内对脉冲的计数通过公式就可以算出实时的车速,达到测量速度的作用。
霍尔元件具有体积小,动态特性好,频率响应宽度大,对外围电路要求简单,使用寿命长,安装方便,价格低廉等特点。
但是需要和磁钢配对使用比较麻烦。
方案二:
采用光电码盘,即透射式光电传感器(凹槽型如图2-5)进行测速。
槽型光耦是由红外发光管和光敏三极管构成的,工作时红外发光管发出红外光线透过光耦的槽投射到光敏三极管上,光敏三极管导通,集电极输出低电平。
当红外光线被检测物遮断时,光敏三极管截止,集电极输出高电平。
遮挡一次槽型光耦输出一个脉冲,因此脉冲的个数就是被检测物的数量。
车轮转动时带动码盘转动,单片机内部计时可测出给定的时间内通过的脉冲数,从而测出小车的实时速度。
使用方便,抗干扰性较强。
通过比较方案一和方案二的优缺点,综合多方面因素决定选用方案二。
图2-5槽型光电传感器
2.6显示模块
方案一:
采用LED数码管显示。
数码管使用简单,价格低廉,但一个数码管只能显示一个数字,要显示多位数据时要使用多个数码管,这就增加了硬件电路的复杂度和额外功耗,而且LED数码管也无法显示字符。
由于我们计划要显示小车运行的速度和路程,LED数码管没办法显示这么多的内容,因此考虑其它的方案。
方案二:
采用LCD1602液晶(如图2-6)显示。
LCD1602液晶具有功耗低,显示内容丰富清晰,显示信息量大,显示速度较快,界面友好,使用简单等特点而得到了广泛的应用。
并且外围电路也比较简单,因此我们选择此方案。
通过以上方案论述我们选择方案二,显示小车运行速度和路程的任务。
图2-6LCD1602液晶显示器
2.7壁障模块
方案一:
用漫反射式光电开关进行避障。
光电开关的工作原理是根据光线发射头发出的光束,被物体反射,其接收电路据此做出判断反应,物体对红外光由同步回路选通而检测物体的有无。
当有光线反射回来时,输出低电平。
当没有光线反射回来时,输出高电平。
操作简单但是测量的距离不远。
方案二:
用超声波传感器进行测距避障。
超声波传感器的原理是:
超声波由压电陶瓷超声波传感器发出后,遇到障碍物便反射回来,然后再被超声波传感器接收[8]。
超声波传感器在避障的设计中被广泛应用。
为了使用方便,便于操作和调试,采用集成超声波测距模块HC-SR04(如图2-7)。
综合考虑本系统只需要检测障碍物,没有十分复杂的环境。
为了使用的方便,便于操作和调试,最终选择了方案二。
图2-7HC-SR04超声波测距模块
第3章硬件设计
3.1总体设计
智能小车采用前轮驱动,前轮左右两边各用一个电机驱动,通过电机驱动芯片L298N来控制前面两个轮子的转动与停止从而达到控制转向的目的,后轮是万向轮,起支撑转向作用。
将4个红外光电传感器装在车体底盘的前端,小车根据传感器检测的情况来循迹前进。
小车速度的检测通过槽型光电传感器,将码盘装在电机的轴上,码盘跟随电机一起转动,将检测到的数据传回单片机进行处理。
小车的避障用超声波避障模块HC-SR04,将其置于车头,检测到障碍物时,小车做出相应的反应。
总体设计框图如图3-1。
图3-1总体设计框图
3.2驱动电路
电机驱动芯片采用L298N,是一款承受高压大电流的全桥型直流/步进电压驱动器,如下图3-2。
图3-2电机控制芯片L298N的引脚排列
其中L298N各引脚的编号与功能和内部逻辑如下表3-1和图3-3。
表3-1L298N引脚编号与功能
引脚编号
名称
功能
1
电流传感器A
在该引脚和地之间接小阻值电阻可用来检测电流
2
输出引脚1
内置驱动器A的输出端1,接至电机A
3
输出引脚2
内置驱动器A的输出端2,接至电机A
4
电机电源端
电机供电输入端,电压可达46V
5
输入引脚1
内置驱动器A的逻辑控制输入端1
6
使能端A
内置驱动器A的使能端
7
输入引脚2
内置驱动器A的逻辑控制输入端2
8
逻辑地
逻辑地
9
逻辑电源端
逻辑控制电路的电源输入端为5V
10
输入引脚3
内置驱动器B的逻辑控制输入端1
11
使能端B
内置驱动器B的使能端
12
输入引脚4
内置驱动器B的逻辑控制输入端2
13
输出引脚3
内置驱动器B的输出端1,接至电机B
14
输出引脚4
内置驱动器B的输出端2,接至电机B
15
电流传感器B
在该引脚和地之间接小阻值电阻可用来检测电流
图3-3L298N内部原理图
电机驱动A/B的控制逻辑如下表所示。
表3-2电机驱动A/B的控制逻辑
输入信号
电机运动方式
使能端A/B
输入引脚1/3
输入引脚2/4
1
1
0
前进
1
0
1
后退
1
1
1
紧急停车
1
0
0
紧急停车
0
X
X
自由转动
L298N可直接对电机进行控制,不需要隔离电路。
通过单片机的I/O输入改芯片控制端的电平,即可以对电机进行正反转,停止的操作,操作非常方便,亦能满足直流减速电机的大电流要求[4]。
调试时依照上表,用程序输入对应的码值,即可以实现对应的操作。
其驱动电路原理图如下图3-4所示。
图3-4L298N驱动原理图
3.3信号检测电路
小车循迹的原理是在铺有约四厘米宽黑胶带的白纸“路面”上行驶,由于黑纸和白色路面对光线的反射系数不同,可以根据接收的反射光的强弱来判断道路——黑纸轨迹。
本设计采用简单易用,应用也较为普遍的红外探测法。
红外探测法,即用红外线在不同颜色的物表面具有不同的反射性质的特点[7]。
在小车行驶过程中传感器的红外发射二极管不断发射红外线,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,光敏三极管一直处于关断状态,此时模块的输出端为低电平,当红外线遇到白色地面时发生漫反射,红外线被反射回来反射光被装在小车上的接收管接收且强度足够大,光敏三极管饱和,此时模块的输出端为高电平;如果遇到黑纸则红外光被吸收,小车上的接收管接收不到信号,再通过LM393作比较器来采集高低电平,从而实现信号的检测。
避障亦是此原理。
通过设计了如图3-5所示的电路来检测,图中R18为限流电阻,当有光反射回来时,光电传感器的三极管导通,在LM393的2脚出产生低电平电压,通过LM393处理后在P1.0出产生高电平,返回给单片机,从而达到检测的目的。
并通过变阻器RV1可调节传感器的灵敏度。
图3-5循迹原理图
3.4测速电路
采用透射式光电传感器(凹槽型)进行测速。
槽型光耦是由红外发光管和光敏三极管构成的,将码盘安装在电机轴上,当电机转动时,码盘也随之转动。
工作时红外发光管发出红外光线透过光耦的槽投射到光敏三极管上,光敏三极管导通,集电极输出低电平。
当红外光线被检测物遮断时,光敏三极管截止,集电极输出高电平。
遮挡一次槽型光耦输出一个脉冲,因此脉冲的个数就是被检测物的数量。
车轮转动时带动码盘转动,单片机内部计时可测出给定的时间内通过的脉冲数,从而测出小车的实时速度。
其电路原理图与循迹原理图类似。
如图3-6所示。
图3-6测速电路原理图
3.5显示电路
用LCD1602来显示数据,LCD液晶具有功耗低、显示内容丰富、清晰,显示信息量大,显示速度较快等特点。
其中用滑动变阻器RV0来调节显示器的背光亮度。
电路原理图如下图3-7。
图3-7显示电路原理图
3.6主控电路
单片机是控制单元的核心。
起着控制小车所有运行状态的作用。
单片机控制模块使用的是宏晶公司生产的STC89C52,使用该芯片很容易实现对其它模块的控制。
通过对单片机STC89C52写入程序,可以方便的用软件来控制,整个过程的控制部分如图3-8所示。
图3-8单片机最小系统
STC89C52单片机最小系统包括了晶振电路,电源电路以及复位电路,其中复位电路的复位按键用于小车的复位。
P1.3~P1.7分别控制电机驱动。
其它P口用外接控制小车的各种控制开关,P0口外接上拉电阻,可用于外接LCD1602。
STC89C52单片机介绍[5]:
STC89C52RC单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可以任意选择。
主要特性如下:
1.增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容传统8051。
2.工作频率范围:
0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz。
3.工作电压:
5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机)
4.片上集成512字节RAM。
5.用户应用程序空间为8K字节。
6.ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成一片。
7.通用I/O口(32个),复位后为:
P1/P2/P3/P4是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。
8.具有看门狗功能。
9.具有EEPROM功能。
10.共3个16位定时器/计数器。
即定时器T0、T1、T2。
11.外部中断4路,下降沿中断或低电平触发电路,PowerDown模式可由外部中断低电平触发中断方式唤醒。
12.通用异步串行口(UART),还可用定时器软件实现多个UART。
13.工作温度范围:
-40~+85℃(工业级)/0~75℃(商业级)
14.PDIP封装。
STC89C52单片机的引脚图如下图3-9。
图3-9STC89C52RC引脚图
另外STC单片机有两种时钟模式,一种是单倍速,也就是12时钟模式,在该模式下,STC单片机与其他公司51系列单片机具有相同的机器周期,即12个振荡周期为一个机器周期;另一种是双倍速,又称6时钟模式,在该模式下,STC单片机比其他公司的51单片机运行速度快一倍。
第4章软件设计
4.1主程序模块的设计
4.1.1主程序的流程图
图4-1主程序流程图
在图4-1主程序流程图中,开始时先是单片机的初始化,包括定时器初始化,外部中断的初始化,液晶的初始化。
然后调用循迹子程序,小车循迹前进,如果定时时间到了则调用超声波模块子程序,判断前方50cm处是否有障碍物,如果有的话led闪烁,如果检测到停止线则小车停止。
4.1.2主程序的设计
voidmain()
{
Timer_Init();//定时器初始化
INT0_Init();//外部中断初始化
LCD_Init();//LCD1602初始化
TR1=1;//启动定时器
lcd_write_cmd(0x80);
LED1=1;
LED2=1;
while
(1)
{
PWM();//pwm调速
track();//调用循迹子程序
lcd_write_cmd(0x80+0x09);
lcd_write_dat(qian);
lcd_write_cmd(0x80+0x0a);
lcd_write_dat(bai2);
lcd_write_cmd(0x80+0x0b);
lcd_write_dat(shi2);
lcd_write_cmd(0x80+0x0c);
lcd_write_dat(ge2);
lcd_write_cmd(0x80+0x47);
lcd_write_dat(bai1);
lcd_write_cmd(0x80+0x48);
lcd_write_dat(shi1);
lcd_write_cmd(0x80+0x49);
lcd_write_dat(ge1);
if(flag1==1&&flag2==1)
{
csb();//调用超声波子程序
flag1=0;
}
}
}
4.2电机驱动程序的设计
4.2.1电机驱动程序流程图
图4-2电机驱动程序流程图
电机驱动程序流程图如上图4-2,开始先检测小车的状态如果相对黑线是直的,则调用直走子程序,即左右两个电机都正转;如果小车偏向黑线的左边则调用向右走子程序,即左电机正转右电机反转;如果小车偏向黑线的右边则调用向左走子程序,即左电机反转右电机正转;如果小车完全偏离黑线则调用向后退子程序,即两个电机都反转;如果小车到终点了则调用停止子程序,即两个电机都不转。
4.2.2电机驱动程序的设计
voidgoahead()//小车直走
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
voidgoback()//小车后退
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
}
voidturnright()//小车向右转
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
}
voidturnleft()//小车向左转
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
}
voidzw_turnright()//用于转弯时的左转
{
IN1=1;
IN2=0;
IN3=0;
IN4=0;
}
voidzw_turnleft()//用于转弯时的右转
{
IN1=0;
IN2=0;
IN3=1;
IN4=0;
}
voidstop()//小车停止
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
voidPWM(void)//小车调速
{
PWM_ENA=1;
PWM_ENB=1;
delayXms(H);
PWM_ENA=0;
PWM_ENB=1;
delayXms(L);
PWM_ENA=0;
PWM_ENB=0;
delayXms(N);
}
4.3循迹模块程序的设计
4.3.1循迹模块流程图
图4-3循迹模块流程图
在图4-3循迹模块流程图中,通过检测P1口第四位的电平并把它赋给变量temp然后用switch-case语句来根据P1口低四位的电平,给出相应的电平送到电机驱动芯片L298N去,从而控制小车的直走,左转,右转,后退,停止等动作。
4.3.2循迹模块子程序设计
voidtrack(void)
{
uchartemp=0;
temp=P1&0x0f;//取P1口低四位赋给变量temp
switch(temp)
{
case0x09:
goahead();//直走
break;
case0x0c:
case0x0e:
turnleft();//左转
break;
case0x03:
case0x07:
turnright();//右转
break;
case0x0f:
gobac