《基于单片机的智能小车控制系统综述大学论文.doc》由会员分享,可在线阅读,更多相关《基于单片机的智能小车控制系统综述大学论文.doc(52页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、专业:电子信息工程 学号: 0414110117 Hebei Normal University of Science & Technology本科毕业设计(自然科学) 题 目:基于单片机的智能小车控制系统设计 院(系、部): 机电工程学院 学 生 姓 名: 指 导 教 师: 职 称 讲 师 2015年05月24日河北科技师范学院教务处制 河北科技师范学院 本科毕业设计基于单片机的智能小车控制系统设计院(系、部)名 称 :专 业 名 称: 学 生 姓 名:学 生 学 号: 指 导 教 师:2015年05月24日河北科技师范学院教务处制学 术 声 明本人呈交的学位论文,是在导师的指导下,独立进行
2、研究工作所取得的成果,所有数据、图片资料真实可靠。尽我所知,除文中已经注明引用的内容外,本学位论文的研究成果不包含他人享有著作权的内容。对本论文所涉及的研究工作做出贡献的其他个人和集体,均已在文中以明确的方式标明。本学位论文的知识产权归属于河北科技师范学院。本人签名: 日期: 指导教师签名: 日期: 摘 要机器人的研究是一项具有良好前景的科研项目,而智能小车的研究可以说是机器人研究的一个小入门。智能小车虽然功能不如机器人的强大,但是其所具备的功能一方面是机器人的基本功能或基础原理,另一方面又有很大的发展空间。通过对智能小车的深入研究,也能为机器人的发展助一臂之力。本次设计的智能小车主要是基于5
3、2单片机实现自动循迹、避障和无线操控功能,这三个功能是一个智能小车应具备的基本功能。对每个功能的实现分别依靠TCRT5000传感器、超声波传感器和nRF24L01+无线模块实现。这些模块收到的信号,由单片机进行处理后,控制驱动模块来实现对小车的控制。本次设计制作出的小车能够很好地完成这些功能,达到了设计的要求。且可通过无线操控在小车的行进过程中进行不同工作模式的切换,这使小车的行动更加灵活。更能在遇到突发状况时,能够继续正常工作或避免损坏,增强了小车的可靠性。关键词:智能小车;单片机;TCRT5000传感器;超声波传感器;nRF24L01+AbstractThe research of rob
4、ot is a promising research project. And the research of smart car can be side to be rudiments of robot. Through in-depth study of the smart car, also can help we research the robot.The design of intelligent car is mainly based on 52s microcontroller to realize automatic tracking and obstacle avoidan
5、ce and wireless control function, these three functions is a smart car should have the basic functions. To achieve the functions of each are depended on the TCRT5000 sensor, ultrasonic sensor and nRF24L01+ wireless module. These modules receive signal, then send to microcontroller. Microcontroller p
6、rocess the signal, to control drive module to realize the control of the car. Made out of the car is able to complete these functions, meet the design requirements. And through wireless control in the car in the process of moving to different work mode switch, which makes the car more flexible. More
7、 in the face of unexpected situations, the car can continue to work or to avoid damage. It enhances the reliability of the car.Keywords: smart car; microcontroller; TCRT5000 sensor; ultrasonic sensor; nRF24L01+目 录目 录摘 要IAbstractI目 录II1 绪论11.1 研究背景及意义11.2 研究目的和设计构思12 系统工作原理23 硬件系统设计23.1 供电模块设计与介绍23.1
8、.1 LM2576和LM2596介绍与应用方案23.1.2 7805芯片介绍与应用方案53.2 驱动模块介绍63.3 自动循迹传感器介绍83.4 避障传感器介绍和选择103.5 无线模块介绍和选择114 软件系统设计124.1 自动循迹程序设计124.2 自动避障程序设计154.3 无线操控程序设计175 小车调试与制作21结论23参考文献24致谢24附录24II河北科技师范学院2015届本科毕业设计1 绪论1.1 研究背景及意义随着科技的发展,尤其是计算机技术和网络技术的高速发展,使得智能化开始与各种产品进行融合,衍生出功能更加强大的新一代产品。其中无人驾驶成为了一项重要研究方向。目前,Ap
9、ple已开始着手研究智能汽车iCar或Apple Car。其他公司也有相关方面的研究计划。在军事领域,无人机也一直是一项具有重要战略意义的研究项目。无论是智能汽车,还是无人机都是移动机器人中的一种1。而智能小车则是移动机器人研究的基础,所以智能小车的研究可以推动智能汽车和无人机的发展。而且智能小车一直被各大高校重视,其中飞思卡尔智能小车竞赛是智能小车研究中的一项重要赛事,且对智能小车技术的进步做出了巨大贡献。之所以说智能小车是移动机器人中的基础,是因为智能小车所能实现的功能是一个移动机器人都能完成也都应该具备的功能2。可以说机器人的强大功能都是在小车功能的基础上,进行更深入研究后实现的。而为机
10、器人开发一个新的功能,也可以在小车上进行一定的测试,并且成本要比直接在机器人上开发的低。因此,目前继续深入研究智能小车,对于移动机器人乃至所有机器人研究工作有着重要意义。除此之外,智能小车也是一名电子专业大学生有能力掌握的电子技术。其难度适中,设计思路灵活,很适合用来测试大学生的电子技术。通过制作智能小车有助于巩固电子技术的基础知识,加强实践能力。1.2 研究目的和设计构思此次设计的小车将要完成自动循迹、自动避障、无线操控功能,并能够在小车行进过程中进行功能的切换,即能通过遥控器实现小车的工作模式。这些功能使小车能完成更复杂的工作,具有更大的容错率。比如在自动循迹时,如果因车速过快,导致小车离
11、开轨迹且不能自动重回轨迹时。可以使其切换到无线操控模式,通过人为操控使其重回轨道后,再切换为自动循迹模式继续循迹工作。再如当小车在自动避障过程中,如果突然在无效距离内出现障碍,也可同样利用无线操控其避开障碍后,再继续进行自动避障。这种人为操控方式加智能操控方式,在智能汽车和无人机上也采用如此方式,因此制作出的小车可以在一定的程度上模拟他们在工作时如何处理问题3。如汽车遇到信号灯时,需要一个交通网络或车主来控制车辆的行驶。设计的核心便是利用不同功能的感测器和无线收发模块,来提供信号或命令给单片机,由单片机处理后控制小车的移动或感测器的工作。通过利用不同的感测器可以使小车具备不同的功能,也可以使小
12、车的功能更强、精度更高。不同的无线模块也可以使小车接收信号范围更远、通道更多。本次设计中使用的TCRT5000传感器、超声波传感器和nRF24L01+无线模块,性能上满足设计要求。且小车还留有一定的扩展空间,能添加新的或更换更好的感测器,提升小车的性能。2 系统工作原理本设计使用52单片机作为核心处理器,通过外接循迹传感器、障碍感测器、无线收发模块,来给单片机提供信号。单片机接收到信号后,按照其内部程序进行信号识别并处理各种信号。之后控制电机所接电压的有无、大小和正负,实现对电机转速和转动方向的控制,从而控制小车的移动。通过编程使单片机知道应如何处理各传感器传输的信号,以及何时处理。对无线操控
13、功能,使用两片单片机和两个无线收发模块。一片单片机和一个模块组装成遥控器,进行操控指令的发送。另一片单片机与无线模块安装在小车上,进行操控指令的接收,和对小车的控制。循迹传感器与障碍感测器,顾名思义是进行轨迹检测与障碍检测。分别服务于自动循迹功能和自动避障功能。单片机识别其传送的信号,来控制小车实现这两个功能。3 硬件系统设计3.1 供电模块设计与介绍首先,电源的选择有蓄电池和一般干电池。设计中用到的各种感测器、无线模块与单片机,均要求有45V的输入电压4。所以两种电源提供的电压,虽然大于电压要求,但可以通过变压后,得到符合电压范围的伏值。因此都可以使用。由于制作的无线操控时,需要再制作一个遥
14、控器,因此需要两个电源。而在购买小车底板时,附带一个4节5号电池盒,且已拥有一个12V蓄电池。考虑到小车上不仅要给单片机供电,还需给各感测器、无线模块以及直流电机供电,因此在小车上用蓄电池供电,遥控器用4节干电池供电。3.1.1 LM2576和LM2596介绍与应用方案选好供电电源后,还需要考虑的就是变压的问题。蓄电池的额定输出电压最大为12V,所以使用LM2576或LM2596 芯片进行变压。LM2576可提供降压稳压功能,可驱动3A的负载,有优异的线性和负载调整能力。其输出电流可以为连续型或非连续型,这取决于选取的电感的直流通流量。LM2596是LM2576的升级版,加大了待机电流,增加了
15、自我保护电路5。设计中分别使用了一片LM2576和LM2596。如此选择的原因有两个,第一、两种芯片的使用原理和方法相同,皆是通过连接为反馈电路,达到降压稳压效果。而且所使用的外接元件也相同且容易购买。因此使用任意一种芯片,没有太大的区别。第二、在使用之前,已有一片LM2576。而购买另一片时,价格低导致不能单独购买,所以只好购买做好的使用LM2596的降压稳压模块。使用的反馈电路原理相同,均是采用一个极性输入电容,一个肖特基二极管,一个电感,一个极性输出电容。构成如下电路:图1 反馈电路图图中的CIN、L1和COUT可以使用不同的参数,但要根据情况进行选择。本次设计中,LM2576需要自己进
16、行外接反馈电路。设计中,输入电压电压源为4节5号干电池,最大6V直流电压。输出电压要求为5V。所以CIN使用100F,COUT使用470F,L1使用100H,R1使用1k。其余元件参数与上图一致。并增加了一只六角开关和RF16700保险丝6。(a)正面(b)背面图2 LM2576电路经测试,该电路可实现1到5.8V范围内的电压输出。调节后稳定在5V输出。另一模块如下图:图3 LM2596降压模块该模块供电电源为蓄电池,使用时输出电压调节到6.2V。此电压不能直接给单片机和感测器供电,但可以给L298N驱动模块供电。给单片机供电还需经下述的7805芯片稳压。这就同时解决了单片机与L298N驱动模
17、块的供电问题,7805芯片稳压后的电压还能给L298N的逻辑电平供电7。3.1.2 7805芯片介绍与应用方案7805内部电路具有过压保护、过流保护、过热保护功能。能够实现1A以上的输出电流,具有良好的温度系数,输出电压误差精度分为3%和5%。使用时连接电路如下:图4 7805电路图实际连接时,还应该在两片7805的和的端分别连接一个瓷片电容,如102,104等。这是此次设计的一个失误。不过由于输入电压低只有6.2V,所以经实际测试后发现也可以使用,不会对小车产生影响。VCC端接LM2596降压模块的输出电压,该电压值不能低于6V,不能高于36V。输出端将自动稳压到5V左右,实际检测其输出电压
18、为4.97V,满足单片机与各模块的供电要求。两片7805中,一片单独给单片机供电,一片给各模块供电。这样做是因为单片机对电压的稳定性要求高,而所接模块较多8。如果只用一片7805,会使7805的负载过重,热量升高。进而导致稳压性能变坏,甚至造成7805芯片的损坏。下图为实际焊接电路,该图拍摄时还未添加电源开关。添加的开关位于两片7805中间,没有拍摄是因为已经固定在小车上,不便于拍摄。电路板左上方左起第一根排针为左方7805的输出端,单独为单片机供电。第四根排针为电压输入端,第五和第六根排针为GND端。下方左起前四根排针为GND端,后八根排针为右方7805的输出端,为各个感测器供电。剩余排针未
19、接通,没有使用意义。图5 7805稳压电路板以上便完成了电源供电设计。实际测试证明得到的电压稳定,能满足单片机及其余元器件的电压要求。3.2 驱动模块介绍小车车体的设计要求使用左右两个电机驱动,外加一个后万向轮,形成三点结构,以稳定小车的行驶。电机有直流电机与步进电机两种选择。步进电机是通过对各相绕组按合适的时序通电,控制电机步进转动。可以利用单片机的定时功能,或外接定时设备,对供电时序经行控制,从而达到控制步进电机的转速。如此方法,能精确地控制小车的速度,以及转弯时的角度。但是步进电机比直流电机的价格昂贵,且编程难度大。此次设计中,对小车的行驶速度与转弯角度没有高精度要求,所以采用直流电机进
20、行驱动。使用直流电机驱动时,需要利用减速齿轮按一定的减速比减速后,才可以作为小车的驱动电机。否则,会因小车的速度过快,导致单片机来不及处理接收到的信号,失去对小车的控制。另外小车的运动方向,需要利用电机的不同转速和转向来实现。因此须利用L298N驱动模块来实现对电机的控制。L298N驱动模块是依靠L298N芯片来实现对电机的控制。L298N芯片内部核心是一个双H桥,如下图所示:图6 H桥电路原理图当Q1和Q4导通时,电机顺时针转动;当Q2和Q3导通时,电机逆时针转动。在L298N中,有两个如此的H桥,分别控制两个电机。其中每一个H桥的Q1和Q4的基极相连接,Q2和Q3的基极相连。发射极正极与驱
21、动电压相连,负极与GND 相连。L298N中除须连接一个驱动电压外,还须连接一个逻辑电压。单片机就是负责控制各基极的电平,来实现对电机转动的控制。L298N还有两个使能端,分别控制H桥的开启。利用L298N控制电机转速,就是利用PWM时序脉冲控制使能端开启的时间,达到控制电机导通的时间,进而实现了控制电机的转速。L298N在使用时会产生大量的热量,因此还需要使用散热片进行散热。将电机连接在驱动模块上后,便可以按照前述进行对电机的控制。实际测试表明该模块能及时地进行H桥导通方向的切换,对两个使能端的PWM脉冲控制能明显地控制电机转速。下图为所购买的L298N驱动模块:图7 L298N驱动模块控制
22、方式如下表所示:表1 驱动控制表ENA INA1 INA2 电机状态 0 X X 停止 1 0 0 制动 1 1 0 前进 1 0 1 后退 1 1 1 制动3.3 自动循迹传感器介绍自动循迹功能的实现时依靠TCRT5000光电传感器来实现。设计要求是小车能自行识别一个环形黑色轨迹并沿着轨迹移动,且能在循迹过程中进行无线操控,切换小车的运行模式。关于无线操控部分,将在无线操控功能设计时进行说明,现在先说明自动循迹功能的设计方案。本人购买的用于循迹功能的感测器为一路循迹传感器,如下图所示:图8 循迹传感器其三根引脚分别是OUT、VCC、GND。当传感器检测到黑色轨迹时,OUT端输出低电平,其余颜
23、色轨迹,OUT端输出高电平。如果传感器因高度无法进行检测时,OUT端输出低电平。该模块核心是利用TCRT5000实现对轨迹的检测。TCRT5000工作原理是通过红外发射二极管发射红外线,当红外线遇到黑色轨迹时,由于黑色会吸收所有光线。导致红外线没有返射足够的强度给光敏三极管,光敏三极管便处于关闭状态,于是输出为低电平5。而当轨迹远离传感器时,也会导致红外线无法反射回来,使传感器输出低电平。下图为该模块的电路原理图:图9 循迹模块电路图该模块缺点是不能调节检测距离,其固定检测距离为1cm左右。设计一共使用4个该循迹模块,分为前后两排,一排两个对称安装。前排靠内,后排靠外。这是使前排确定轨迹的最大
24、宽度测量为5cm并提前检测到小车是否驶出轨迹。后排是预防因小车速度过快,导致前排来不及检测小车驶出轨迹。是一种增加循迹可靠性的方案。3.4 避障传感器介绍和选择对于自动避障功能设计,有红外避障方案和超声波避障方案两种选择。对于红外避障方案,购买到的YS-29红外避障模块,具有易编程、易调节检测距离的特性。但是考虑到,红外线在实际中容易受到环境光线强度的影响,且大多数障碍物表面不光滑,会产生漫反射现象。这些都将影响检测的稳定性和可靠性。最重要的是,该模块不是利用编程来控制避障距离,而是通过调节电位器来控制检测距离。而其检测距离就是避障距离。这也就意味着不能通过该模块,来实时检测距离,影响了小车功
25、能的扩展性。所以最终采用超声波避障方案。超声波避障方案与红外避障方案相比较,其优点是能进行实时检测障碍物到小车的距离,可将避障功能扩展成测距功能和避障功能于一体,以满足更多工作需求。但是考虑到负载过多,不能再外接1602或数码管显示所测距离,所以小车检测到的距离数据没有显示。测距功能只能为避障服务,不能满足其余工作需求。超声波的反射也比红外线稳定,能增强自动避障的稳定性。而其缺点则是不能应对在2cm内突然出现的障碍,容易受到温度的影响,导致检测的距离不如红外线的精确。障碍物受测面要尽量平整,否则会影响测距效果。下图分别是所购买的红外模块和超声波模块。图10 红外避障模块(a)正面(b)背面图1
26、1 超声波避障模块超声波避障模块上有一个发射口和一个接收口,其检测原理是通过按一定的时间间隔发送一个超声波,当超声波遇到障碍物时,便会反射回来,由接收口接收返回的超声波。这时接收端的输出就会由高电平变为低电平。而从发送超声波开始,到检测到接收端变为低电平的这段时间,就是超声波从小车开始,移动到障碍物的并返回到小车的往返时间。也就是一次测距的时间。进过如下公式计算,就可得到小车到障碍物的距离9。 (1)公式中的声速,通常使用声音在空气中的传播速度340来计算。实际上在超声波往返于小车和障碍物间时,小车处于移动状态的。所以为了避免因小车的移动造成的误差,要控制小车保持低速行驶,使声波的速度远大于车
27、速,就可以忽略小车移动的影响。而且低速行驶也能在前方障碍物,没有被检测到时,减低碰撞时的冲击力,避免小车的损坏。3.5 无线模块介绍和选择无线功能是本次设计的核心功能,其余的功能都需要利用无线来进行切换。无线操控功能在设计时,也有两种方案。一种是使用网上已调制好的遥控设备,另一种是使用NRF24L01+模块。已做好的遥控设备,使用简单。但不可以对其按键进行编程,也就是说起按键功能固定,导致无线功能扩展受限。而且此种方式接收端只能接收,发送端只能发送,两者不能相互通信。所以决定采用NRF24L01+模块设计无线功能。NRF24L01+模块具有功耗低、抗干扰性高的特点。且发送时会自动添加CRC校验
28、码与字头,接收时会自动去掉。发送时,先将数据送人收发队列,再高速发送。如此可以节能、降低系统费用、增加抗干扰性10。在使用NRF24L0+时,还购买了一块转接模块。该转接模块提供一个降压稳压功能,将5V降压到3.3V左右,再给NRF24L01+供电。对于无线模块程序的设计,主要是调用模块配送的收发程序来实现设计要求,而不是设计全部程序。有关该模块的配置程序与收发程序,购买模块时会由商家提供,网上也有不少现成程序,可以直接调用。在各程序代码中也有详细的注释说明,因此不在论文中提及,相关内容可见附录中的小车整体代码。而在本文中重点说明设计的思路,和调用程序段的目的。下面是NRF24L01+与转接模
29、块的实物图。图12 NRF24L01+模块图13 无线转接模块4 软件系统设计4.1 自动循迹程序设计程序设计流程图如下:图14 循迹程序流程图循迹模式启动后,小车便会一直沿着轨迹行进,直到无线操控切换小车工作模式。对于特殊的十字交叉轨迹,小车将保持直行。如果轨迹上出现障碍,则可以切换小车为无线操控模式,避开障碍并回到轨迹后,再切换为循迹模式继续工作。小车自动循迹功能的实现如上面的流程图所示。当左边的传感器输出低电平时,表明小车的左方过界,即小车如继续行驶将驶离轨迹。而要避免此情况发生,此时需要进行左转。左转时,控制左轮减速行驶,右轮速度不变,便可完成左转。控制左轮减速是通过对左轮的H桥,进行
30、PWM脉冲控制实现。同理当右传感器输出低电平时,实现小车的右转。对于十字交叉轨迹,会使小车的左右传感器同时输出低电平,此时保持小车行驶路线就可以通过该轨迹。下面是自动循迹的循迹部分代码。INA1=1;INA2=0;INB1=1;INB2=0;for(i=0;i200;i+)delay(15);ENA=ENA;ENB=ENB;if(!INTERTRAL&!INTERTRAR&!EXTERTRAL&!EXTERTRAR) continue;if(INTERTRAL=0|EXTERTRAL=0) Left();if(INTERTRAR=0|EXTERTRAR=0) Right(); 代码中的INTE
31、RTRAL为左前方传感器输出端,INTERTRAR为右前方传感器输出端,EXTERTRAL为左后方传感器输出端,EXTERTRAR为右后方传感器输出端。第一个if检测十字交叉轨迹,当同时输出低电平时,保持小车的行进方向。第二个if检测左传感器输出,第三个if检测右传感器输出。由于小车的速度较快,所以使用PWM进行减速控制。调用的Left函数和Right函数分别为左转函数和右转函数。由于左转和右转使用PWM控制,需要在一个死循环中执行,所以对左转函数和右转函数分别添加了如下代码:if(Mode_Flag=2&(INTERTRAR=0|EXTERTRAR=0) P2=0x00;delay(100)
32、;return;if(Mode_Flag=2&(INTERTRAL=0|EXTERTRAL=0) P2=0x00;delay(100);return;前两行代码是左转函数的,后两行是右转函数的。Mode_Flag是工作模式标志。Mode_Flag=2表示工作模式为自动循迹模式。第一个if语句判定工作模式为自动循迹模式,并且检测右传感器输出是否为0。如果是,则将P2口置零11。这是因为驱动模块的控制端与P2口相连,P2口置零后使小车停止运动。经过延时后,返回到自动循迹函数,此时右传感器依然输出低电平,小车便会右转。这一设置便避免了左转过多,导致小车右边出界,而原地停止一段时间,能让小车有时间判断
33、下一步如何行驶。第二个if语句与第一个if语句相同,只是检测的是左传感器的输出电平。该方法的缺点是转弯角度固定,当轨迹的弧度与转弯角度差别较大时,小车的循迹会不太稳定。行驶时容易摇摆不定。要解决该问题,则应使用步进电机,并添加测速模块,形成一个闭环控速系统。但本次设计因成本和编程问题没有采取该方案,所以小车在循迹时有可能要根据不同弧度的轨迹,进行重新编程来控制PWM脉冲的时序,进而控制转弯角度。以实现在任意轨迹上的稳定循迹能力,这是设计中的一个缺陷12。4.2 自动避障程序设计下面是程序的设计流程图:图15 避障程序设计流程图自动避障与自动循迹一样,需要受到无线控制,能切换为其他工作模式。流程
34、中检测循迹传感器输出,是考虑到在避障过程中,除了要检测前方是否有障碍外,还需要检测路面的高低落差是否过大。由于购买的循迹传感器,检测距离固定为1cm左右,所以循迹传感器离地面非常低。这也就意味着小车行进时,前方路面不能有高低落差。而当出现高低落差时,传感器会因距离远而输出低电平,因此可以用来检测前方路面是否有高低落差13。考虑到小车的行驶速度,只要前排或后排的传感器都输出低电平,就停止小车的行进,并退出自动避障模式,由人为手段处理该状况。之所以没有在检测到该情况时,让小车自动避开前方的高低落差路面。是因为此时小车以处于路面的边缘,如果原地旋转90度,虽然能够避开,但也存在小车旋转时产生位移,从
35、而掉落的可能。有些情况不会有太大的影响,但有时会造成小车的损毁,而这是由前方高低落差大小决定的。但是小车的循迹传感器不能调节检测距离,所以不能区分前方的高低落差大小,因此只好在出现高低落差时,强制停止小车并退出避障模式。在前两中情形没有发生时,小车的避障模式采取简单的检测前方是否有障碍,障碍物与小车的距离是否在避障距离内。如果是,则让小车右转90度来躲避障碍,并重新检测新方向上的障碍。否则小车继续直行。下面是其部分代码的说明。if(INTERTRAL=0&INTERTRAR=0)|(EXTERTRAL=0&EXTERTRAR=0)P2=0X00;return;INA1=1;INA2=0;INB
36、1=1;INB2=0; for(i=0;i200;i+)if(INTERTRAL=0&INTERTRAR=0)|(EXTERTRAL=0&EXTERTRAR=0) P2=0X00;return;delay(20);ENA=ENA;ENB=ENB; if(distance0) P2=0x00; Right90(); delay_ms(100);小车进入避障模式后,用第一个if语句是检测是否可以在当前位置开启自动避障功能,不能则退出自动避障模式。之后的for循环是PWM控制,并在其中进行检测前方高低落差检测与障碍检测。其中distance变量储存测量的距离,单位是厘米,当其不大于12时。表明小车到
37、障碍的距离小于12cm,此时进行右转90度处理。之后的延迟100ms,是由于超声波的发送不能是连续的,需要一定的时间间隔。本模块的推荐是每60ms发送一个10s以上的超声波,所以延迟100ms等待新方向的测距。而右转90度后小车会进入制动状态,如此在等待新一轮测距时,也不会因小车移动,使其与障碍的距离不足2cm超声波最小有效距离而导致无法自动避障。超声波的发送与距离的测量,使用了单片机的定时器0和定时器1进行时序控制。其中定时器0工作模式为方式1,用于测量超声波的往返时间。定时器1工作模式也为方式1,用于定时60ms发送超声波。下面是超声波测距程序说明:void meter_distance(
38、)Trig=1;delay_ms(12);Trig=0;while(!Echo);TR0=1; while(Echo);TR0=0;distance=TH0*256+TL0;TH0=0;TL0=0;distance=distance/53;其中的Trig是超声波发送端,通过给其高电平进行发送。代码中发送一个12s的超声波。发送完成后开始计时,通过检测Echo端超声波接收端,当超声波发送完成后会自动置为高电平来判断超声波是否返回。返回后Echo将会变为低电平,此时停止计时,得到的就是超声波的往返时间。将该时间除以53就能得到小车与障碍的距离。这里运用了公式(1),计算过程如下: (2)其中时间单
39、位为s,长度单位为m,速度单位为m/s。经过公式2的换算后得到时间t(s)=0.0053*s(m),即s(cm)=t(s)/53。所以distance(s)除以53后便得到距离(cm)。定时器0计时后清零,并当计时溢出后,进入定时中断将Echo端置为低电平。这是防止距离过远,导致Echo端一直处于高电平状态,影响后续的测量效果。4.3 无线操控程序设计程序设计流程图:图16 无线接收流程图图17 发送程序流程图设计中发送端采取自动重发机制,当接收端没有按时传回应答信号时,发送端便会重发之前的命令。发送端还外接一个44键盘,键盘扫描程序来自单片机100例。当有按键按下,扫描出是第几个按键,然后发
40、送对应的命令14。每次发送前,将会清空收发队列,以免有以前未发送命令还存在队列中,干扰当前命令的发送。接收函数在每一个功能函数中都要调用,以此来切换工作模式。特别地在左转函数与右转函数中也要调用。上文已说明这两个函数是如何实现左右转的,而该实现使用了一个死循环。当小车工作于无线操控模式时,需要在左右转时也能接受新的命令并执行。这就必须在这两个函数中调用接收函数,以使其在收到新的命令时,能够退出函数并执行当前命令。下面将说明部分代码。int I = -1;inerDelay_us(100);init_io(); / 初始化NRF24L01+的IOTX_Mode(); /配置发送模式SPI_RW_
41、Reg(WRITE_REG+STATUS,0xff);/清空状态为SPI_RW_Reg(FLUSH_TX,0xff);/ 清空收发队列while(1) i=Keys_Scan();/按键扫描,返回按键的编号if(i!=-1&i10) SPI_RW(FLUSH_TX); nRF24L01_TxPacket(TX_BUFi); while(IRQ);sta=SPI_Read_Data(STATUS); /读取状态信息while(!TX_DS) if(MAX_RT) SPI_RW_Reg(FLUSH_TX,0xff);break; sta=SPI_Read_Data(STATUS);SPI_RW_R
42、eg(WRITE_REG+STATUS,sta); /清除TX_DS或MAX_RT标志SPI_RW_Reg(FLUSH_TX,0xff);IRQ=1;delay_ms(20000);i = -1; 因为一共设置了10个命令,按键编号重0开始,所以第一个if语句检测i是否小于10。发送完一个命令后,IRQ会由高电平变为低电平,所以检测IRQ就可以知道命令是否发送完毕。之后读取芯片状态信息,检测TX_DS位,当接收端发送回应答信号后,该位会从低电平变为高电平,便可以发送下一条命令。在接收到应答信号前,每隔4086s重发一次该命令。最大重发5次,超过后,会产生MAX_RT中断,即MAX_RT变为高电
43、平。此时将清空收发队列,跳出应答检测循环,清除TX_DS或MAX_RT标志后,就可以发送新命令了。UCHAR RX_BUF;RX_Mode(); while(1)flag=nRF24L01_RxPacket(&RX_BUF);/接收命令至RX_BUF并返回1 sta = SPI_Read_Data(STATUS); if(flag=1) switch(RX_BUF) case STOP: INA1=0;INA2=0;INB1=0;INB2=0;break;case FRONT:INA1=1;INA2=0;INB1=1;INB2=0;ENA=1;ENB=1;break;case BACK: IN
44、A1=0;INA2=1;INB1=0;INB2=1;ENA=1;ENB=1;break;case LEFT: Left();break;case RIGHT:Right();break;case LEFT_90: Left90();break;case RIGHT_90:Right90();break;case MODE2: P2=0x00;Mode_Flag=2;return;case MODE3: P2=0x00;Mode_Flag=3;return;default: P2=P2; SPI_RW_Reg(WRITE_REG + STATUS, sta); delay_ms(20); RX_Mode();/配置接收模式接收模式主要是接收命令后,识别该命