赞
踩
成果展示
目录
1.2智能小车的发展前景..................................................................................... 5
2.1.1 主控单元方案比较与选择................................................................. 6
2.1.2 电机驱动单元方案比较与选择......................................................... 6
2.1.3 避障单元方案比较与选择................................................................. 7
2.1.4 循迹单元方案比较与选择................................................................. 7
2.1.5 语音控制单元方案比较与选择......................................................... 7
3.1.3 烧写接口电路................................................................................... 10
3.2.4模块系统分析.................................................................................... 12
3.2.5 LM393芯片介绍................................................................................ 13
3.3.2超声波工作原理................................................................................ 15
3.3.3超声波测距原理................................................................................ 15
3.7.2对OLED写命令,写数据.................................................................. 20
4.3 软件程序设计部分源程序.......................................................................... 28
4.3.1主程序(包含语音控制程序)........................................................ 28
4.3.2电机驱动程序.................................................................................... 29
4.3.4.1单片机定时器......................................................................... 31
4.3.4.2 TMOD寄存器.......................................................................... 32
4.3.4.3超声波传感器测距思路......................................................... 33
4.3.4.4超声波测距流程图................................................................. 34
4.3.4.6 PWM波................................................................................... 38
4.3.4.7模拟PWM波控制舵机的实现思路...................................... 40
4.3.5 OLED显示程序................................................................................... 42
4.3.5.1 IIC通信.................................................................................... 42
4.3.5.1.1 IIC的物理层................................................................. 43
4.3.5.1.2 IIC的协议层................................................................. 44
4.3.5.3 OLED显示字符串函数编写思路............................................ 48
5.1.2红外对管循迹调试............................................................................ 50
5.1.3超声波避障调试................................................................................ 50
5.1.4语音控制调试.................................................................................... 51
智能汽车是一种高新技术密集的新型汽车,是在网络环境下利用信息技术、智能控制技术、自动控制、模式识别、传感器技术、汽车电子、电气、计算机和机械等多个学科的最新科技成果,使汽车具有自动识别行驶道路、自动驾驶等先进功能.随着控制技术、计算机技术和信息技术的开展,智能车在工业生产和日常生活中已经扮演了非常重要的角色.近年来,智能车在野外、道路、现代物流及柔性制造系统中都有广泛运用,已成为人工智能、云计算和物联网等多个领域研究和开展的热点。由于单片机教学例子有限,因此,单片机智能车能综合学生课堂上的知识来实践,使学习者更好的了解单片机的开展。通过此次的单片机循迹避障小车制作,使学生从理论到实践,初步体会单片机工程的设计、制作、调试和成功完成工程的过程及困难,以此学会用理论联系实际,通过对实践中出现的缺乏与学习来补充教学上的盲点。已有的51智能小车的设计实现了小车的无人驾驶,通过对路面和周围环境的检测,由单片机来判断控制小车的反应情况,使其变得智能化,实现自动的循迹前进和遇障转弯、停止功能。在此基础上,本项目还通过语音控制使小车实现不同运行模式的任意切换。此系统经过不断的完善后可以应用到道路检测,安全巡逻中,能满足社会的需要。此外用单片机和数字电路设计的智能小车具有运动灵活、控制准确、功耗低、成本低等优点。所以使用单片机设计的智能小车具有广阔的发展前景。
智能车辆是目前世界车辆研究领域的热点和汽车工业新的增长点。未来的车辆也一定是智能化的车辆。所以,智能化的车辆是未来人们生活重要的载体。因此有必要对智能车辆进行研究。研制一种智能,高效的智能小车控制系统具有重要的实际意义和科学理论价值。本文设计了一个能够通过语音控制的循迹避障智能小车系统。利用红外对管循迹模块TRCT5000检测黑线实现小车循迹,利用超声波传感器HC-SR04和SG90舵机检测道路上的障碍,利用OLED显示模块显示小车的运行模式,利用离线语音模块SU-03T完成小车运行模式的切换,以STC89C51单片机为控制核心,将各个功能模块连接起来,使小车具有高度的智能化,达到设计目标。
关键词:智能小车、单片机、循迹、避障、语音控制、OLED显示
Abstract
Intelligent vehicle is a hot spot in the field of world vehicle research and a new growth point in the automobile industry. The vehicles of the future must also be intelligent vehicles. Therefore, intelligent vehicles are an important carrier of people's life in the future. Therefore, it is necessary to study the intelligent vehicles. The development of an intelligent and efficient intelligent car control system has important practical significance and scientific theoretical value. In this paper, an intelligent car system with voice control is designed. Using infrared tube tracking module TRCT5000 detection black line to realize car tracking, using ultrasonic sensor HC-SR04 and SG 90 steering gear to detect obstacles on the road, using the OLED display module to display the operation mode of the car, using the off-line voice module SU-03T to complete the switch, switch STC89C51 as the control core, connecting the car is highly intelligent, to achieve the design goal.
Key words: intelligent car, MCU, tracking, obstacle avoidance, voice control, OLED display
自第一台智能小车诞生以来,智能小车的发展已经遍及机械、电子、冶金、交通、宇航、国防等领域。一方面由于智能小车的智能水平不断提高,并且迅速地改变着人们的生活方式。人们在不断探讨、改造、认识自然的过程中,制造能替代人劳动的机器一直是人类的梦想。另一方面随着汽车工业的迅速发展,关于汽车的研究也越来越受人们的关注。全国电子大赛和省电子大赛几乎每年都有智能小车这方面的题目,全国各高校也都很重视该题目的研究。本设计就是也是在这样的背景下产生的,设计的智能小车应该能够实现通过语音控制实现避障和循迹的功能。
人类进入21世纪,随着科学技术的迅猛发展和生活水准的快速提高,人们对汽车的安全性、舒适性要求越来越高。各种先进的技术,如汽车智能交通系统、汽车主动安全技术、汽车自动驾驶技术、车辆巡航技术等被应用和研究,智能汽车的研究也正在成为世界汽车研究的热点。
本设计在参阅了大量网上设计的智能小车的基础上,利用单片机技术,采用C语言进行编程,并结合离线语音模块SU-03T、红外对管循迹传感器TCRT5000、OLED显示模块及超声波传感器HC-SR04、SG-90舵机等模块构造的智能小车。本文首先简要介绍了设计的智能小车的功能及总体方案,然后简单介绍各功能模块如何择优选择,之后详细介绍设计流程,分为各部分模块的硬件设计和各部分模块的软件编程思路,最后是系统的调试和项目总结。
本课题设计主要是制作一款能进行智能判断并能做出正确反应的小车。小车具有以下几个功能:自动避障功能、循迹功能(按路面的黑色轨道行驶)、语音控制切换小车运行模式并在OLED屏幕上显示其运行模式的功能。作品既可以对高端智能化进行剖析,也可以作为高级智能玩具发展对象,同时可成为大学生学习嵌入式控制系统的应用实例。作品以两路直流电动机为主驱动,通过各类传感器件来采集各类信息,送入主控单元AT89C 51单片机,处理数据后完成相应动作,以达到自身控制。电机驱动电路采用成本较低且具有良好的抗干扰性和较大电流驱动能力的L9110S电机驱动模块;避障采用HC-SR04超声波传感器来完成,自动循迹采用红外对管循迹模块TCRT5000完成,语音功能采用离线语音模块SU-03T来完成。最后由控制单元处理数据后通过汇编程序有序合理的将各模块信号整合在一起并完成相应动作,实现了智能控制,相当于简易机器人。
通过收集各硬件模块资料信息,对其进行有效的分析选择,最终选出最合理的设计方案。
方案一:采用各类数字电路来组成小车的控制系统,对外围避障信号,自动循迹信号,语音控制信号进行处理。本方案电路复杂,灵活性不高,效率低,不利于小车智能化的扩展,对各路信号处理比较困难。
方案二:采用AT89C51单片机来作为整机的控制单元。红外线探头采用市面上通用的发射管与及接收头,经过比较芯片调制处理后由控制系统接收。路线寻找采用红外线管对路面信号采集,送到单片机系统处理,语音控制信号也是同样原理。此系统比较灵活,采用软件方法来解决复杂的硬件电路部分,使系统硬件简洁化,各类功能易于实现,能很好地满足题目的要求。
比较以上两种方案的优缺点,方案二简洁、灵活、可扩展性好,更能达到题目的设计要求,因此采用方案二来实现。
方案一:采用继电器对电动机进行控制,通过切换电动机的开关来调整小车的速度。这个方案的优点是电路相对比较简单,但是它的缺点也比较多,如:继电器的响应时间偏慢, 寿命较短,容易损坏,可靠性也不是很高。故决定放弃此方案。
方案二:采用L9110S双通道电机驱动模块,L9110S芯片是为控制和驱动电机设计的两通道推挽式功率放大专用集成电路器件,将分立电路集成在单片IC 之中,使外围器件成本降低,整机可靠性提高。该芯片有两个TTL/CMOS兼容电平的输入,具有良好的抗干扰性;两个输出端能直接驱动电机的正反向运动,它具有较大的电流驱动能力,每通道能通过800mA 的持续电流,峰值电流能力可达1.5A;同时它具有较低的输出饱和压降;内置的钳位二极管能释放感性负载的反向冲击电流,使它在驱动继电器、直流电机、步进电机或开关功率管的使用上安全可靠。
最终我们选择成本较低、具有良好的抗干扰性、较大电流驱动能力而且安全可靠的L9110S双通道电机驱动模块。
方案一:用漫反射式光电开关进行避障。光电开关的工作原理是根据光线发射头发出的光束,被物体反射,其接收电路据此做出判断反应,物体对红外光由同步回路选通而检测物体的有无。当有光线反射回来时,输出低电平。当没有光线反射回来时,输出高电平。操作简单但是测量的距离不远。
方案二:用超声波传感器进行测距避障。超声波传感器的原理是:超声波由压电陶瓷超声波传感器发出后,遇到障碍物便反射回来,然后再被超声波传感器接收。超声波传感器在避障的设计中被广泛应用。为了使用方便,便于操作和调试,采用集成超声波测距模块HC-SR04。
综合考虑本系统只需要检测障碍物,没有十分复杂的环境。为了使用的方便,便于操作和调试,最终选择了方案二。
方案一:用光敏电阻来探测。光敏电阻的阻值会随着周围环境光线的变化而变化。因此当光敏电阻在黑色轨迹的上方和白色轨迹的上方时,阻值会发生较为明显的变化。将阻值的变化值输入到电压比较器就可以输出高低电平。单片机就可以根据反馈来的不同的电平信号,发出相应的控制操作命令来控制小车的左转,右转,前进或者停止。但实际效果并不理想,误测几率偏大、容易受外界的光线环境的影响,不能够稳定的工作。因此考虑其它更加稳定的方案。
方案二:采用红外反射式光电管完成系统循迹。TCRT5000是一种一体化反射型光电探测器,传感器采用高发射功率红外光电二极管和高灵敏度光电晶体管组成,其发射器是一个砷化镓红外发光二极管,而接收器是一个高灵敏度,硅平面光电三极管。它是利用了光的反射原理,当光线照射在白纸上,反射量会比较大,反之,当光照射在黑色物体上,反射回去的量比较少,因为黑色会吸收光,这样就可以判断黑胶带带轨道的走向。采用红外线发射,外面可见光对接收信号的影响较小,利用红外对管对黑线边界进行检测,再用LM393对检测信号进行比较,取反,送单片机进行处理。此光电对管电路简单,工作性能稳定。
经测试方案二不论是在黑暗或者是强光照射下,智能小车系统均可以很稳定的工作,对外界环境的适应能力比较强,因此我们选择方案二。
方案一:采用柱极式话筒产生不同的频率信号来完成声音提示,柱极式话筒接收声波信号,通过三极管放大信号,使信号通过整流的二极管得到一个脉冲信号,并经过74HC04取反后供单片机控制,实现语音控制。但方案给人以提示的可懂性比较差。
方案二:采用DS1420可分段录放音模块,能够给人以直观的提示,也可以实现更多电平转换以让单片机控制,但DS1420录放音模块价格比较高,而且程序编制过程过于复杂。
方案三:采用离线语音模块SU-03T,这款模块对初学者特别友好,无需编程,不需要二次开发,通过厂家给的网站配置后即可使用,傻瓜式操作。而且这款模块的识别还是非常灵敏的,前端的界面设计的也非常好用。
综合来看,方案三所采用的离线语音模块SU-03T相对于柱极式话筒来说更智能、使用更方便,相对于DS1420语音模块,从价格反面也相对便宜,因此我们选择方案三。
此系统是以C51单片机为控制核心,处理执行各个外部传感器检测得到的电平信号,其中外部信号有三部分得到:循迹模块,避障模块和语音模块。最后把处理结果传递给小车电机,使得到相应效果。总体设计框图2-1。
图2-1 总体设计框图
本系统硬件主要有8大模块组成:单片机控制模块、红外对管循迹模块、超声波传感模块、舵机模块、电机驱动模块、电压转换模块、OLED显示模块和语音控制模块。
本模块采用51系列单片机作为核心处理器。单片机控制系统基本由最小系统和外围信号I/O口组成,其中最小系统包括电源(地),CPU时序电路(一般使用11.0592M或者12M和30P电容组成),复位电路。有了以上三块,单片机就能够正常工作。
AT89S51是一个低功耗,高性能厘米OS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。其应用范围广,性能良好,可用于解决复杂的控制问题。利用AT89S51的I/O端口对传感器信号进行实时判断监控来控制步进电机做出相应的反映。如图3-1是较为常见的单片机最小系统图。
图3-1单片机最小系统图
单片机的时钟产生有两种方法:内部时钟方式和外部时钟方式。
系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。AT89单片机内部有一个用于构成振荡器的高增益反相放大器。引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。外接晶体谐振器以及电容C8和C9构成并联谐振电路,接在放大器的反馈回路中。对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性。因此,此系统电路的晶体振荡器的值为11.0592MHz,电容应尽可能的选择陶瓷电容,电容值通常取30PF。在焊接刷电路板时,晶体振荡器和电容应尽可能安装得与单片机芯片靠近,以减少寄生电容,更好地保证震荡器稳定和可靠地工作。
复位电路主要用于控制单片机的启动状态。在单片机系统运行过程中,受到外界干扰而出现程序出错或直接死机、停止运行的时候,通过复位操作,单片机内部的烧录代码就会重新执行。片外复位是由外部的复位电路来实现的。片内复位电路是复位引脚RST通过一个触发器与复位电路相连,触发器用来抑制噪声,它的输出在每个机器周期中由复位电路采样一次。
复位电路通常采用上电自动复位和按钮复位两种方式。其中,STC89系列单片及为高电平复位,通常在复位引脚RST上连接一个电容到VCC,再连接一个电阻到GND,由此形成一个RC充放电回路保证单片机在上电时RST脚上有足够时间的高电平进行复位,随后回归到低电平进入正常工作状态,这个电阻和电容的典型值为10K和10uF.而按键复位就是在复位电容上并联一个开关,当开关按下时电容被放电、RST也被拉到高电平,而且由于电容的充电,会保持一段时间的高电平来使单片机复位。如图3-2是上电复位及按钮复位的一种实用电路。上电时,+5V电源立即对单片机芯片供电,同时经电阻R17对电容Cj3充电。RST上出现正脉冲使单片机实现了上电复位。按钮按下时,RST上同样出现高电平,实现了按钮复位。
图3-2 单片机复位电路
RST置高电平,然后向单片机串行发送编程命令。P1.7(SCK)输入移位脉冲,P1.6(MISO)串行输出,P1.5(MOSI)串行输入。被烧写的单片机一定是最小系统(单片机已经接好电源,晶振,可以运行)。如图3-3 烧写接口电路。
图 3-3单片机烧写接口电路
图3-4 TCRT5000红外循迹模块
1、采用TCRT5000红外反射传感器
2、检测反射距离: 1mm~25mm适用
3、比较器输出,信号干净,波形好,驱动能力强,超过15mA。
4、配电位器调节灵敏度
5、工作电压3.3V-5V
6、输出形式:数字开关量输出(0和1)
7、设有固定螺栓孔,方便安装
8、小板PCB尺寸: 3.2厘米x 1.4厘米
9、使用宽电压LM393比较器
TCRT5000传感器的红外发射二极管不断发射红外线,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,红外接收管--直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态;被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,红外接收管饱和,此时模块的输出端为低电平,指示二极管被点亮。
接线方式:
1、VCC:接电源正极 (3-5V)
2、GND:接电源负极
3、DO:TTL开关信号输出
4、AO:模拟信号输出(不同距离输出不同的电压,此脚一般可以不接)
循迹是指小车在白色地板上循黑线行走,本系统采取的方法是红外探测法,即利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色纸质地板时发生漫反射,反射光被装在小车上的接收管接收,传感器的DO引脚呈现低电平,二极管点亮;如果遇到黑线则红外光被吸收,小车上的接收管接收不到红外光,传感器的DO引脚呈现高电平,二极管熄灭。由此过程来改变接收管的输出电压,再经杜邦线将电压数字信号送至单片机特定的I/O引脚,单片机再以接收到的电压变化为依据来执行调整小车电机的工作,实现小车按照规定路线行走的功能。
图3-5为红外线循迹安装图,图3-6为循迹模块实现原理图,分析如下:
图 3-5 红外线循迹安装图
图 3-6循迹模块原理图
如图3-6是整个红外线循迹过程实现的原理图。四针接口处P3,P4的1,2脚是跟红外线发射管连接,3,4则是跟接收管相连,放置插针是为了更容易实现红外线管的放置。由于红外线接收光的变化可以让接收管上的电压发生变化,相当于可变电阻,这种特性为设计提供基本的保障。比较芯片LM393(LM358)可以根据接收管的电压和参考电压进行比较后输出相应电平。此图的比较接法为正接法,就是当红外线管遇到黑线时,反射减少,“+”端输入电压增加,使得输出端输出电压为高电平,经上拉电阻R12(R20)上拉后达到单片机有效接收的电平。小车进入循迹模式后,即单片机开始不停地扫描与探测器连接的单片机I/O口,一旦检测到某个I/O口有信号,即进入判断处理程序,先确定2个探测器中的哪一个探测到了黑线,如果左面传感器(红灯亮)探测到黑线,即小车左半部分压到黑线,车身向右偏出,此时应使小车向左转;如果右面传感器(黄灯亮)探测到了黑线,即车身右半部压住黑线,小车向左偏出了轨迹,则应使小车向右转。在经过了方向调整后,小车再继续向前行走,并继续探测黑线重复上述动作,实现方向控制,按照黑线行驶。其中, R11和R19为限流电阻,防止红外线发生管因电流过大而烧坏;由R14和一个可变电阻组成的电路为参考电压电路,由于检测小车行驶的过程会因环境或则黑线材料的改变使输出电压成一个变化值,所以通过可变电阻来改变参考电压,使能正常运行;同时R12和R20为上拉电阻,让输入单片机的电压达到单片机可接收的高电平;发光二极管则是能更直观的判断出哪对传感器在起作用。
双电压比较器电路—LM393,如图3-7 为LM393芯片原理结构图,表3-1 为LM393芯片引脚功能表。
图 3-7 LM393芯片原理结构图
引出端序号 | 功能 | 符号 | 引出端序号 | 功能 | 符号 |
1 | 输出端1 | OUT1 | 5 | 正向输入端2 | 1N+(2) |
2 | 反向输入端1 | 1N-(1) | 6 | 反向输入端2 | 1N-(2) |
3 | 正向输入端1 | 1N+(1) | 7 | 输出端2 | OUT2 |
4 | 地 | GND | 8 | 电源 | VCC |
表3-1 LM393芯片引脚功能表
本设计的超声波测距模块是专为智能小车设计的,适合小范围,小空间,封闭空间的场合。
图3-8 HC-SR04超声波传感器
VCC引脚:接VCC电源(直流3V-5.5V )。
Trig引脚:接外部电路的Tnig端,向此管脚输入一个10uS以上的高电平,可触发模块测距。
Ehco引脚:接外部电路的Echo端,当测距结束时,此管脚会输出一个高电平,电平宽度为超声波往返时间之和。
Gnd引脚:接外部电路的地。
第一步:通过IO口给Trig接口周期不小于10us的脉冲信号。
第二步:HC-SR04接收到单片机发来的脉冲信号后自动发送8个频率为4KHz的方波,自动检测是否有信号返回。
第三步:若有信号返回,则通过Echo接口向单片机相连的IO口发送一个高电平,高电平持续时间就是超声波从发射到返回的总时间。
超声波是一种频率比较高的声音,指向性强。超声波测距的原理是利用超声波在空气中的传播速度为已知,测量声波在发射后遇到障碍物反射回来的时间,根据发射和接收的时间差计算出发射点到障碍物的实际距离。假设高电平持续时间为T,声速为v(一般为340m/s),那么测到的距离S=(T*v)/2。由此可见,超声波测距原理与雷达原理是一样的。
当接收到HC -SR04通过Echo管脚输出的高电平脉冲后,便可进行下一-次测量,所以测量周期取决于测量距离,当距离被测物体很近时, Echo返回的脉冲宽度较窄,测量周期就很短;当距离被测物体比较远时, Echo返回的脉冲宽度较宽,测量周期也就相应的变长。最坏情况下,被测物体超出超声波模块的测量范围,此时返回的脉冲宽度最长,约为66ms ,所以最坏情况下的测量周期稍大于66ms即可(取70ms足够)。
图3-9 SG-90舵机
SG90舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。在机器人机电控制系统中,舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口。
黄线:PWM信号控制线
红线:VCC(电源线正极)
灰线:GND(电源线负极)
控制电路板接受来自信号线的控制信号,控制电机转动,电机带动一系列齿轮组,减速后传动至输出舵盘。舵机的输出轴和位置反馈电位计是相连的,舵盘转动的同时,带动位置反馈电位计,电位计将输出一个电压信号到控制电路板,进行反馈,然反馈电位计,电位计将输出一个电压信号到控制电路板,进行反馈,然后控制电路板根据所在位置决定电机的转动方向和速度,从而达到目标停止。
舵机的控制信号为周期是20毫秒的脉宽调制(PWM)信号,其中脉冲宽度从0.5毫秒-2.5毫秒,相对应舵盘的位置为0-180度,呈线性变化。也就是说,给它提供一定的脉宽,它的输出轴就会保持在一个相对应的角度上,无论外界转矩怎样改变,直到给它提供一个另外宽度的脉冲信号,它才会改变输出角度到新的对应的位置上。舵机内部有一个基准电路,产生周期20毫秒,宽度1.5毫秒的基准信号,有一个比较器,将外加信号与基准信号相比较,判断出方向和大小,从而产生电机的转动信号。舵机的频率一般为频率为50HZ,也就是一个20毫秒左右的时基脉冲,而脉冲的高电平部分一般为0.5毫秒-2.5毫秒范围,0.5毫秒-2.5毫秒的PWM波形的高电平部分对应控制180度舵机的0-180度。
0.5ms-------------0度; 2.5% 对应函数中占空比为250
1.0ms------------45度; 5.0% 对应函数中占空比为500
1.5ms------------90度; 7.5% 对应函数中占空比为750
2.0ms-----------135度; 10.0% 对应函数中占空比为1000
2.5ms-----------180度; 12.5% 对应函数中占空比为1250
图3-10 占空比与舵机角度的对应控制关系
图3-11 L9110S电机驱动模块
双L9110S芯片的电机驱动,该模块供电电压在2.5V到12V之间,适合的电机范围为工作电压在2.5V到12V之间的,最大工作电流0.8A,目前市面上的智能小车电压和电流都在此范围内。该电机驱动模块可以同时驱动2个直流电机,或一个4线2箱式步进电机。
L9110S模块的MOTORA、MOTORB分别控制着两个电机。
当B-1A为高电平,B-2A为低电平时,电机反转或正转
当B-1A为低电平,B-2A为高电平时,电机正转或反转
当B-1A为低电平,B-2A为低电平时,电机不转
驱动电机原理如图3-12所示
图3-12电机驱动原理
电机的正转和反转与跟电机的接线不同而不同,需要自己调试
本项目中采取的电机接线方式如图3-13所示。
图3-13电机接线方式
图3-14DC- DC电压转换模块
在该项目中许多模块的工作电压输入是3v-5v,而我们的电池盒提供的电压是12v,有可能会烧坏模块,而且实测的效果会大打折扣,所以我们需要使用DC-DC电压模块给循迹模块提供3v-5v的电压。
产品描述
1.一路输入:直流6V--12V (输入电压必须比要输出电压高1V以上);
2.三路输出: 3.3V(+-0.05v误差),5.0V(+-0.05v误差),800mA (负 载电流不能超过800ma) ,12V (输入12V直接转输出);
3.DC-IN和DC-IN/OUT是接在一起的,开关只对5V OUT和3V3 OUT起作用,对DC-IN/OUT不起作用;
4.双面板设计,布局美观大方;
5.特别设计2个排针固定孔,可直接固定在洞洞板上进行扩展实验;
6.输入输出使用多个排针,方便使用和连接;
7.带电源指示灯(红色)。
图3-15 0.96寸4针IIC接口OLED 显示屏模块
OLED (Organic Light- Emitting Diode)有机发光二极管又称为有机激光显示、OLED显示技术具有自发光的特性、采用非常薄的有机材料涂层、和玻璃基板、当有电流通过时、这些有机材料就会发光、而且0LED显示屏幕可视角大、功耗低OLED由于同时具备自发光、不需背光源(只上电是不会亮的、驱动程序和接正确才会点亮)、对比度高、厚度薄、视角广、反应速度快、可用于挠曲面板、使用温度范围广、结构及制程等优异之特性、先接触的1286屏都是LCD的、需要背光、功耗较高、而0LED的功耗低、更加适合小系统、由于两者发光材料的不同、在不同的环境中、OLED的 显示效果好、模块供电可以是3.3V也可以是5V、不需要修改模块电路、OLED屏具有多个控制指令、可以控制OLED的亮度、对比度、开关升压电路等指令、操作方便、功能丰富、可显示汉字、ASCI1、图案等,同时为了方便应用在产品上、预留4个M3固定孔、方便用户固定在机壳上。
引脚定义:
SDA:数据线
SCL:时钟线
VCC:电源正极
GND:地
对OLED写入的流程
图3-16
根据上图3-16,来写代码
1.start()
2.写入slave address
3.ack()
4..写入controlbyte
5.ack()
6.写入databyte
7.ack()
8.stop()
对OLED设置从机地址,设置为写入模式
图3-17手册
在写入slave address时,我们需要参考书册,从属地址遵循识别使用的开始条件。通过将SA0更改为低或高(D/C引脚充当SA0),从属地址为“b01111100”或“b0111101”作为SA0)(翻译内容)
图3-18 slave address
SA0我们可以置为0或1为从机地址,通过将R/W#位设置为逻辑“0”来建立写模式(翻译内容),我们RW#位需要写入0 设置为写入模式,则slave address 为 01111000,这样我们就设置好了OLED从机地址和写入模式。在完成对OLED slave address后 对control byte进行设置。
图3-19 Control byte
图3-20手册
对于co和D/c的写入我们需要参考手册,如果co设置为0,则后面只包含数据
D/c设置为0,为写入命令模式,如图3-21。
根据如上序列写代码:
图3-21对OLED写入命令函数
则当D/c位设置为1时为写入数据模式,如图3-22。
图3-22对OLED写入数据函数
图3-23 SU-03T离线语音模块
本项目的语音控制功能采用离线语音模块SU-03T,这款模块对初学者特别友好,无需编程,不需要二次开发,通过厂家给的网站配置后即可使用,傻瓜式操作。而且这款模块的识别还是非常灵敏的,前端的界面设计的也非常好用。离线语音模块SU-03T采用32bit RISC 内核,运行频率240M 并且 支持 DSP 指令集以及FPU浮点运算单元,RC 12MHz 时钟源和 PLL 锁相环时钟源,2个PWM 输出,1个12-bit SAR-ADC 最大 450Khz 采样率,支持 I2S input/output ,支持 5V 电源输入,SU-03T离线语音模块的各引脚示意图如图3-24。
图3-24 SU-03T引脚示意图
各引脚的功能如图
图3-25 SU-03T各引脚功能
SU-03T离线语音模块无需编程,只需登录厂家所提供的开发平台智能公元/AI/OT快速产品化平台,进入了配置界面之后,我们选择两个I/O口分别切换我们的循迹模式和避障模式,把语音模块的两个I/O口都设置为高电平。
图3-26 语音模块前端配置界面
接着配置语音模块的唤醒词,这里可以多配置几条,并且可以设置灵敏度。然后再定义应答语,根据自己的功能定义。接着再设置每种词条的命令,本项目中设置的是当说出某种词条的时候指定的I/O口输出低电平,如图3-27。
图3-27 语音模块前端配置界面
然后其余的设置都比较简单,根据自己的爱好选择音调,语速之类的。点击生成后就等待生成,大约半个小时左右生成完之后点击下载SDK,如图3-28,后续烧录的过程参考厂家提供的资料即可,我都会跟这个项目的源代码放在一起。
图3-28 语音模块前端配置界面
图3-29 SU-03T与串口转USB烧录器连接方式
使用杜邦线将串口转USB烧录器的数据传送针脚TXD、数据接收引脚RXD分别与SU-03T离线语音模块的数据接收引脚RXD和数据传送针脚TXD连接起来,如图3-29,打开烧录软件开始烧录,如图3-30为SDK的烧录过程。
图3-30 SDK烧录软件
软件设计是实现小车智能运转的关键所在,相当于人类大脑思维活动,通过软件设计可将各个变化信号数据有效的结合处理,产生相应的动作反应。在小车运行的控制过程中,我们采用模糊控制算法实现对小车样本训练。
模糊控制的控制过程,如果由人来实现,都是按照这样的一个顺序进行的:感觉器官的观测(获取信息)-----人脑的思维、判断(存储和处理信息)-----手动的调整(信息的实施)。本设计的模糊控制规则的建立方法是:智能小车通过经验和测试数据来建立模糊控制规则。其主要控制过程为:循迹单元的红外发射装置与避障单元的超声波发射装置发送信息,由收装置接收,接收装置相当于人的感觉器官获取信息传给单片机,单片机相当于人的大脑,可以存储和处理信息,通过训练样本库,测试出小车循迹最佳偏转角度,最佳避障距离等,包括其他的遥控信号、语音信号等,从而命令智能小车执行相应的操作,完成智能行驶。
本系统中小车通过电源开关启动后,先是处在停止状态中,通过if条件判断函数来实现离线语音模块对小车运行模式的切换控制,如果说出循迹模式,主函数将会调用循迹模式的子函数,使小车处于循迹模式,同时OLED显示屏上也会出现”xunji”;同样,如果说出避障模式,小车就会进入避障模式,同时OLED显示屏上出现”bizhang”。
图4-1 主程序流程图
本程序以汇编的形式编辑,结合硬件实现小车整个系统功能。小车以语音模块的if函数判断为主体,通过语音说出循迹模式或避障模式,实现循迹模式和避障模式的随时切换,并通过OLED显示模块显示小车的运行模式。此项目的主体程序如下:
图4-2 项目主程序及注释
项目中定义四个变量,用来表示电机驱动模块的四个控制引脚,通过给四个变量赋高低电平,来实现电机驱动模块的四个控制引脚对电机的控制作用,具体的代码实现如图4-3。
图4-3电机驱动程序代码
在该项目中我们定义变量tracingLeft和tracingRight通过单片机的I/O引脚接收TRCT5000传感器DO引脚发出来的电平状态,然后通过if条件判断函数调用电机驱动函数,来控制小车的前进、停止和向左向右转弯,以此实现小车的循迹功能。红外循迹原理在项目代码中的具体代码实现如图4-4。
图4-4项目循迹程序子函数
C51中的定时器和计数器是同一个硬件电路支持的,通过寄存器配置不同,就可以将他当做定时器或者计数器使用。确切的说,定时器和计数器区别是致使他们背后的计数存储器加1的信号不同。当配置为定时器使用时,每经过1个机器周期,计数存储器的值就加1。而当配置为计数器时,每来一个负跳变信号(信号从P3.4 或者P3.5引脚输入),就加1,以此达到计数的目的。标准C51有2个定时器/计数器:T0和T1。他们的使用方法一致,C52相比C51多了一个T2。定时器和计数器的电路相同,定时或者计数的本质就是让单片机某个部件数数。当定时器用的时候,单片机靠内部震荡电路数数,每经过一个机器周期,就加1,即寄存器;在当计数器用的时候,是靠数外面的信号,即读取针脚的数据。
晶振(晶体震荡器),又称数字电路的“心脏”,是各种电子产品里面必不可少的频率元器件。数字电路的所有工作都离不开时钟,晶振的好坏、晶振电路设计的好坏,会影响到整个系统的稳定性。
时钟周期也称为振荡周期,定义为时钟频率(晶振频率)的倒数。时钟周期是计算机中最基本的、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。时钟周期是一个时间的量。更小的时钟周期就意味着更高的工作频率。
机器周期也称为CPU周期。在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段(如取指、译码、执行等),每一阶段完成一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个时钟周期组成,定时器或计数器完成加1这一操作所花费的时间为一个机器周期。如图4-5为晶振频率、时钟周期、机器周期之间的关系转换图。当晶振频率是11.0592MHz的时候,等于11059.2KHz = 11059200Hz机器周期 = 12 x 时钟周期 =12 x (1/时钟频率) 秒 = 12 / 时钟频率 秒 = 12 / 11059200 秒 = 12 000 000 / 11059200 微秒 = 1.085 微秒。
图 4-5 晶振频率、时钟周期、机器周期之间的关系转换
TMOD是定时器、计数器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER),它是一个逐位定义的8位寄存器,如图4-6。但只能使用字节寻址,其字节地址为89H。
图4-6八位寄存器
其中低四位(即D0 ~ D3)定义定时器/计数器T0,高四位(即D4 ~ D7)定义定时器/计数器T1。定时器及TMOD寄存器工作原理如图4-7。
图 4-7 定时器/计数器及TMOD寄存器工作原理图
GATE----门控制:GATE=1时,“与门”的输出信号K由INTX输入电平和TRX位的状态一起决定(即此时K=TRX·INTX),当且仅当TRX=1,INTX=1(高电平)时,计数启动;否则,计数停止。GATE=0时,“或门”输出恒为1,“与门”的输出信号K由TRX决定(即此时K=TRX),定时器不受INTX输入电平的影响,由TRX直接控制定时器的启动和停止。
C/T----功能选择位:C/T=0时为定时功能,加1计数器对脉冲f进行计数,每来一个脉冲,计数器加1,直到计时器TFX满溢出;C/T=1时为计数功能,加1计数器对来自输入引脚T0(P3.4)和T1(P3.5)的外信号脉冲进行计数,每来一个脉冲,计数器加1,直到计时器TFX满溢出;
M1、M0----方式选择功能:C51的定时器T0有4种工作方式:方式0,方式1,方式2,方式3;C51的定时器T1有3种工作方式:方式0,方式1,方式2。不同取值对应不同的工作方式及功能,如表4-1所示。
M1 | M0 | 工作方式 | 功能说明 |
0 | 0 | 方式0 | 13位定时器/计数器 |
0 | 1 | 方式1 | 16位定时器/计数器 |
1 | 0 | 方式2 | 自动重载8位定时器/计数器 |
1 | 1 | 方式3 | T0分为2个8位独立计数器,T1无方式3 |
表4-1不同取值对应不同的工作方式及功能
由于定时器/计数器的功能是由软件编程确定的,所以一般在使用定时/计数器前都要对其进行初始化,使其按设定的功能工作。初始化的步骤一般如下:
1、确定工作方式(即对TMOD赋值);
2、预置定时或计数的初值(可直接将初值写入TH0、TL0或TH1、TL1);
3、根据需要开放定时器/计数器的中断(直接对IE位赋值);
4、启动定时器/计数器(若已规定用软件启动,则可把TR0或TR1置“1”;若已规定由外中断引脚电平启动,则需给外引脚加启动电平。当实现了启动要求后,定时器即按规定的工作方式和初值开始计数或定时)。
具体在该项目中的实现方法采用I/O触发测距,在代码中通过延时函数向超声波传感器触发信号输入端(Trig)输入一个10微秒以上的高电平信号,使超声波传感器发送口收到信号自动发送8个40Hz方波,同时启动定时器,待超声波传感器接收到回波时(触发信号输入端Trig维持10微妙的高电平表明超声波传感器开始发送方波,同时数据输出引脚Echo由低电平转换为高电平,当传感器收到回波的时候Echo引脚由高电平转换为低电平),传感器通过它的数据输出引脚(Echo)向单片机输出回响信号使单片机停止计时器的计时,回响信号脉冲宽度与所测距离正比,如图4-9所示。该项目代码中用到while循环函数,通过CPU的查询方式实现单片机通过I/O口检测Echo引脚的输出电平信号变化,从而完成定时器的开关的操作。最后根据时间间隔可以计算距离,公式:距离=(高电平时间*声速)/2。代码中使用定时器T1为超声波传感器数据输出引脚Echo的高电平持续时间计时,计时结束后,将工作在工作方式1的16位定时器存储在高八位数值寄存器的数值乘以进制数256加上存储在低八位数值寄存器的数值得到定时器T1的计时总值,然后乘以该项目中51单片机的机器周期,得到真实的计时时长。在该项目中的具体代码实现如图4-8。
图4-8超声波传感器开启函数、超声波测距函数
图4-9超声波测距流程图
图4-10 超声波时序图
当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程为中断。实现这种功能的部件称为中断系统,请示CPU中断的请求源称为中断源。微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求。
与中断有关的寄存器
1.定时器控制寄存器(TCON)
TCON(88H) | ||||||||
地址 | 8FH | 8EH | 8DH | 8CH | 8BH | 8AH | 89H | 88H |
符号 | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
表4-2
TF1:定时器/计时器T1的溢出中断请求标志位。当计数器T1最高位产生溢出时,由硬件使TF1置1,并向CPU发出中断请求。CPU响应中断时,硬件将自动对TF1清0。
TF0:定时器/计时器T0的溢出中断请求标志位。
TR1:定时器1的运行控制位。TR1=1,启动定时器1;TR1=0,关闭定时器1。
TR0:定时器0的运行控制位。
IE1:外部中断1的中断请求标志。当检测当外部中断引脚1上存在有效的中断请求信号时,由硬件将IE1置1.当CPU响应中断请求时,由硬件使IE1清0。
IE0:外部中断0的中断请求标志。
IT1:外部中断1的中断触发方式控制位。IT1=1时,外部中断1为边缘触发方式,下降沿有效;IT1=0时,外部中断1为电平触发方式,低电平有效。
IT0:外部中断0的中断触发方式控制位
2.串行口控制寄存器(SCON)
SCON(98H) | ||||||||
地址 | 9FH | 9EH | 9DH | 9CH | 9BH | 9AH | 99H | 98H |
符号 | TI | RI |
表4-3
TI:串行口发送中断请求标志。CPU将一个数据写入发送缓冲器SBUF时,就启动发送。发送完一帧串行数据后,硬件置位TI。CPU相应中断时,不会自动清除TI,需在中断服务子程序由软件清零。
RI:串行口接收中断请求标志。在串行口允许接收时,每接收完一个才行帧,硬件置位RI。CPU响应中断时不会自动清除RI,需软件清零。
3.中断允许寄存器(IE)
IE(0A8H) | ||||||||
地址 | 0AFH | 0AEH | 0ADH | 01CH | 0ABH | 0AAH | 0A9H | 0A8H |
符号 | EA | 保留 | ET2 | ES | ET1 | EX1 | ET0 | EX0 |
表4-4
EA:中断允许总控制位。EA=1,启用所有中断;EA=0,屏蔽所有中断。
ES:串行口中断允许位。ES=1,允许串行口中断;ES=0,禁止串行口中断。
EX1:外部中断1中断允许位。EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。
EX0:外部中断0中断允许位。EX0=1,允许外部中断0中断;EX0=0,禁止外部中断0中断。
ET2:定时器/计数器T2的溢出中断允许位。ET2=1,允许T2中断;ET2=0,禁止T2中断。
ET1:定时器/计数器T1的溢出中断允许位。
ET0:定时器/计数器T0的溢出中断允许位。
4.中断优先级寄存器(IP)
80C51有两个中断优先级,即高优先级和低优先级。中断优先级寄存器IP中有各个中断的优先级控制位,控制位为1,相应的中断源则为高级中断,控制位为0,相应的中断源则为低级中断。IP的格式如下:
IP(0B8H) | ||||||||
地址 | 0BFH | 0BEH | 0BDH | 0BCH | 0BBH | 0BAH | 0B9H | 0B8H |
符号 | 保留 | 保留 | PT2 | PS | PT1 | PX1 | PT0 | PX0 |
表4-5
PT2、PS、PT1、PX1、PT0、PX0分别是定时器/计时器2、串行口中断、定时器/计时器1、外部中断1、定时器/计时器0、外部中断0的优先级控制位。在同一优先级的中断请求遵循自然优先级。
中断源 | 中断标志位 | 自然优先级 | 入口地址 |
外部中断0 | IE0 | 最高 | 0003H |
定时器/计时器0 | TF0 | 第2 | 000BH |
外部中断1 | IE1 | 第3 | 0013H |
定时器/计时器1 | TF1 | 第4 | 001BH |
串行口中断 | RI或TI | 第5 | 0023H |
定时器/计时器2 | TF2或EXF2 | 最低 | 002BH |
表4-6
如图4-11定时器的工作原理图,TLX 和 THX,分别为定时器X的低位数值寄存器和高位数值寄存器。在这个里拥有一个计数系统,高字节叫做 TH,低字节叫做 TL,0 代表的是定时器 0,1代表定时器1,以工作在工作方式1的定时器为例,则TLX和THX分别为低八位数值寄存器和高八位数值寄存器,这两个八位字节的寄存器总共可以计数到 65535 ,当加到 65535 的时候,那么再下一个脉冲的时候它就会产生一个溢出,溢出的时候这个计数器就会到原来0的一个位置,同时来自定时器的中断源使TCON寄存器的中断标志位TFX置1,定时器向中断系统申请中断。如图4-11为程序运行中遇到中断时的工作机制。
图4-11 程序运行流程图
PWM ,英文名 Pulse Width ModulatI/On ,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如,一个4毫秒的周期里,低电平时长为3毫秒,高电平时长为1毫秒,那么这个周期的占空比为25%。
单片机的I/O口输出的是不连续变化的数字信号,即只能输出高电平和低电平,假设高电平为5V 低电平为0V, 那么我们要输出不同的模拟电压,就要用到PWM,PWM主要是通过占空比编码模拟信号,即通过改变单片机I/O口输出的方波的占空比从而获得使用数字信号模拟成的模拟电压信号。
我们知道,电压是以一种连接是1或断开是0的重复脉冲序列被加到模拟负载上去的(例如LED灯,直流电机等),连接即是直流供电输出,断开即是直流供电断开。通过对连接和断开时间的控制,理论上来讲,可以输出任意不大于最大电压值(即0~5V之间任意大小)的模拟电压。比方说,占空比为50%,那就是高电平时间一半,低电平时间一半,在一定的频率下,就可以得到模拟的2.5V输出电压,那么75%的占空比得到的模拟电压就是3.75V。如图4-12为不同占空比所获得的不同数值的模拟电压。
图4-12 不同占空比所获得的不同数值的模拟电压
PWM的调节作用来源于对“占周期”的宽度控制,“占周期”变宽,输出的能量就会提高,通过阻容变换电路所得到的平均电压值也会上升,“占周期”变窄,输出的电压信号的电压平均值就会降低,通过阻容变换电路所得到的平均电压值也会下降,也就是,在一定的频率下,通过不同的占空比 即可得到不同的输出模拟电压,PWM就是通过这种原理实现数/模转换的。
PWM实现的原理是通过锯齿波/三角波(载波)所需要合成的波形(调制波)进行比较,然后确定PWM所需要输出的极性,通常是ON或者是OFF,因为一般都是作用到开关元器件上,如下图所示:
图4-13
振荡器输出的锯齿波和参考值进行比较,然后就可以输出PWM波形了。
图4-14 PWM电路
最终输出PWM波形如下:
图4-15 PWM波的形成
图中锯齿波最大值为10,参考值给定5,那么通过比较,当锯齿波小于5时,PWM输出低电平,即为OFF;当锯齿波大于5时,PWM输出高电平,即为ON。由此得出最终输出波形,PWM波的周期通常和载波的周期相同。由此延伸,如果想要获得一个逐渐升高的模拟电压,我们可以使占空比逐渐升高,那么一个周期内高电平所占的比例就会增加,因此可以将参考值逐渐降低即可。在具体的实际应用中,PWM波通过芯片内部模块输出,一般观察手册或者芯片I/O口都会标明这个是否是PWM口;如果没有集成PWM功能,可以通过I/O口软件模拟,但是相对硬件PWM功能来说,其精准度略差。
项目中定时器T0溢出次数cnt对应angle,cnt是通过定时器T0每定时0.5毫秒溢出加1,而angle是人为规定的参考量,每增加0.5毫秒的脉冲,angle相对应加1。
以180度的舵机为例,那么对应的控制关系是这样的:
0.5毫秒-------------0度-------angle=1;
1.0毫秒------------45度-------angle=2;
1.5毫秒------------90度-------angle=3;
2.0毫秒-----------135度-------angle=4;
2.5毫秒-----------180度-------angle=5;
在该项目中,用单片机I/O口软件模拟模拟PWM波的输出,具体操作为定义变量angle,在定时器0的中断函数程序中,angle作为参考线,用定时器T0定时0.5毫秒,溢出40次为一个周期,即20毫秒,与PWM波的周期一致,作为SG90舵机的外加信号,通过if 函数比较cnt与angle的大小关系,以此来给定义为sg90的引脚赋高电平或者低电平,从而形成占空比不同的模拟PWM波。具体代码实现如图4-16、图4-17所示。
图4-16 定时器T0定时0.5毫秒
图4-17 定时器T0模拟PWM波输出
图4-18项目避障程序及注释
IIC(Inter-Integrated Circuit)总线是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。在 CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送,高速 IIC 总线一般可达 400kbps 以上。
图4-19 IIC总线物理拓扑图
I2C 总线在物理连接上非常简单,分别由SDA(双向串行数据线)和SCL(串行时钟线)及上拉电阻组成。SDA(Serial data)是数据线,D代表Data也就是数据,Send Data 也就是用来传输数据的,SCL(Serial clock line)是时钟线,C代表Clock 也就是时钟 也就是控制数据发送的时序的。
通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,SCL和SDA被上拉电阻Rp拉高,使SDA和SCL线都保持高电平。
I2C通信方式为半双工,只有一根SDA线,同一时间只可以单向通信,485也为半双工,SPI和uart通信为全双工。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。I2C总线上的每个设备都自己一个唯一的地址,来确保不同设备之间访问的准确性。
通常我们为了方便把IIC设备分为主设备和从设备,基本上谁控制时钟线(即控制SCL的电平高低变换)谁就是主设备。
IIC主设备功能:主要产生时钟,产生起始信号和停止信号
IIC从设备功能:可编程的IIC地址检测,停止位检测
IIC的一个优点是它支持多主控(multimastering), 其中任何一个能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。
SCL和SDA都需要接上拉电阻 (大小由速度和容性负载决定一般在3.3K-10K之间) 保证数据的稳定性,减少干扰。为了避免总线信号的混乱,要求各设备连接到总线的输出端时必须是漏极开路(OD)输出或集电极开路(OC)输出。
IIC的高阻态:漏极开路(Open Drain)即高阻状态,适用于输入/输出,其可独立输入/输出低电平和高阻状态,若需要产生高电平,则需使用外部上拉电阻。
高阻状态:高阻状态是三态门电路的一种状态。逻辑门的输出除有高、低电平两种状态外,还有第三种状态——高阻状态的门电路。电路分析时高阻态可做开路理解。
我们知道IIC的所有设备是接在一根总线上的,那么我们进行通信的时候往往只是几个设备进行通信,为了避免总线信号的混乱,IIC的空闲状态只能有外部上拉, 而此时空闲设备被拉到了高阻态,也就是相当于断路, 整个IIC总线只有开启了的设备才会正常进行通信,而不会干扰到其他设备。
I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据。CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。
开始信号:SCL处于高电平时,SDA从高电平转向低电平,表示一个开始信号。如图4-20。
图4-20起始信号时序图
项目代码中先将SDA和SCL拉高,延时函数给硬件一定时间反应,然后再将SDA拉低,实现SDA由高到低的转变,再接延时函数给硬件一定时间反应,最后将时钟线SCL拉低为后面IICsendByte()实现输出(写)一个字节做准备。如图4-21。
图4-21开始信号代码图
停止信号:SCL处于高电平时,SDA从低电平转向高电平,表示一个停止信号。如图4-22。
图4-22终止信号时序图
项目代码中先将SCL拉高,SDA拉低,延时函数给硬件一定时间反应,然后再将SDA拉高,实现SDA由低到高的转变,再接延时函数给硬件一定时间反应,最后将时钟线SCL拉低。 如图4-23。
图4-23终止信号代码图
应答信号:每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据。只需将主机SCL线拉高,读取从机SDA线的电平,如果为低电平表示产生应答。应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。
图4-24应答信号时序图
每发送一个字节(8个bit)在一个字节传输的8个时钟后的第九个时钟期间,接收器接收数据后必须回一个ACK应答信号给发送器,这样才能进行数据传输。应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,如图4-25。
图4-25 IIC通信时序图
SDA线上的数据在SCL时钟“高”期间必须是稳定的,只有当SCL线上的时钟信号为低时,数据线上的“高”或“低”状态才可以改变。输出到SDA线上的每个字节必须是8位,数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。当一个字节按数据位从高位到低位的顺序传输完后,紧接着从设备将拉低SDA线,回传给主设备一个应答位ACK, 此时才认为一个字节真正的被传输完成 ,如果一段时间内没有收到从机的应答信号,则自动认为从机已正确接收到数据。如图4-26。
图4-26 IIC通信时序图
发送字节函数:函数定义了一个形式参数wd,用来实现后面器件总地址、控制字节、数据的发送,IIC总线以字节为单位传送数据,一个字节由8位二进制数组成,该函数通过(bit)(wd&0x80)实现强制转换为该字节的最高位,又通过wd<<=1非循环左移实现字节的每一位都能在一次循环中作为最高位输出,从而实现一个字节的输出。在IIC_Start()函数结束之前我们已经将SCL线拉低,此时在此函数中可以向SDA线上写入数据,两个_nop_()延时之后,再将SCL拉高,此时数据开始传送,延时之后再将SCL线拉低为下一次循环做准备,如此循环8次,就可以将一个字节中的8个二进制代码发送完成,从而实现一个字节的发送输出。发送完一个字节之后,等待4us延时,将SDA(PCF8591在收到每个字节之后,置SDA为低电平作为确认应答,所以需要先将其拉高)、SCL(当其为1时才能传送数据)拉高等待PCF8591的应答,并将SDA的状态赋值给IIC_ERROR,用于后面DAC_PCF8591函数判断是否将字节正确发送以便决定是否执行其他操作,之后将SCL置0以便继续使用发送字节函数发送其他字节。
图4-27发送字节函数代码图
指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。
指针描述了数据在内存中的位置,标示了一个占据存储空间的实体,在这一段空间起始位置的相对距离值。在 C/C++语言中,指针一般被认为是指针变量,指针变量的内容存储的是其指向的对象的首地址,指向的对象可以是变量(指针变量也是变量),数组,函数等占据存储空间的实体。
在计算机中,所有的数据都是存放在存储器中的,不同的数据类型占有的内存空间的大小各不相同。内存是以字节为单位的连续编址空间,每一个字节单元对应着一个独一的编号,这个编号被称为内存单元的地址。比如:int 类型占 4 个字节,char 类型占 1 个字节等。系统在内存中,为变量分配存储空间的首个字节单元的地址,称之为该变量的地址。地址用来标识每一个存储单元,方便用户对存储单元中的数据进行正确的访问。在高级语言中地址形象地称为指针。
指针相对于一个内存单元来说,指的是单元的地址,该单元的内容里面存放的是数据。在 C 语言中,允许用指针变量来存放指针,因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。
图4-28 OLED显示字符串函数
参数1:rows,起点列坐标,0~127
参数2:columns,起点行坐标,0~7
参数3:*str,字符串指针
可以在这块屏幕上显示四行(01为第一行、23为第二行、45为第三行、67为第四行)通过这四行的又分为128列。‘\0'是结束字符,项目代码中使用while()条件循环语句,调用OLED显示字节子函数oledShowByte()如图4-29,使字符串能够完整显示出来,其中循环条件判断语句*str != '\0',解释为当指针*str不等于结束字符时,一直执行循环体的内容。
图4-29 OLED显示字节子函数
本系统的调试共分为三大部分:硬件调试,软件调试和软硬件联调。由于在系统设计中采用模块设计法,所以方便对各电路模块功能进行逐级测试:单片机控制模块的调试、红外对管循迹模块的调试、超声波避障模块的调试以及电机控制模块和语音控制模块的调试,最后将各模块组合后结合软件进行整体测试。
对各个模块的功能进行调试,主要调试各模块能否实现指定的功能。
此模块调试实现的功能是结合软件共同实现,当连接单片机与电机控制芯片的I/0加上一定的电平可以实现电机左右转向,前后转向以及停止等功能,同时通过程序延时降低电机转速。如表5-1为电机测试记录。
P3.2 | P3.3 | P3.4 | P3.5 | 小车行驶状态 |
1 | 0 | 1 | 0 | 小车向前行驶 |
0 | 1 | 0 | 1 | 小车向后行驶 |
1 | 0 | 0(1) | 0(1) | 小车向前左转 |
0(1) | 0(1) | 1 | 0 | 小车向前右转 |
0 | 1 | 0(1) | 0(1) | 小车向左后退 |
0(1) | 0(1) | 0 | 1 | 小车向右后退 |
0(1) | 0(1) | 0(1) | 0(1) | 小车停止行驶 |
表5-1 电机测试记录
循迹对管有两个组成,所以分别调试其两路有效信号。当两对管都放置黑线之外的白色地板上时,单片机对应I/O口收到的电平都为低,输入电压为0.3V左右,当左边的红外线管进入黑线范围,对应电平变高,为4.2V左右,同时指示灯熄灭,说明要控制小车左转;当在右边时同左边情况对应,需控制右转。其中选取八次硬件测试记录如下表5-2。
测试次数 | 第1次 | 第2次 | 第3次 | 第4次 | 第5次 | 第6次 | 第7次 | 第8次 |
放置位置 | 双管黑线上 | 左管黑线上 | 右管黑线上 | 左管黑线上 | 双管黑线上 | 双管黑线外 | 左管黑线上 | 右管黑线上 |
放置距离 | 3厘米 | 2厘米 | 2厘米 | 3厘米 | 5厘米 | 2厘米 | 7厘米 | 4厘米 |
P1.5电压 | 4.31V | 4.12V | 0.32V | 4.15V | 4.21V | 0.21V | 0.12V | 0.21V |
P1.6电压 | 4.18V | 0.25V | 4.25V | 0.30V | 4.30V | 0.18V | 0.21V | 4.23V |
表5-2 循迹硬件测试记录
由上表可以看出小车的循迹红外线管只要放置在离地面4厘米之内一般都可以实现信号的输出,而实际车头离地面的距离也只有2-4厘米,可以实现有效控制,如果红外循迹功能模块对黑白颜色的识别不太灵敏,我们通过用梅花螺丝刀调节电位器,该问题就可解决,达到综合效果。
当接收到HC -SR04通过Echo管脚输出的高电平脉冲后,便可进行下一次测量,所以测量周期取决于测量距离,当距离被测物体很近时, Echo返回的脉冲宽度较窄,测量周期就很短;当距离被测物体比较远时, Echo返回的脉冲宽度较宽,测量周期也就相应的变长。表5-3 避障数据测试记录情况。
测试次数 | 第1次 | 第2次 | 第3次 | 第4次 | 第5次 |
放置距离 | 30厘米 | 20厘米 | 25厘米 | 50厘米 | 35厘米 |
Echo返回的 脉冲宽度 | 1.8厘米 | 1.2厘米 | 1.5厘米 | 3厘米 | 2.1厘米 |
表5-3超声波硬件测试记录
由上表可以看出,超声波传感器的放置距离越远,Echo返回的脉冲宽度越宽,测量周期越长;反之测量周期越短。
登录厂家所提供的开发平台,配置好语音设置下载SDK并烧入离线语音模块之后,进行如下表表5-4语音灵敏度及功能测试。
测试次数 | 第1次 | 第2次 | 第3次 | 第4次 | 第5次 |
语音输入 | 你好小秦 | 进入避障模式 | 进入循迹模式 | 进入避障模式 | 再见 |
语音反馈 | 在的 | 进入避障模式 | 进入循迹模式 | 进入避障模式 | 再见 |
A26引脚电压值 | 4.70V | 0.40V | 4.30V | 0.66V | 4.67V |
A27引脚电压值 | 4.56V | 4.80V | 0.50V | 4.67V | 4.85V |
表5-4语音灵敏度及功能测试
由表5-4可知,当离线语音模块SU-03T识别到特定的语音内容时,模块的A26引脚和A27引脚输出电平的高低与我们前期在前端的开发平台所设置的一样,呈现低电平状态,其余时间呈现高电平状态。
软件调试采用KeiluVision5编译软件,将编好的程序进行调试,主要是检查语法错误并确认硬件完整无误。由于本系统是分模块进行程序设计的,所以调试时先分模块进行调试。如小车红外线循迹程序,在调试时将它放在一个子程序里单独测试,看其是否能够完成预定的功能,如能,测试通过,否则,修改并反复测试直到通过。在软件的调试过程中,综合利用了设定断点、单步、跟踪等调试手段,使得调试工作更易进行。单片机程序烧录我们使用的是stc-isp-15xx-v6.87H,将单片机通过购买的接口线与电脑USB接口相连接时,发现烧录软件不显示串口号,在错误的排错方向下,对电脑的硬件接口选项进行了一系列设置,结果问题没有解决,于是我换了一种思路,使用串口转USB烧录器进行尝试,问题得到解决,最后经过商家确认,我所购买的是单片机电源线,而不是下载线。另外,在选择单片机型号时,我们选择的STC89C51,结果在烧录过程中发现无法烧录,通过查看所购买的单片机芯片型号,最终将型号改为STC89C51RC之后,程序烧录失败问题得以解决。
各模块都调试通过之后,将各个模块连接起来与硬件结合进行联合调试。在进行联合调试时,经过反复的实验,不断的来修改参数来完善结果。使程序按照要求设计的要求进行。
元器件 | 数量 | 元器件 | 数量 | 元器件 | 数量 |
STC89C51芯片 | 1 | 超声波测距模块 | 1 | 普通电机 | 2 |
HG7881电机驱动模块 | 1 | SU-03T离线语音模块 | 1 | 车轮 | 2 |
多路DC-DC电压转换模块 | 1 | SG90舵机 | 1 | 杜邦线 | 若干 |
HC-SR04超声波传感器支架 | 1 | 0.96寸4针IIC接口OLED 显示屏模块 | 1 | 12V锂电池 | 1 |
TCRT5000红外反射传感器模块 | 2 | 小车底盘 | 1 | 电源电池盒 | 1 |
51单片机最小系统开发板 | 1 | 热熔胶枪 | 1 | 排针 | 若干 |
本系统采用MSC-51系列单片机STC89C51、L9110S电机控制芯片、红外避障传感器、超声波传感器和OLED显示屏等主要模块来设计智能小车,实现了小车通过语音控制实现自动避障与自动循迹功能的任意切换功能。系统不足之处为小车的速度不好控制。这是由于PWM调速功能需要用到定时器软件模拟PWM波,受定时器数量所限,单片机的两个定时器功能T0、T1在项目代码中需要用来实现PWM波控制舵机和定时测距功能,若要改进,只需更换单片机芯片重新编程即可;除此之外,可见光对于本系统也有影响,不过一般影响不大,但是若要精确的采集数据,可以利用滤波器将红外光之外的其他频率的光线滤除。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。