大三的时候给大四学长做的毕业设计题目
伴随着人工智能的火爆和工业自动化的不断发展,例如一些家居智能机器人的自动避障和视觉识别的需要,测距与识别技术变得越来越重要。测距方式包括接触式和非接触式测量 [1] 。用非接触式测量去测量有毒或有腐蚀性化学物质的液位、公路行驶车辆间间的距离、测量湍急江河湖海水位等比较极端或恶劣的工作环境,更能保障操作人员的人身安全 [2] 。而且能实时测量 [3] 。在近几十年来非接触式测距仪技术的发展迅速。
常用的非接触式测距的方法有红外线、激光、超声波等 1^ 。红外测距的优点是安全、便宜、缺点是精度不够高、且方向性差。激光测距精度虽较高,而且操作相对简单,但后期维护麻烦、并且易受环境影响 6] ;将超声波利用在测距上有许多优点。超声波指向性好,可在空气、液体或固体中传播,在介质中的传播速度比较恒定;传播时间较长,易于检测往返时间;电磁波对其影响小;对光线敏感度小,可在工作没有光线和空气混浊等恶劣环境;超声波传感器已有许多集成方案、结构简单、成本低,使用方便 [7] 。所以超声波测距得到更多人们的重视,被广泛运用于各个需要测距识别的场合,遍布各行业领域与日常生活。例如,液位测量、机器人避障、建筑测量、自动化加工装配、汽车倒车等领域 [8] 。
面对多元的市场需求以及精益求精的测量性能要求,如何打破许多实际应用的局限性和提高测距精度、减小测量盲区是当前超声波测距设备研究的重点所在。本设计MCU选用功耗低、体积小、性价比高、频率高(最高可达24MHz)的STM8系列芯片 [9] 。使用MCU内部的定时器计时,更准确的捕捉超声波传播时间,并添加温度补偿等以提高测距精度 [10] 。体积小、结果显示直观等特点更适用于各种场合。
本毕业设计的主要任务是设计一款以STM8单片机为核心的用于测量距离的超声波测距仪,测量距离在5cm到400cm、精度为1cm,测量结果可以显示在OLED屏幕上;并可以通过蜂鸣器、LED灯提示预警,此外还可以通过按键控制预设预警值;加入温度传感器测量实时温度,用软件进行温度补偿,以提高测量精度。主要完成的工作有阅读相关文献,查找一些参考资料,分析现有产品的优缺点。根据设计要实现的功能确定出大概的硬件框架,自学Altium Designer软件后绘制本设计的原理图、LAYOUT,打板焊接元件,测试硬件无误后开始编写、调试、优化程序。最后测试实物性能数据并总结分析。论文各章节安排如下:第一章绪论介绍了设计研究内容、背景及意义,介绍了设计的主要研究内容以及完成了哪些工作,第二章简单介绍了超声波的一些基本理论和测距的基本理论;介绍设计的总体框架和介绍主要器件特性。第三章详细地介绍与分析设计的硬件电路,第四章介绍程序的设计。第五章介绍了对设计出的实物进行调试,对遇到的问题的解决方法以及测试结果,第六章是对整个设计的总结与展望。
超声波是频率高于20KHZ的声波,物质振动产生声波,声波的传输需要介质。超声波属于声波,所以也具有声波传播时反射、折射、衍射等基本物理特性。而且传播时也具有良好的束射性、方向性;具有穿透性强、衰减小、反射能力强的特点 [11] 。
按照质点振动方向与波的传播方向超声波可分为纵波和横波,横波只可以在固体介质中传播。固体介质表面受到交替变化的表面张力作用时便会产生表面波,质点对应的进行纵横向的往复运动。质点振动产生的波动只能沿固体介质表面传播。
超声波传播的速度c,跟介质有很大关系。忽略空气中的灰尘悬浮物和水蒸气等的影响,超声波空气里传播的介质为气体,气体只能传播纵波。气压气温、环境湿度等因素会影响超声波的传播速度,其中温度的影响最大,一般情况下温度每变化1摄氏度,声速变化0.607m/s [12] 。几种不同温度下的声速如下表2-1所示。
表2-1 声速随温度变化表
温度(℃) | -30 | -20 | -10 | 0 | 10 | 20 | 30 | 50 |
---|---|---|---|---|---|---|---|---|
声速(m/s) | 313.3 | 319.9 | 325.5 | 331.5 | 337.6 | 344.0 | 349.1 | 361.5 |
考虑温度对声速的影响,在空气介质中,超声波的传播速度c可修正为:
式中,T表示当前温度值,单位为摄氏度。
超声传感器也叫超声换能器,按照原理可分为压电式、磁致伸缩式、电磁式等。压电式超声换能器的使用比较广泛。压电式超声波是利用逆压电效应产生超声波,而对超声波接收是利用正压电效应原理。
超声波测距有渡越时间检测法。相位检测法、声波幅值检测法等。相位检测法的原理将发送的超声波信号作为参考信号,将接收器的输入进行采样并跟参考信号进行比较,对比其峰值出现的时间点。目前使用这种方法测距的精度高,但算法程序较复杂,实时效果不好、测量范围有限。根据超声波在空气中传播会衰减的特性的原理,可以检测接受到的信号的幅值,对往返时间差做一个判断,这种方法抗干扰性差,测距精度不高。渡越时间检测法是通过检测发出信号与接收信号过程的时间差,并根据声速的传播速度去测量计算,这种工作方式软硬件都比较简单、成本价格低,可测量范围大。但渡越时间法在短距离范围内会有一定的盲区。
经综合考量,本设计选用渡越时间法作为测距方法。检测从发射传感器发射超声脉冲,经气体介质传播遇到物体被反射回来,并被另一只探头所接收超声波的时间差, 即渡越时间。测量原理图如下图2-1所示。
图2-1 渡越时间测量原理图
式中,S表示探头与测量目标的距离,c表示声速,t表示渡越时间。
又由图中可看出:
式中,L为测量距离。
如果S远大于d,则L约等于S。本设计的两探头的间距很小,可以忽略不计,所以测量距离L=S,这样就能检测距离了。
设计一个模块化的产品,要求在使用中安全、准确、稳定,同时也要易于维护更新。电源采用5V直流电源输入、功耗小、电流小,符合人体安全耐受值;设计选用时钟频率较高的MCU、考虑温度补偿、程序上用高精度算法等方面来减小误差,以确保设计的准确性;为了保证可以仪器的长期稳定运行,在设计中选用高于其需要参数的器件,在进行LAYOUT设计时,合理地排版布局排版和注意连线宽细,尽可能加粗电源线与地线的宽度,减少环路。PCB上大面积敷铜,考虑电路散热问题,在PCB版图上大面积敷铜,并且铺铜还可以屏蔽电路板的信号间的干扰,提高电路稳定性。注意电磁兼容等问题;同时在能实现功能和保证性能的前提之下,也要让电路尽量的简洁。
本设计由MCU单元、超声波模块、测温单元、按键单元、显示单元和指示单元,超声波测距仪设计的系统结构框图如图2-2所示。
图2-2 设计系统结构框图
MCU单元控制整个电路的运行,MCU单元给超声波发射一个大于10us的高电平,超声波模块HC-SR04接收到后发送频率40KHz的超声波信号,若遇到障碍物反射回来,HC-SR04通过ECHO口给MCU一高电平反馈,高电平延续的时间就是超声波往返的时间,。同时通过温度传感器DS18B20实时测量环境温度,两者的数据传给MCU后,MCU对数据进行分析处理,再通过OLED屏显示出来,根据测量值有不同的指示灯指示(未检测到目标时亮黄灯、目标在安全距离时亮绿灯、目标距离过近时亮红灯),到达预警值的时候会有蜂鸣器提醒。此外可以通过按键调整预警距离,同时电源部分采用5V稳压直流电源,可由自锁开关控制选择是用USB或者是排针输入。
常用的51系列MCU运行速度较慢、体积大,保护能力很差,芯片容易损坏;AVR,其优点是速度快、功能强大,不过指令系统复杂,不易编程。根据设计实现的功能,从存储空间、时钟频率、IO口外设、编程难易、成本、功耗等综合考量后,本设计选用MCU为STM8S103X系列是意法半导体公司推出的一款高性价比的STM8S103F3P6。TSSOP-20pin封装,体积小,STM8S103F3P6引脚图如图2-3所示。
性能更稳定、运算速度更快、有提供丰富的系统资源。具有3级流水线的哈佛结构与扩展指令集的内核。Flash程序存储器容量大;支持多次重复擦写。时钟控制灵活方便,有外部时钟输入、内部低功耗128kHzRC等四个主时钟源;有窗口看门狗和独立看门狗两个看门狗定时器。
而且中断资源丰富。有多种寄存器。有UART、SPI、IIC等通信接口;10位的ADC转换;对倒灌电流有很强的承受能力的坚固I/O端口设计。
STM8系列单片机可工作在2.95到5.5V的电压区间,有三种电源模式,为控制功耗,可以根据具体需求使用程序控制可以进入四种不同的低功耗模式。而80C51系列单片机则只有空闲模式和掉电模式。
STM8系列单片机与80C51系列单片机都采用CISC指令系统,易于编程。可以通过SWIM和DM进行在线编程和调试 [13] 。
图2-3 STM8S103F3P6引脚图
本设计选用HC-SR04超声波传感器模块产生超声波,其性能稳定、测量精确;超微型,面积小、发射与接收头距离非常近,测量盲区小;反应速度快,一测量周期为10微秒。基于此开发的产品常用于物体测距、停车场检测等地方 [14] 。频率用的太低,容易被外界的杂乱声波干扰;频率取的太高,在传播时的衰减大。故HC-SR04使用40KHz的超声波,它在空气中传播的效率最佳,也符合发射与接收器件具有固有的频率特性,有利于提高其抗干扰的性能。HC-SR04可提供2-400CM的非接触式距离感测功能,测距精度在厘米级别。它的引脚图如图2-4所示。
图2-4 HC-SR04引脚图
TRIG是接收MCU信号的触发测距引脚、ECHO是向MCU发送信号的发送引脚。
当接收到MCU给TRIG大于10us的高电平信号,模块的发射探头发射频率为40KHZ的超声波信号。假如遇到障碍物反射回来被接收头检测接收,模块再经过内部处理后,通过ECHO输出一个高电平。MCU可通过高电平持续的时间去获得超声波从发射到返回的时间差,距离=1/2高电平持续时间*声速。需注意模块不宜在带电状态去连线。
OLED即Organic Light Emitting Diode,可译为有机发光二极管,有以下这些特点:
1、OLED有自发光特性,当有电流通过有机材料涂层时,这种有机材料就会发光,而每个OLED单元都能受控制产生3种颜色的光。
2、颜色对比度高,特别是显示黑色的时候,OLED屏幕直接将单个像素关闭,所以不会发生漏光的现象,可以显示更加纯粹的黑色。而传统的LCD屏幕是通过屏蔽白光来显示黑色,会有漏光的现象。
3、轻薄耐摔,不需要背光模组,所以其厚度就能大大减少;因为其内部没有液晶物体,所以抗震性能更好。
4、柔软可弯曲,已应用在折叠手机上。
近些年来发展迅速,现在OLED已经应用在手机、VR、智能可穿戴设备等多个领域中,有逐渐成为主流显示材料的趋势。
本设计选用0.96寸的OLED显示器模块(4PIN)采用SSD1306为主芯片,像素为 128*64,有自发光自由视角,功耗低的特点。通讯方式为IIC,连接简单,模块带有稳压芯片,兼容3.3V或5V IO口、电平支持3.3V-5V 区间的电压供电。
DS18B20是一种单总线智能温度传感器。可应用在多种狭小场合,根据情况可选择不同封装;直接产生直观的数字数据;价格便宜 [15] 。DS18B20数字温度传感器可工作在3至5V的供电范围,处理速度快;按精度需求可选择选择9-12位的分辨率,可以胜任高精度的测量要求;温度测量范围为-55到+125℃,测量结果以数字形式串行传送给MCU;此外每个传感器都有它唯一的位序列号保存在其内部以便区分,这样就方便于多点组网分布式的需要,能够用一条总线将多个DS18B20串联在一起。所有电路都集成在器件中,使用时不用再增加其他外部器件,使得外围电路变得简洁,DS18B20内部结构图如图2-5所示。
图2-5 DS18B20内部结构图
根据要实现功能初次设计之后,对下面这些情况进行修改,为了增加抗干扰能力,给蜂鸣器电路并联一个二极管;连接超声波模块的I/O口连接到符合模块的驱动方式的I/O口;给连接IIC的I/O口外加上拉电阻;修改电容电阻的耐压值、精度。最终确定的整个硬件电路由直流电源、STM8S103核心控制电路、超声波模块、温度测量电路、按键电路、LED电路、OLED显示、蜂鸣器电路构成。直流电源为整个电路提供供电,STM8S103核心控制电路驱动超声波模块测量距离和驱动温度测量电路测量环境温度值,并检测它们反馈回来的信号,并检测按键电路对预警值的控制,核心控制电路接收到后经过处理控制LED电路、OLED显示、蜂鸣器电路执行对应动作。,硬件结构框图如图3-1所示
图3-1 硬件结构框图
设计选用的MCU型号为STM8S103F3P6,以它为控制核心,控制整个电路的工作。电路图如图3-2所示。从图中可看出,1号引脚为蜂鸣器控制IO口;2/3号引脚为串口TX和RX;5、6引脚是引出的IO口;4号引脚为复位引脚;10引脚是温度传感器接收IO口;11、12引脚分别是IIC通信协议的SDA、SCL;13、14是按键控制IO口;14、15分别是超声波传感器的输出输入口;18引脚是程序下载口;17、19、20是LED控制IO口。7号引脚是电源地VSS;8号引脚作用是1.8 V regulator capacitor,根据芯片datasheet的要求,为了保证主电压调节器的稳定,在VCAP引脚需要外加一个外部电容CEXT,根据温度对参数的影响、频率变化等因素,CEXT的范围可在470-3300nF之间选择本设计选用的电容值是1微法的;9号引脚是芯片的VDD,电容有通交流、阻直流的作用。电路中常在VDD和地之间加一个去耦电容,它可以充当MCU的蓄能电容;可以把高速或者沿比较陡的高频干扰导入到地,避免干扰MCU正常工作;为了有更好的性能,设计中并联了两个相差两个数量级的电容,容值分别为10微法和1微法,大电容用来稳定VDD输入,小电容可以滤除高频干扰的,这两个电容需尽量靠近MCU,两个电压值耐压值选用16V,是电路电源电压5V的2倍多,足够满足使用要求。
图3-2 MCU核心电路图
串口、没有用到的I/0口把它配置成输出模式,或使用上拉或者下拉使之接到固定电平,这里将串口、没有用到的I/0口和程序下载口(给MCU烧写程序须在供电转态下SWIM、NRST去接ST-LINK)都用排针接出,以供后面使用,电路图如图3-3所示。
图3-3 接口电路图
本设计的选用内部时钟,所以没有添加晶振电路。此外MCU核心控制电路还包括复位电路,让CPU在复位开始工作的时间段保持复位状态,若刚上电就开始工作,CPU会做出错误的指令。电路如图3-4所示。
设计复位电路采用简单的RC结构,电源接通时候,由于电容电压不能突变,此时NRST为低电平,通过R10给C6充电直到电容充满了NRST才为高电平,所以检测NRST检测到高电平与上电时间有一段延迟,复位引脚检测到高电平,复位结束,进入正常工作状态。这段延时时间通常要2个机器周期以上,选用电容容值大的话只是复位时间会较长,但如果容值太小,低电平持续时间过短,则MCU无法完成正常复位从而导致不能正常工作,本设计R10阻值为10K欧姆,C6容值为0.1微法,电阻充电时间和RC的值成正比T=RC。
根据T=RC,可算出T=1ms,足够大于复位的时间要求。手动复位可与人为给复位输入端NRST加低电平。本设计在NRST端和GND之间接了一个按键。当按下按键时,NRST直接接地为低电平。人按按键闭合断开过程,低电平起码可以持续数十毫秒,可以符合复位的时间要求。
图3-4 复位电路图
电路的采用5V直流电源,由自锁开关K1控制电源输入是USB还是排针,这方便于前期的调试,后期可根据实际情况进行修改。若电源是通过排针输入,K1未按下时为断路,按下转态为通路;若电源是通过USB输入,K1未按下时为通路,按下转态为断路。K1之后和地之间并联了两个去耦电容,它们可以有蓄能的作用,因为电容两端电压不能突变,使输出更加平滑;又可以滤除一些高频干扰,将之导入到地,避免其在回路中不可控影响。设计中用容值分别为10微法和1微法的两个容值,耐压值为16V,大电容滤低频,小电容滤高频;也能防止电源携带的噪声对电路造成干扰。LED灯L-B1和1K欧姆的限流电阻R8的作用是观察检测电源输入是否正常。电路图如图3-5所示。
图3-5 电源输入原理图
HC-SR04接口简单,只需要将MCU的两个I/O口引出去接模块的TRIG和ECHO,再将模块的VCC、GND与系统的VCC、GND接一起便可。电路如图3-5所示。
图3-5 超声波接口电路
电路中,利用按键输入可实现一些人机交互功能,有动态扫描的矩阵式,其程序较复杂,优点是能用的更少的I/O去控制更多的按键;有独立式按键,每一个I/O口上1对1接一个按键,这种接法程序相对比较简单但按键数量多时需占用大量I/O口。电路中只需要两个按键,所以本设计选用独立按键接法,电路图如图3-6所示。按键的一端接地,另一端接分别接MCU的I/O口K_U、K_D。因单片机内部的上拉电阻使I/O口为高电平,平时按键为高电平状态,当有按键按下时,I/O口短路到地而变成低电平。按键释放后,又恢复为高电平,我们就可以通过读取I/O口的电平状态知道是否有按键按下。
图3-6 按键电路
温度检测电路原理图如图3-7所示。DS18B20是单总线的通讯方式接线方便、双向通讯。单线总线要求近似等于5K欧姆的上拉,据此本电路中连接DQ的I/O出来接了个阻值4.7K欧姆/精度1%的上拉电阻。为保障温度转换精度,温度变换时,I/O线上需要足够的功率,然而其工作电流高达1mA,但4.7K的上拉电阻使得I/O线驱动能力不够,所以我们给VDD引脚接上电源,这样总线的MCU就不需要向上连接便在温度变换时间段保存高电平,也就可以在这时间段内传送其他数据。为了能够更精确的测量环境温度,避免电路板工作发热影响,设计选用TO-92直插式封装。
图3-7 温度检测电路
指示包含LED和蜂鸣器两部分,可由LED灯的颜色可得知测量结果属于哪种状况,当蜂鸣器鸣叫时表明状况紧急,这两个构成电路的指示模块。具体电路见下面分析。
LED指示电路如图3-8所示,由三个I/O口LED_Y、LED_G、LED_R分别控制L-Y1、L-G1、L-R1。LED灯阴极都接到地,阳极串联一电阻接到各自I/O口上,当I/O口为高电平时,LED亮,当I/O口为低电平时,LED灭。电阻R6、R7、R9起限流作用,根据其消耗的电压与结合实际情况电路选用限流电阻阻值为1K欧姆。
图3-8 LED电路
有源蜂鸣器内部已经包含一多谐振荡器,在两端加合适直流电压就能鸣叫,控制驱动简单,但价格较高;无源蜂鸣器内部没有振荡器,需要在加特定频率的方波电压(注意并不是交流,即没有负极性电压)才能发声,价格便宜、声音频率可调。考虑本设计电源输入为5V直流电源,为了电路简洁,电源统一等因素,所以电路采用电磁式无源蜂鸣器,当距离小于预设值时,蜂鸣器就会发出预警声音。
电路由一个蜂鸣器、两个电阻、一个三极管、一个二极管组成。阻值1K的电阻是导通偏置作用,阻值100欧姆的电阻是限流作用;电磁式蜂鸣器是电流通过电磁线圈,产生磁场让振动膜发声的,因此需要一定的电流才能驱动它,单片机的I/0口输出的电流有限,所以I/O口出来的电流经PNP型三极管9012来放大再去驱动蜂鸣器,9012最大集电极电流为500mA。蜂鸣器是感性元件,驱动感性器件需要考虑释放反向电压和次电,二极管并联在蜂鸣器用来释放蜂鸣器产生的反向电压和次电,防止三极管免受冲击而损坏或者干扰电路的其他部分;蜂鸣器功能通过BEEP引脚输出信号来产生声音。这个信号可在1、 2或者4KHz中选择,再经9012放大驱动蜂鸣器鸣叫。电路图如图3-9所示。
图3-9 蜂鸣器电路图
OLED模块采用IIC通讯方式,电路较简单只需将MCU的SCL、SDA接出分别加上一个10K欧姆的上拉电阻,加上VCC、GND一起用母座排针引出。后面再用排针连接。电路图如图3-10所示。
图3-10 OLED显示电路
导入网表绘制LAYOUT,第一版LAYOUT如图3-11所示。
图3-11 第一版LAYOUT
针对一些走线错乱、OLED显示和超声波模块布局不合理、以及板子宽长比不合适问题。进行了改版。
设计规则检测时,遇到的3类错误警告。
1、“ unplated multi-layer pad(s) detected”warning。USB的两个固定引脚的焊盘连接了GND,而电气规则设置默认不允许无沉铜通孔,解决方法是在其焊盘引脚属性设置框中的plated上勾选,如图3-12所示。
图3-12 警告1解决方法
2、阻焊层、丝印层、焊盘等的间距问题,特别注意的同一封装焊盘间距设置,MCU、USB的焊盘间距小,检查规则时会报错,然而却没有实际影响,只需要将一些设置设置为忽略
3、“Polygon:polygon not repourafter edit( top layer-no net 1)on top
layer”这是由于在布线或者敷铜时的疏忽加入了一小块铜箔引起的。肉眼难以发现其所在何处,对于这个问题,采用的方法是整个铺铜,然后查找相似,找到后将其删除。
解决所有错误警告,最终绘制PCB版图的见附录2所示。设计的PCB为双面板,面积为75mm*75mm。
本设计的程序采用模块化设计,由主程序、OLED显示子程序、超声波子程序、测温子程序、按键子程序等组成。程序每个模块,尽可能的独立完成某个特定的子功能。模块与模块之间的接口关系简单,具有高内聚低耦合的设计特点,借鉴嵌入式的编程方法,使用一些状态标志等,以增加代码可读性和便于后期的调试、维护、独立的子程序也方便代码的移植调用。使用用于编译和调试嵌入式系统应用程序的开发工具是IAR For STM8,它支持汇编、C和C++语言。它提供完整的集成开发环境,有高度优化的编译器。支持层叠,可以比较方便管理代码,理清层次。程序的设计思路是先逐个进行测试、实现其基本功能问题,再进行汇总。在ds18b20程序上采用高精度定时器延时函数,以确保其是时序的正确性。使用状态机的方法去检测按键。使用平均数算法和连续采集判断算法解决温度显示跳变和距离值显示跳变的问题和余震效应,下面进行详细介绍。
程序开始先对系统初始化,设置定时器工作模式、端口定义等。随后在进入while(1)循环,发送超声波信号、按键检测、OLED显示和执行对应指示、温度检测、超声波是否信号返回,若没有检测到信号便返回前面继续循环,当检测到返回信号时测量往返时间并处理数据后返回前面。主程序流程框图如图4-1所示。
图4-1 主程序流程图
CLOCK初始化,对内部时钟寄存器CLK_ICKR、时钟分频寄存器CLK_CKDIVR、配置时钟输出寄存器CLK_CCOR等进行初始化设置,fmaster设置16MHz。
GPIO初始化。根据数据手册介绍Px_DDR、Px_CR1、Px_CR2,结合用脚功能将引脚配置为上拉输入或推挽输出。
TIM1初始化,打开TIM1时钟,TIM1由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动,分频将定时器时钟频率设为1MHz,记数一次时间为1us。使用了默认的向上溢出,自动重新加载寄存器高值TIM1_ARR为125,TIM1_CNTR低值设为0,每125us溢出一次,开启中断,用来后面的定时器中断使用。
TIM2初始化,定时器时钟频率设2MHz,记数一次时间为0.5us,自动重新加载寄存器高值设为0XFFFF,低值设为0。
TIM4初始化,定时器时钟频率设4MHz,记数一次时间为0.25us,自动重新加载寄存器高值设为240,低值设为0。
蜂鸣器初始化,设计选用的MCU的1号引脚,有专用的beep功能和串口功能。对其进行使能,设置蜂鸣预分频器BEEPDIV和蜂鸣器的输出频率BEEPSEL。
显示设置初始化,首先先进行IIC初始化,在初始化前需先关闭IIC功能,禁止其使用,在那寄存器配置完后才使能IIC。配置输入时钟为4M,地址模式 7位,使能ACK应答/使能IIC模块等。其次对OLED进行初始化,MCU上电初始化比OLED快,所以必须加上延迟,等待OLED上电完成,设置电荷泵、设置高低列地址,亮度对比度等,在进行清屏,最后显示预设的初始化画面。
通过检测按键电平,在使用软件延时一段时间后再次检测按键的电平方法检测按键,常用于一些比较简单的电路中,如果在复杂的系统和实时性要求较高的系统中,这种方法的延时时间被浪费掉,导致CPU利用率较低。据此,本次程序使用实时性高的状态机扫描的方法。
进入程序初始化后先读取按键I/O口电平key_press,随后用switch(key_state)分支函数,根据其所在状态进入不同分支,按键初始态(key_state_0),将key_state = key_state_1跳转到确认状态;按键确认态(key_state_1),再一次检测有无按键按下,若无便认为是抖动处理,将key_state =
key_state_0跳转到初始状态,若有按键按下则根据key_press判断按键是K_D还是K_P按下,并将预警距离减小或增加5cm,将key_state = key_state_2跳转到等待释放状态;按键释放状态(key_state_2),若按键释放,则转换到按键初始态key_state =
key_state_0。程序流程图如图4-2所示。
图4-2 按键子程序流程图
定时中断函数是起按键消抖作用,采用的是定时器TIM1,每125us进入一次中断,中断函数里面用if函数嵌套125us820=20ms。每20ms将Flag_MainLoop = SET,主程序while(1)程序循环两遍才确认按键的状态,第二次检测仍为按下方才确认,可结合上面按键子程序一起理解。程序流程图如图4-3所示。
图4-3 定时中断程序流程图
程序开始先进行参数初始化,将TRIG口拉高20us,然后模块自动发送超声波脉冲,程序用while()循环检测ECHO口的电平,当检测到高电平时开启TIM2来记录高电平时间,高电平结束后关闭TIM2,保存TIM2计数器计数值,再将其清0,这样就可以测得模块反馈回来的高电平时间。为防止程序跑飞,在检测ECHO口的电平的循环加入“if(0 == (–i)); return;”根据高电平时间与最大测量距离和声速的关系,给i赋值。程序流程图如图4-4所示。
图4-4 超声波子程序流程图
进入程序,ret=AVE_process()先进入平均数计算函数,函数里每6个TIM2记得次数计算一次,将其总和加起来去掉最大值和最小值再除以4,最大值最小值偏差不大于50时数据有效,接下来根据距离时间关系算出距离,由于精度问题,根据模块数据手册参考,距离DistanceData=TIM2计数值/116(cm)。若没有有数据保存则返回ret=-1,未检测到距离标志Flag_dis_mistake = SET;若有数据保存则返回ret=0,将计算的距离值和预警距离值(初始化为20cm,可由按键控制加减)作对比,如果大于预警距离值,则距离正常Flag_dis_normal
= SET,如果小于预警距离值,则将距离过近标志Flag_dis_abnormal = SET。程序流程图如4-5所示。
图4-5 数值处理子程序流程图
初始化好的蜂鸣器,只需要将其使能便可以工作,进入蜂鸣器子程序后判断警告标志位是否置为SET,若是则BEEP_CSR_BEEPEN=1,开启蜂鸣器;若为RESET则BEEP_CSR_BEEPEN=0,关闭蜂鸣器。程序流程图如4-6所示。
图4-6 蜂鸣器子程序流程图
在写ds18b20的程序时要注意好工作时序并使用合适的延时函数,它的工作时序比较复杂,若没有处理好会让其时序混乱无法工作。MCU控制ds18b20完成温度的转换的工作流程为复位初始化,存储器操作指令,然后传输数据。涉及到初始化时序、写时序、读时序。
初始化时序,程序中MCU先让发出一个500us的低电平脉冲,然后总线拉为高电平,接着对总线检测500us时间内是否有低电平出现,若有则说明ds18b20已做出应答,若无则说明ds18b20无做出应答。
写时序,程序中一个写周期为60us,开始时先把总线拉低2us表示写周期开始,随后若是写“0”,则继续拉低电平持续 60us,然后释放总线为高电平2us;若是写“1”,则在一开始拉低总线电平2us后将总线拉为高电平,直到写周期结束。
读时序,主机在一开始拉低总线2us后再把总线拉高,ds18b20在检测到总线被拉低2us后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束;若要送出1则释放总线为高电平,MCU的I/O口便检测,整个周期61us。
程序开始,先进行复位初始化,随后进入写子函数给ds18b20发送跳过ROM命令(CCH),因为电路中只使用到一个,所以不需要;接着发送温度转化命令(44H),等待转化完成;重复上面的复位、跳过ROM操作,接着发送读暂存存储器命令(BEH),接着进入读子函数读取数据,会接收到ds18b20发的从0-8字节,且低位在前;将得到的数据进行平均值计算等处理。程序流程图如图4-7所示。
图4-8 测温子程序流程图
进入程序后用if与else if函数嵌套,判断测得距离结果是未检测到、正常范围、还是距离过近中的哪种状态,若在未检测状态Flag_dis_mistake == SET,需要连续采集判断才确认,才接着进行点亮黄灯,调用OLED_ShowString()、OLED_ShowNum()函数显示“Distances:–”,引入连续采集判断算法是为了解决OLED显示跳变很快的问题;若在正常范围Flag_dis_normal == SET,点亮绿灯,调用显示函数显示数据;若在距离值过近状态Flag_dis_abnormal == SET,点亮红灯、开启蜂鸣器、显示距离。接下显示距离预警值、显示当前温度值、显示电路上电时间。MCU与OLED的通讯协议是IIC,调用OLED的库文件的函数去显示数据。程序流程图如图4-8所示。
图4-8 显示子程序流程图
将PCB文件发送给工厂打样回来之后进行实物焊接,首先先测试电路的电源与地之间是否短路、检测引脚间距小的元件引脚是否短路,避免短路引起发热烧坏元件或电路板;测量各连线两端是否通路,排除制板虚焊带来的断路故障。其次,给电路接上电源,测量MCU、超声波模块、DS18B20模块等的VCC引脚电压值是否正常。经初步检测,焊接的三块调
为了测试电路模块是否可以正常工作,采用逐个编写实现各模块基本功能的代码方法。先显示OLED屏、按键检测、蜂鸣器等基础功能,这些功能效果直观,易于观察判断,在此基础上调试超声波模块和温度传感器的功能。最后进行整合,综合调试。设计的实物工作展示图如图5-1所示。
图5-1 设计的实物展示图
在结合程序调试时,硬件出现了以下两个问题。
1、有一样板无法烧录程序,借鉴其它两块板子可以下载程序,排除了软件问题,用万用表测量发现SWIM引脚的背面焊盘与排针之间断路,可能时排针放太久氧化或者沾上绝缘物体,将排针拔出重新后可以烧录程序。
2、有一样板的黄灯无法点亮,同样借鉴其它来两块板子的情况,排除软件因素影响,检查硬件后发现黄灯的两个引脚预留过长,不小心触碰导致两个引脚短路,将其剪短分离。上电后,黄灯可以点亮。
软件调试时最主要的问题。
距离参数存在问题,距离测试误差过大,程序上采用平均数算法、套用公式去提高精确度,检测到距离后,每6位数值进行一次平均数计算,并比较最大值和最小值之差,若在允许范围内则保存。
LED和OLED 跳变快问题,为了解决这一现象,程序使用了连续采集判断算法,由于一些杂波等的干扰,会导致MCU误判状态,导致状态显示跳变,连续采集当前转状态与前一状态后确认,这样可以排除一些偶尔出现的干扰。
为验证设计的测量精度,在空阔地带进行测试,测试范围为0-120cm。0-10cm范围每组间隔1cm,10-120范围每组间隔10cm,实际与测量数据对照如表5-1所示。
表5-1
实际与测量数值对照表
实际值(cm) | cm<3 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|
测量值(cm) | # | 4 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
实际值(cm) | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100 | 110 | 120 |
测量值(cm) | 30 | 40 | 51 | 60 | 70 | 80 | 91 | 100 | 108 | 119 |
在距离小于3cm时,没有测量结果,这是因为距离过近,在其盲区,实验测得最大的测距误差为2cm,误差较小,引起误差的原因可能是因为空气气流起伏,障碍物的材料和表面光滑度的影响,使得回波起伏不平;环境中其它杂波干扰影响;声速的误差,温度、压力、湿度对声速的影响;程序对高电平检测是TIM2计数误差,数据处理函数不够精确;测距系统本身带来的系统误差,也可能是因为超声波发射时的瞬间电流很大对电路串扰。对此在硬件上减小串扰,减小其其它元件对测距的影响,在程序上对温度,压力等影响进行算法补偿和调参,对定时器和数据处理作更精确地操作。
4 ??