分享

基于超声波的汽车防撞系统设计

 共同成长888 2015-03-29

基于超声波的汽车防撞系统设计

基于超声波的汽车防撞系统设计

摘  要

随着科学技术的快速发展,超声波将在汽车领域中的应用越来越广。本文对超声波汽车防撞报警系统进行了理论分析,利用模拟电子、数字电子、微机接口、超声波换能器、以及超声波在介质的传播特性等知识,采用以stc89c51单片机为核心的低成本、高精度、微型化数字显示超声波测距的硬件电路和软件设计方法在此基础上设计了系统的总体方案,最后通过硬件和软件实现了各个功能模块。

为了保证超声波汽车防撞报警系统的可靠性和稳定性,采取了相应的抗干扰措施。就超声波的传播特性,超声波换能器的工作特性、超声波发射、接收、超声微弱信号放大、波形整形、速度变换电路及系统功能软件等做了详细说明.实现障碍物的测距、显示和报警,超声波测距范围0.6-2.0米,精度在10厘米左右。

这套超声波汽车防撞报警系统软硬件设计合理、抗干扰能力强、实时性良好,而且简单易于制作,经过系统扩展和升级,可以用于倒车、泊车等,例如:测量液位、井深、管道长度等场合。可以广泛应用于工业生产、医学检查、日常生活、无人驾驶汽车、自动作业现场的自动引导小车、机器人、液位计等。

关键词: STC89C51,超声波,传感器,LCD,测量距离

1        引  言

                                                                                          

1.1 课题背景

随着经济的发展与汽车科学技术的进步,公路交通呈现出行驶高速化、车流密集化和驾驶员非职业化的趋势。同时,随着汽车工业的飞速发展,汽车的产量和保有量都在急剧增加。但公路发展、交通管理却相对落后,导致了交通事故与日剧增,城市里尤其突出。智能交通系统ITS是目前世界上交通运输科学技术的前沿技术,它在充分发挥现有基础设施的潜力,提高运输效率,保障交通安全,缓解交通赌塞,改善城市环境等方面的卓越效能,已得到各国政府的广泛关注。中国政府也高度重视智能交通系统的研究开发与推广应用。汽车防撞系统作为ITS发展的一个基础,它的成功与否对整个系统有着很大的作用。从传统上说,汽车的安全可以分为两个主要研究方向:一是主动式安全技术,即防止事故的发生,该种方式是目前汽车安全研究的最终目的;二是被动式安全技术,即事故发生后的乘员保护。目前汽车安全领域被动安全研究较多,主要从安全气囊、ABS(防抱死系统)和悬架等方面着手,以保证驾乘人员的安全。从经济性和安全性两方面来说,这些被动安全措施是在事故发生时刻对车辆和人员进行保护,有很大的局限性,因而车辆的主动安全研究尤为重要,而且随着车辆保有量的增加,车库与停车位的需求量越来越大,室外停车场,底下停车场,车辆密集,停车人多,所以撞车,擦碰逐渐增多。引出了本文研究的基于超声波汽车防撞报警系统基于超声波的汽车防撞报警系统的逐渐崭露头角,它可以是驾驶员们倒车,泊车更简单,在汽车接近障碍物的时候能发出报警,大大的方便了驾驶员停车,泊车。

这个系统是一种可向司机预先发出视听信号的探测装置。它安装在汽车上,能探测企图接近车身的行人、车辆或周围障碍物;能使司机及乘员提前发现障碍物并发出危险的信号,促使司机采取应急措施来应付撞车挂碰等,避免损失。

1.2 课题设计的意义

随着现代社会工业化程的发展,汽车这一交通工具正为越来越多的人所用,但是随之而来的问题也显而易见,那就是随着车辆的增多,汽车的一些挂碰,一般都是由于驾驶员反应不及所引起的,很多时候都是因为驾驶员对离障碍物的距离判断不准造成的。若驾驶员能够提早知道障碍物的存在或者知道障碍物的远近,那么驾驶员将能及时采取措施,避免事故的发生。因此,大力研究开发如汽车防撞装置等主动式汽车辅助安全装置,减少驾驶员的负担和判断错误,对于提高交通安全将起到重要的作用。

本设计采用单片机来实现智能超声波测距,虽其在功能上是不能与高精度的智能超声波测距仪相比的,但优点在于系统规模较小,器件更换容易,成本低,有一定灵活性。但不适宜用于测量过于精确或者过大的距离,容易产生误差。用于倒车泊车。

因此,大力研究开发如汽车防撞装置等主动式汽车辅助安全装置,减少驾驶员的负担和判断错误,对于提高交通安全将起到重要的作用。显然,此类产品的研究开发具有极大的实现意义和广阔的应用前景。

1.3超声波汽车防撞系统应用的介绍:

超声波倒车测距仪( 俗称电子眼)是汽车倒车防撞安全辅助装置 ,能以声音或者更为直观的数字形式动态显示周围障碍物的情况。其较早的产品是用蜂鸣器报警 ,蜂鸣声越急 ,表示车辆离障碍物越近。后继的产品可以显示车后障碍物离车体的距离。其大多数产品探测范围在0.4~1.5 m,有的产品能达到 0.35~2.5 m,并有距离显示、声响报警、区域警示和方位指示 ,有些产品还具备开机自检功能。目前市场上还出现了具有语音报警功能的产品。这些产品存在的主要问题是测量盲区大 ,报警滞后 ,未考虑汽车制动时的惯性因素 ,使驾驶者制动滞后 ,抗干扰能力不强 ,误报也较多。汽车防撞雷达之所以能实现防撞报警功能, 主要有超声波这把无形尺子, 它测量最近障碍物的距离, 并告诉给车主。其实超声测距原理简单: 它发射超声波并接收反射回波, 通过单片机计数器获得两者时间差t, 利用公式S=Ct /2计算距离, 其中S为汽车与障碍物之间的距离, C为声波在介质中的传播速度。 

本文介绍的超声测距系统共有2只超声波换能器( 俗称探头) , 分别布置在汽车的后左、后右2个位置上。能检测前进和倒车方向障碍物距离, 通过后视镜内置的显示单元显示距离和方位, 发出一定的声响, 起到提示和警戒的作用。系统采用一片STC89C51单片机对两路超声波信号进行循环采集。

超声波是指频率高于20KHz的机械波。为了以超声波作为检测手段,必须产生超生波和接收超声波。完成这种功能的装置就是超声波传感器,习惯上称为超声波换能器或超声波探头。超声波传感器有发送器和接收器,但一个超声波传感器也可具有发送和接收声波的双重作用。超声波传感器是利用压电效应的原理将电能和超声波相互转化,即在发射超声波的时候,将电能转换,发射超声波;而在收到回波的时候,则将超声振动转换成电信号。 

   超声波测距的原理一般采用渡越时间法TOF(time of flight)。首先测出超声波从发射到遇到障碍物返回所经历的时间,再乘以超声波的速度就得到二倍的声源与障碍物之间的距离。测量距离的方法有很多种,短距离的可以用尺,远距离的有激光测距等,超声波测距适用于高精度的中长距离测量。因为超声波在标准空气中的传播速度为331.45米/秒,由单片机负责计时,单片机使用12.0M晶振,所以此系统的测量精度理论上可以达到毫米级。

  由于超声波指向性强,能量消耗缓慢,在介质中传播距离远,因而超声波可以用于距离的测量。利用超声波检测距离,设计比较方便,计算处理也较简单,并且在测量精度方面也能达到要求。

    超声波发生器可以分为两类:一类是用电气方式产生超声波,一类是用机械方式产生超声波。本设计属于近距离测量,可以采用常用的压电式超声波换能器来实现触发单元。

利用超声波测距的工作,就可以根据测量发射波与反射波之间的时间间隔,从而达到测量距离的作用。其主要有三种测距方法: 
  (1)相位检测法,相位检测法虽然精度高,但检测范围有限; 
  (2)声波幅值检测法,声波幅值检测法易受反射波的影响; 
  (3)渡越时间检测法,渡越时间检测法的工作方式简单,直观,在硬件控制和软件设计上都非常容易实现。其原理为:检测从发射传感器发射超声波,经气体介质传播到接收传感器的时间,这个时间就是渡越时间。 
  本设计的超声波测距就是使用了渡越时间检测法。在移动车辆中应用的超声波传感器,是利用超声波在空气中的定向传播和固体反射特性(纵波),通过接收自身发射的超声波反射信号,根据超声波发出及回波接收的时间差和传播速度,计算传播距离,从而得到障碍物到车辆的距离。

2  课题的方案设计与论证 

2.1 系统总体设计

系统总体框图 
  构成超声测距系统的电路功能模块包括发射电路、接收电路、显示电路、核心功能模块单片机控制器及一些辅助电路。采取收发分离方式有两个好处:一是收发信号不会混叠,接收探头所接收到的纯为反射信号;二是将接收探头放置在合适位置,可以避免超声波在物体表面反射时造成的各种损失和干扰,提高系统的可靠性。 
 SHAPE  \* MERGEFORMAT 

图2-1 超声波汽车防撞原理框图

根据设计要求并综合各方面因素,选择的超声波测距传感器 TR40-16Q(T 表示发射传感器,R表示接收传感器),最大探测距离为 6m,发射扩散角为 60度。

超声波传感器有两块压电晶片和一块共振板。当它的两电极加脉冲信号(触发脉冲) , 若其频率等于晶片的固有频率时,压电晶片就会发生共振,并带动共振板振动,从而产生超声波。相反, 电极间未加电压,则当共振板接收到回波信号时,将压迫两压电晶片振动,从而将机械能转换为电信号,此时的传感器就成了超声波接收器。超声波传感器是一种采用压电效应的传感器,常用的材料是压电陶瓷。由于超声波在空气中传播时会有相当的衰减,衰减的程度与频率的高低成正比;而频率高分辨率也高,故短距离测量时应选择频率高的传感器,而长距离的测量时应用低频率的传感器。超声波传感器用来分析共振频率附近的超声波换能器的特性:换能器的器械能用Qm ;电能用Qe 表示。Q 恰好是电路的串联支路的Q 值。设换能器在空载( Z1 = 0) 和有载( Z1 = R1) 时的Q 值分别为Qm0 、Qm ,则有

超声波换能器的工作效率为

相临两片的压电陶瓷片极化方向相反,芯片的数目成偶数,以使前后金属盖板与同一极性的电极相连,否则在前后盖板与芯片之间要垫以绝缘垫圈,会导致结构不必要的增大,两芯片之间,芯片与金属盖板间通常以薄黄铜片(厚度小于0.1mm),作为焊接电极引线用;芯片,电极铜片用强力胶胶合,在压电组件的中央部分用结合轴与圆锥状谐振子连成一体,圆锥状谐振子的边缘部分装有圆环弹性橡胶减振器,使之与外壳固定,起声阻匹配作用。在电——声变换部分的前面的超声波束整形板,是对应圆锥状谐振子的振动模式设置的几个开口,使超声波波束指向尖锐,吸声片吸收多余反射声波。

目前市面上出售的超声波传感器种类有通用型,拓宽型,宽带域型,防水型和高频型等这几类。虽然通用型超声波传感器有频率带宽较窄的缺点,但是却可以换来高灵敏度,抗噪声干扰强的优点。超声波基本应用电路主要分为三类:

    1)直射型,主要用于遥控及报警电路

    2)分离反射型,主要用于测距,料位测量等电路

3)反射型,主要用于材料的探伤,测厚电路。

鉴于成本的考虑,选用了普通的T/R-40系列的超声波发射/接收传感器。TR-40系列超声波传感器典型的工作频率为(39-41)KHZ。

传感器位置

超声波发生器T是一个超声频电子振荡器, 当把振荡器产生的超声频电压加到超声换能器的压电陶瓷上时, 压电陶瓷组件就在电场作用下产生纵向振动。压电组件在超声振荡时, 仿佛是一个小活塞, 其振幅很小, 约为(1~ 10. 2) Lm,但这种振动加速度很大, 约(10~ 103 ) g n , 于是把电磁振荡能量转化为振动能量, 这种巨大的超声波能量, 沿着特定方向传播出来。其关键技术是使超声波波束变细, 除待测物外不受其它构造物的影响。超声传感器是产生超声波必需的能量转换装置, 它把超声电磁振荡的能量转换为声波。.通过上述超声换能结构, 配以适当的收发电路, 可以使超声能量的定向传输, 并按预期接收反射波,实现超声遥控、测距、防盗等检测功能 。

由于是测距系统是采用超声波发射和接收分离反射型结构,所以发射头和接收头应该在同一平行直线上。出于距离和发射夹角所引起的误差以及超声波信号在传播过程中衰减问题的考虑,发射和接收探头距离不可以太远,而又为了避免发射头对接收头接收信号产生的干扰,二者也不能间隔太近。经过参考前人的经验以及调试时的实际情况,应保持超声波发射头和接收头中心轴线平行并相距4-8cm即可。

2.2 设计方案的论证

超声波探测技术主要用于中程测距、结构探伤、智能控制等领域,超声波换能器是其核心部件,换能器按其工作介质可分为气相、液相和固相换能器;按其发射波束宽度可分为宽波束和窄波束换能器;按其工作频率又可分为38KHz、40KHz等不同等级。本设计选用气相、窄波束、38KHz的超声波换能器。

当利用超声波探测器测距时常用两种方法——强度法和反射时间法,强度法是利用声波在空气中的传输损耗值来测量被测物的距离,被测物越远其反射信号越弱,根据反射信号的强弱就可以知道被测物的远近,但在使用这种方法时由于换能器之间的直接耦合信号很难消除,在放大器增益较高时这一直接耦合信号就可使放大器饱和从而使整套系统失效,由于直接耦合信号的影响强度法测距只适合较短距离的且精度要求不高的场合。

反射时间法其原理是利用检测声波发出到接收到被测物反射回波的时间来测量距离,对于距离较短和要求不高的场合我们可认为空气中的声速为常数,我们通过测量回波时间T利用公式S=V×(T/2)(其中S为被测距离、V为空气中声速、T为回波时间( )计算出路程,这种方法不受声波强度的影响,直接耦合信号的影响也可以通过设置“时间门”来加以克服,因此这种方法非常适合较远距离的测距,如果对声速进行温度修订,其精度还可进一步提高,本设计中选用此方法。

要产生38KHZ的方波可以直接通过单片机输出PWM信号或通过外部震荡电路来产生,这里我采用的是51单片机,没有多余的资源完成这么多工作,故摒弃了由单片机直接产生PWM信号的方式,而采用了外部电路产生。

单片机的功能特点及测距原理

    38KHZ的发射频率由NE555提供给软件进行处理控制发射及停止,回波经过STC89C51对接收到的信息进行处理后,被测的距离在LCD上显示,显示部分采用动态扫描显示。满足显示精度;若该距离小于预置的汽车低速安全刹车范围(如:1m或0.5m),报警电路发出适当的警告提示音,由P3.7口的蜂鸣器输出控制报警电路的工作。

3  系统的硬件结构设计

3.1 单片机的选择

在系统的设计中,选择合适的系统核心器件就成为能否成功完成设计任务的关键,而作为控制系统核心的单片机的选择更是重中之重。目前各半导体公司、电气商都向市场上推出了形形色色的单片机,并提供了良好的开发环境。选择好合适的单片机可以最大地简化单片机应用系统,而且功能优异,可靠性好,成本低廉,具有较强的竞争力。目前,市面上的单片机不仅种类繁多,而且在性能方面也各有所长。一般来说,选择单片机需要考虑以下几个方面:

(1)单片机的基本性能参数。例如指令执行速度,程序存储器容量,I/O引脚数量等。

(2)单片机的增强功能。例如看门狗、多指针、双串口等。

(3)单片机的存储介质。对于程序存储器来说,Flash存储器和OTP(一次性可编程)存储器相比较,最好是Flash存储器。

(4)芯片的封装形式。如DIP(双列直插)封装,PLCC(PLCC有对应插座)封装及表面贴附等。

(5)芯片工作温度范围符合工业级、军工级还是商业级。如果设计户外产品,必须选用工业级。

(6)芯片的功耗。比如设计并口加密狗时,信号线取电只能提供几mA的电流,选用STC单片机就是因为它能满足低功耗的要求。

(7)供货渠道是否畅通、价格是否低廉。

(8)技术支持网站的速度如何,资料是否丰富。包括芯片手册,应用指南,设计方案,范例程序等。

(9)芯片保密性能好、单片机的抗干扰性能好。

STC89系列单片机是MCS-51系列单片机的派生产品。它在指令系统、硬件结构和片内资源上与标准8052单片机完全兼容,DIP40封装系列与8051为pin-to-pin兼容。STC89系列单片机高速(最高时钟频率90MHz),低功耗,在系统/在应用可编程(ISP,IAP),不占用户资源。根据本系统的实际情况,选择STC89C51单片机,

单片机(STC89C51)外观如图3-1

   

图3-1 STC89C51  外观

单片机(STC89C51)的引脚功能图3-2

图3-2 STC89C51引脚图

单片机的引脚功能说明:

1. 电源引脚

Vcc 40脚 正电源脚,工作电压为5V。GND 20脚 接地端
2. 时钟电路引脚XTAL1和XTAL2

为了产生时钟信号,在8951内部设置了一个反相放大器,XTAL1是片内振荡器反相放大器的输入端,XTAL2是片内振荡器反相放大器的输出端,也是内部时钟发生器的输入端。当使用自激振荡方式时,XTAL1和XTAL2外接石英晶振,使内部振荡器按照石英晶振的频率振荡,就产生时钟信号。

产生时钟信号电路如图 3-3:

  图 3-3 时钟信号电路

本系统使用的石英晶振频率为12MHZ。

3.复位 RST 9脚
  在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此引脚时,将使单片机复位,只要这个脚保持高电平,51芯片便循环复位。复位后P0-P3口均置1引脚表现为高电平,程序计数器和特殊功能寄存器SFR全部清零。当复位脚由高电平变为低电平时,芯片为ROM的0000H处开始运行程序。常用的复位电路如下图所示。

点此在新窗口浏览图片图3-4  复位电路图

      图3-5  复位电路图  复位电路是手动复位电路如图3-5:

4.输入输出(I/O)引脚
  Pin39-Pin32为P0.0-P0.7输入输出脚,称为P0口,是一个8位漏极开路型双向I/O口。内部不带上拉电阻,当外接上拉电阻时,P0口能以吸收电流的方式驱动八个LSTTL负载电路。通常在使用时外接上拉电阻,用来驱动多个数码管。在访问外部程序和外部数据存储器时,P0口是分时转换的地址(低8位)/数据总线,不需要外接上拉电阻。

Pin1-Pin8为P1.0-P1.7输入输出脚,称为P1口,是一个带内部上拉电阻的8位双向I/0口。P1口能驱动4个LSTTL负载。通常在使用时外不需要外接上拉电阻,就可以直接驱动发光二极管。端口置1时,内部上拉电阻将端口拉到高电平,作输入用。

对于输出功能,在单片机工作时,我们可以通过用指令控制单片机的引脚输出高电平或者低电平。如: 指令CLR ,清零的意思。

CLR P1.0 ;让单片机从第一脚输出低电平。指令 SETB,置1的意思。

SETB P1.0 ;让单片机从第一个脚输出高电平。

 Pin21-Pin28为P2.0-P2.7输入输出脚,称为P2口,是一个带内部上拉电阻的8位双向I/O口,P2口能驱动4个LSTTL负载。端口置1时,内部上拉电阻将端口拉到高电平,作输入用。对内部Flash程序存储器编程时,接收高8位地址和控制信息。在访问外部程序和16位外部数据存储器时,P2口送出高8位地址。而在访问8位地址的外部数据存储器时其引脚上的内容在此期间不会改变。
    Pin10-Pin17为P3.0-P3.7输入输出脚,称为P3口,是一个带内部上拉电阻的8位双向I/O口,P2口能驱动4个LSTTL负载,这8个引脚还用于专门的第二功能。端口置1时,内部上拉电阻将端口拉到高电平,作输入用。对内部Flash程序存储器编程时,接控制信息。
    P1-3端口在做输入使用时,因内部有上接电阻,被外部拉低的引脚会输出一定的电流。除此之外P3端口还用于一些专门功能,如下表。
5.其它的控制或复用引脚
   (1) ALE/PROG 30 访问外部存储器时,ALE(地址锁存允许)的输出用于锁存地址的低位字节。即使不访问外部存储器,ALE端仍以不变的频率输出脉冲信号(此频率是振荡器频率的1/6)。在访问外部数据存储器时,出现一个ALE脉冲。对Flash存储器编程时,这个引脚用于输入编程脉冲PROG
           表3—1  P3口专门功能

P3引脚

兼用功能

P3.0

串行通讯输入(RXD)

P3.1

串行通讯输出(TXD)

P3.2

外部中断0( INT0)

P3.3

外部中断1(INT1)

P3.4

定时器0输入(T0)

P3.5

定时器1输入(T1)

P3.6

外部数据存储器写选通WR

P3.7

外部数据存储器写选通RD

   (2) PSEN 29 该引是外部程序存储器的选通信号输出端。当STC89C51由外部程序存储器取指令或常数时,每个机器周期输出2个脉冲即两次有效。但访问外部数据存储器时,将不会有脉冲输出。
   (3) EA/Vpp 31 外部访问允许端。当该引脚访问外部程序存储器时,应输入低电平。要使STC89S51只访问外部程序存储器(地址为0000H-FFFFH),这时该引脚必须保持低电平。对Flash存储器编程时,用于施加Vpp编程电压。
    单片机最小系统电路图如下图3-6所示:

                    图  3-6  单片机最小系统图

 3.2 发射电路的设计

     超声波发射电路如图3所示,89C51通过外部引脚P1.0 输出脉冲宽度为250μs , 40kHz的10个脉冲串通过超声波驱动电路以推挽方式加到超声波传感器而发射出超声波。由于超声波的传播距离与它的振幅成正比,为了使测距范围足够远,可对振荡信号进行功率放大后再加在超声波传感器上。

图3中T为超声波传感器,是超声波测距系统中的重要器件。利用逆压电效应将加在其上的电信号转换为超声机械波向外辐射; 利用压电效应可以将作用在它上面的机械振动转换为相应的电信号, 从而起到能量转换的作用。市售的超声波传感器有专用型和兼用型,专用型就是发送器用作发送超声波,接收器用作接收超声波。兼用型就是收发一体, 只一个传感器头, 具有发送和接收声波的双重作用, 称为可逆元件。

图3 超声波发射电路

3.3 接收电路的设计

 超声波接收及信号处理电路是此系统设计和调试的一个难点。超声波接收器接收反射的超声波转换为40KHz毫伏级的电压信号,需要经过放大、处理、用于触发单片机中断INT0。一方面传感器输出信号微弱,同时根据反射条件不同信号大小变化较大,需要放大倍数大约为100到5000倍,另一方面传感器输出阻抗较大,这就需要高输入阻抗的多级放大电路,这就会引入两个问题:高输入阻抗容易接收干扰信号,同时多级放大电路容易自激振荡。参考各种资料最后选用了SONY公司的专用集成前置放大器CX20106达到了比较好的效果。

CX20106采用8脚单列直插式塑料封装,内部结构框图如图4。超声波接收器能将接受到的发射电路所发射的红外光信号转换成数十伏至数百伏的电信号,送到CX20106的①脚,CX20106的总放大增益约为80dB,以确保其⑦脚输出的控制脉冲序列信号幅度在3.5~5V 范内。总增益大小由②脚外接的R1、C1决定,R1越小或C1越大,增益越高。C1取值过大时将造成频率响应变差,通常取为1uf。C2为检波电容,一般取3.3uf。CX20106 采用峰值检波方式,当C2容量较大时将变成平均值检波,瞬态响应灵敏度会变低,C2较小时虽然仍为峰值检波,且瞬态响应灵敏度很高,但检波输出脉冲宽度会发生较大变动,容易造成解调出错而产生误操作。R2为带通滤波器中心频率f0的外部电阻,改变R2阻值,可改变载波信号的接受频率,当f0偏离载波频率时,放大增益会显著下降,C3为积分电容,一般取330pf,取值过大,虽然可使抗干扰能力增强,但也会使输出编码脉冲的低电平持续时间增长,造成遥控距离变短。⑦脚为输出端,CX20106 处理后的脉冲信号由⑦脚输出给单片机处理从而获得显示输出。

CX20106A该IC内部主要包括前置放大器,限幅放大,带通滤波,峰值检波,积分滤波及波形整形电路等。基本原理如下:接收换能器把超声波回波转换为相应频率的数字编码脉冲调幅波,并由1脚进入集成放大器的正相输入端。2脚是放大器的反相输入端,外接RC负反馈网络,可以决定和调节放大器的频率特性和电压增益,当电阻值小或者电容值大时,电压增益高,通频带窄;反之,电压增益低,通频带宽。在放大器输入端设置有ABLC电路(即自动偏压电路或者自动电平控制电路,它可使放大及限幅电路输出电平稳定的编码信号),可自动调整放大器的偏置电压,使放大器的输出电平稳定。然后,信号进入限幅放大器,可以滤除杂乱的寄生调幅和其他干扰,输出包络脉冲顶部平直的编码脉冲调幅波。信号再进入带通滤波器,滤除频率范围30-50KHZ以外的干扰信号。5脚外接电阻。调节其阻值可调节带通滤波器的中心频率值。然后信号进入峰值检波器,对编码脉冲的调幅波进行振幅检波,解调出数字编码脉冲信号,3脚外接电容是峰值检波器的滤波电容。检波出的信号再送到整形电路中进行波形转换与整形,最后由7脚输出数字编码脉冲信号,送至CPU去识别,处理。6脚外接积分电容,可以滤除已调波的载波频率分量。而由检波器输出的数据编码信号,CPU不能识别,故在检波器后设置由积分电路和磁滞回线型比较器组成的整形电路,整形电路是一种波形变换电路,它可将检波器输出的宽度编码脉冲整形变换为CPU所能识别的数字信号。而实用的波形整形电路是积分电路和施密特比较器组成的电路。

根据以上原理,超声波测距系统的接收电路如下图3-11所示。超声波接收换能器将接收到的回波信号转换后经过0.056U的电容初步滤波后,进入CX20106A的1脚,经过CX20106A的前置放大器,限幅放大,带通滤波器(中心频率为40KHZ),检波器及比较器,最后经过内部的整形电路,从7脚输出至89C51单片机的外部中断0(P3.2)口。当芯片接收到38KHZ的信号时,7脚的输出由高电平转为低电平,单片机外部中断0口检测到输入信号的下降沿或者低电平时,立即产生中断,同时停止定时/计数器T0。从而得到超声波的回波时间t.

图5 超声波接收电路

3.4 显示报警模块的设计

     液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用。随着科技的发展,液晶显示模块的应用前景将更加广阔。

本系统选用LCD液晶ARK SR420361k显示器做为显示模块。

参考ARK SR420361k与单片机引脚功能画出它们连接的原理图3-12 如下:

max232

MAX232芯片是美信公司专门为电脑的RS-232标准串口设计的接口电路,使用+5v单电源供电。

  内部结构基本可分三个部分:

  第一部分是电荷泵电路。由1、2、3、4、5、6脚和4只电容构成。功能是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。

  第二部分是数据转换通道。由7、8、9、10、11、12、13、14脚构成两个数据通道。

  其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。

  8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。

  TTL/CMOS数据从T1IN、T2IN输入转换成RS-232数据从T1OUT、T2OUT送到电脑DB9插头;DB9插头的RS-232数据从R1IN、R2IN输入转换成TTL/CMOS数据后从R1OUT、R2OUT输出。
    第三部分是供电。15脚GND、16脚VCC(+5v)。
    电路为:

        图3-15 MAX232内部电路图

4  系统软件的设计

本系统采用模块化设计,由主程序、发射子程序、接收子程序、定时子程序、显示子程序等模块组成,图8为程序流程图。该系统的主程序处于键控循环工作方式,当按下测量键时,主程序开始调用发射子程序、查询接收子程序、定时子程序,并把测量结果用显示子程序在数码显示器上显示出来。

       

  软件程序框图

 

定时器中断子程序

 


                   

                   外部中断服务子程序

5  调试

5.1 硬件调试

由于本设计涉及的模块比较多,包括了超声波测距模块,单片机模块,显示报警,所以调试起来比较费力,设计的不定因素也比较多,所以,调试的时候采用了分块调试的方法,排除了各个模块的干扰。

在电路安装完毕后,不要急于通电测试,而首先必须做好调试前的检查工作。

检查连线情况:

经常碰到的有错接(即连线的一端正确,而另一端误接)、少接(指安装时漏接的线)及多接(指在电路上完全是多余的连线),等连线错误。检查连线可以直接对照电路原理图进行,但若电路中布线较多,则可以以元器件(如运放、三极管)为中心,依次检察查其引脚的有关连线,这样不仅可以查出错接或少接的线,而且也较易发现多余的线。

为确保连线的可靠,在查线的同时,还可以用万用表电阻档对接线作连通检查,而且最好在器件外引线处测量,这样有可能查出某些“虚焊”的隐患。

检查元器件安装情况:元器件的检查,重点要查集成运放、三极管、二极管、电解电容等外引线与极性有否接错,以及外引线间有否短路,同时还须检查元器件焊接处是否可靠。这里需要指出,在焊接前,必须对元器件进行检测,确保元器件能正常工作,以免给调试带来不必要的麻烦。

检查电源输入端与公共接地端间有否短路在通电前,还需用万用表检查电源输入端与地之间是否存短路,若有则须进一步检查其原因。

在完成了以上各项检查并确认无误后,才可通电调试,但此时应注意电源的正、负极性不能接反。

在检查超声波发射电路时,在未加单片机使能控制的情况下,通电待系统工作后,用示波器观察NE555芯片的3脚。若输出波形不符合要求,可通过调节R5和R6来调节输出波形,直到得到要求的占空比为50%的38KHZ方波。

调好发射电路后,启用接收电路。在超声波接收探头未接收到信号的情况下,用示波器观察其两引脚,测得最大干扰电压波形为38KHZ的正弦波,幅值20mv。

在超声波接收探头接收信号的情况下,起初测得信号放大电路的一级放大输出为幅值5V的正弦波,但是二级输出不论接收探头有否接收到信号,恒输出一11V高电平。检查电路参数后认为是NE555放大倍数过大,形成自激振荡,所以把原来100*100的放大倍数降为100*10。再测二级输出,在探测距离较近时输出波形近似方波,调试成功。

超声波这个部分相对来说比较复杂,特别是涉及到了传感器,受天气和温度的干扰比较大,电路内部的干扰控制也是一个难点,所以我选择了另外用了一块扩展板来制作这部分电路,而且用电感来隔离各部分的干扰。考虑到本设计只是一次学习过程,对性能要求不是很高,所以采用了USB供电这样的方法,再有就是测距的时候容易受到地面的漫反射干扰,所以增益电阻不能取得太小,这样测距的灵敏度会受到一定影响,不过经过多次调试,测距精度方面误差基本上能控制在10厘米以内,测距距离大概10米。

5.2 软件调试

汇编和keil c

汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。但是不同的CPU,其汇编语言可能有所差异,所以不易移植。

对于目前普遍使用的RISC架构的8bit MCU来说,其内部ROM、RAM、STACK等资源都有限,如果使用C语言编写,一条C语言指令编译后,会变成很多条机器码,很容易出现ROM空间不够、堆栈溢出等问题。而且一些单片机厂家也不一定能提供C编译器。而汇编语言,一条指令就对应一个机器码,每一步执行什么动作都很清楚,并且程序大小和堆栈调用情况都容易控制,调试起来也比较方便。所以在资源较少单片机开发中,建议采用汇编语言比较好。

C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。C语言有功能丰富的库函数、运算速度快、编译效率高、有良好的可移植性,而且可以直接实现对系统硬件的控制。C语言是一种结构化程序设计语言,它支持当前程序设计中广泛采用的由顶向下结构化程序设计技术。此外,C语言程序具有完善的模块程序结构,从而为软件开发中采用模块化程序设计方法提供了有力的保障。因此,使用C语言进行程序设计已成为软件开发的一个主流。用C语言来编写目标系统软件,会大大缩短开发周期,且明显地增加软件的可读性,便于改进和扩充,从而研制出规模更大、性能更完备的系统,用C语言进行单片机程序设计是单片机开发与应用的必然趋势。所以作为一个技术全面并涉足较大规模的软件系统开发的单片机开发人员最好能够掌握基本的C语言编程。使用C 语言肯定要使用到C 编译器,以便把写好的C 程序编译为机器码,这样单片机才能执行编写好的程序。

KEIL uVISION2 是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司的MCS51 架构的芯片,它集编辑,编译,仿真等于一体,同时还支持,PLM,汇编和C 语言的程序设计,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。因此本系统采用KEIL uVISION2进行软件的编写和调试

调试过程

把烧录好的芯片放置在电路中,接上电源,检验程序是否如自己所设计的那样可以实现所要求的功能。如果电路板上的结果和设想的不同,由于在硬件检查部分已经确定了硬件没问题。则应该是软件部分即程序方面的问题。需要检查程序。首先检查红外接收部分,用示波器检查红外接收管的输出口或是INT0口的波形是否正确。红外接收部分没有问题后再调试电机部分,看电机是否能按照遥控要求那样转动。然后是超声波部分,主要看数码管的现实是否正常,还有就是控制按钮是否按要求控制。因为前面已经确定硬件没有问题了,所以,在软件调试的时候可以结合硬件来在线调试,这样很直观,而且发现问题也很容易。

表5—1  测试结果

真实距离

实测距离


总   结

由于时间和其它客观上的原因,此次设计没有做出温度补偿。但是对设计有一个很好的理论基础。设计的最终结果是使超声波测距模块能够产生超声波,实现超声波的发送与接收,从而实现利用超声波方法测量物体间的距离。以数字的形式显示测量距离。并通过蜂鸣器,指示灯进行相应的报警。

超声波防撞报警系统的原理是利用超声波的发射和接受,根据超声波传播的时间来计算出传播距离。实用的测距方法有两种,一种是在被测距离的两端,一端发射,另一端接收的直接波方式,适用于身高计;一种是发射波被物体反射回来后接收的反射波方式,适用于测距仪。此次设计采用反射波方式。

超声波防撞报警系统硬件电路的设计主要包括单片机系统及显示报警电路、超声波发射电路和超声波检测接收电路三部分。单片机采用STC89C51或其兼容系列。采用12MHz高精度的晶振,以获得较稳定时钟频率,减小测量误差。单片机用P1.0端口输出超声波换能器所需的38kHz的方波的控制信号,并通过NE555芯片产生。利用外中断0口监测超声波接收电路输出的返回信号。超声波发射电路主要由反相器74LS04和超声波发射换能器T构成,单片机P1.0端口输出的38kHz的方波信号一路经一级反向器后送到超声波换能器的一个电极,另一路经两级反向器后送到超声波换能器的另一个电极,用这种推换形式将方波信号加到超声波换能器的两端,可以提高超声波的发射强度。输出端采两个反向器并联,用以提高驱动能力。上位电阻R5、R6一方面可以提高反向器74LS04输出高电平的驱动能力,另一方面可以增加超声波换能器的阻尼效果,缩短其自由振荡时间。压电式超声波换能器是利用压电晶体的谐振来工作的。超声波换能器内部有两个压电晶片和一个换能板。当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片会发生共振,并带动共振板振动产生超声波,这时它就是一个超声波发生器;反之,如果两电极问未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收换能器。超声波发射换能器与接收换能器在结构上稍有不同,使用时应分清器件上的标志。

超声波检测接收电路主要是由集成电路CX20106A组成,它是一款红外线检波接收的专用芯片,常用于电视机红外遥控接收器。考虑到红外遥控常用的载波频率38 kHz与测距的超声波频率38 kHz相同,可以利用它制作超声波检测接收电路。实验证明用CX20106A接收超声波(无信号时输出高电平),具有很好的灵敏度和较强的抗干扰能力。适当更改电容C1的大小,可以改变接收电路的灵敏度和抗干扰能力。

超声波测距仪的软件设计主要由主程序、超声波发生子程序、超声波接收中断程序及显示子程序组成。我们知道C语言程序有利于实现较复杂的算法,汇编语言程序则具有较高的效率且容易精细计算程序运行的时间,而超声波测距仪的程序既有较复杂的计算(计算距离时),又要求精细计算程序运行时间(超声波测距时),所以控制程序可采用C语言和汇编语言混合编程。主超声波测距仪主程序利用外中断0检测返回超声波信号,一旦接收到返回超声波信号(即INT0引脚出现低电平),立即进入中断程序。进入中断后就立即关闭计时器T0停止计时,并将测距成功标志字赋值1。如果当计时器溢出时还未检测到超声波返回信号,则定时器T0溢出中断将外中断0关闭,并将测距成功标志字赋值2以表示此次测距不成功。 前方测距电路的输出端接单片机INT0端口,中断优先级最高,左、右测距电路的输出通过与门IC3A的输出接单片机INT1端口,同时单片机P1.3和P1.4接到IC3A的输入端,中断源的识别由程序查询来处理,中断优先级为先右后左。

超声波测距的算法设计原理为超声波发生器T在某一时刻发出一个超声波信号,当这个超声波遇到被测物体后反射回来,就被超声波接收器R所接收到。这样只要计算出从发出超声波信号到接收到返回信号所用的时间,就可算出超声波发生器与反射物体的距离。在启动发射电路的同时启动单片机内部的定时器T0,利用定时器的计数功能记录超声波发射的时间和收到反射波的时间。当收到超声波反射波时,接收电路输出端产生一个负跳变,在INT0或INT1端产生一个中断请求信号,单片机响应外部中断请求,执行外部中断服务子程序,读取时间差,计算距离。

在元件及调制方面,由于采用的电路使用了很多集成电路。外围元件不是很多,所以调试应该不会太难。一般只要电路焊接无误,稍加调试应该会正常工作。电路中除集成电路外,对各电子元件也无特别要求。根据测量范围要求不同,可适当调整与接收换能器并接的滤波电容C1的大小,以获得合适的接收灵敏度和抗干扰能力。若能将超声波接收电路用金属壳屏蔽起来,则可提高抗干扰能力。

致   谢

首先,我要感谢我的导师老师在毕业设计中对我给予的细心指导和严格要求,同时也感谢本校的一些老师在毕业设计期间所给予我得帮助。在我毕业论文写作期间,各位老师给我提供了种种专业知识上的指导和日常生活上的关怀,没有您们这样的帮助和关怀,我不会这么顺利的完成毕业设计,借此机会,向您们表示由衷的感激。同时还要感谢院实验室在毕业设计期间提供给我们优越的实验条件。

接着,我要感谢和我一起做毕业设计的同学。在毕业设计的短短4个月里,你们给我提出很多宝贵的意见,给了我不少帮助还有工作上的支持,在此也真诚的谢谢你们。同时,我还要感谢我的寝室同学和身边的朋友,正是在这样一个团结友爱,相互促进的环境中,在和他们的相互帮助和启发中,才有我今天的小小收获。

最后我要深深地感谢我的家人,正是他们含辛茹苦地把我养育成人,在生活和学习上给予我无尽的爱、理解和支持,才使我时刻充满信心和勇气,克服成长路上的种种困难,顺利的完成大学学习。

还有许许多多给予我学业上鼓励和帮助的朋友,在此无法一一列举,在此也一并表示忠心地感谢!

                          

参考文献



[1] 马忠梅,等. 单片机的C 语言应用程序设计. 北京航天航空大学出版社,2001年

[2] 刘瑞星,等.单片机原理及应用教程.机械工业出版社,2006年

[3] 赵珂,等. 高准确度超声波测距仪的研制.传感器技术,2003年第22卷第2期

[4] 藏日章 基于AT89C51单片机的超声波测距系统.电气时代,2005年第7期

[5] 牛余朋 基于单片机的高精度超声波测距电路.电子世界,2005年5期

[6] 姜道连,等.用AT89C2051设计超声波测距仪. 维普资讯,编号:00121

[7] 胡萍 超声波测距仪的研制. 计算机与现代化,2003年第10期,编号:100622475 (2003) 1020054203

[8] 吴银凤,等.红外线接收电路CX20106的应用. 电气时代,2003年第9期

[9] 马殷元 基于新型单片机P89C51RD2的倒车雷达设计. 甘肃科技,第20卷 2004年9月第9期

[10]刘凤然 基于单片机的超声波测距系统. 传感器世界,2001年5月

[11]李茂山 超声波测距原理及实践技术. 使用测试技术,1994年3月第1期

附录1:

 原理图

   

               汽车防撞报警系统总体原理图

                   超声波接收电路原理图

                        超声波发射接收电路原理图

           汽车防撞报警系统声音报警电路原理图

            汽车防撞报警系统单片机电路原理图

程序录入电路原理图

汽车防撞报警系统距离显示电路原理图

汽车防撞报警系统产生时钟信号电路原理图

附录2:

PCB图:

附录3:

源程序:

#include <reg52.H>

#include <intrins.H>

#include <stdio.H>

#define uchar unsigned char

#define uint  unsigned int

#define Fosc              12000000 //单位Hz

#define DIV             12          //分频数

#define C                  340      //单位m/s    

#define MIN_RESO   0.1         //单位m

#define UNIT            117//((DIV / Fosc) * (C * 0.5))   //=0.00017m/count 实际测试的距离是一去一回的距离,要取一半  0.5

#define ON  0

#define OFF 1

sbit LED = P3^7;     //

//sbit RING = P3^6;   //

sbit BOUT = P3^6;     //

sbit BIN = P3^2;       //

sbit W1 = P2^0;        //

sbit W2 = P2^1;        //

sbit W3 = P2^2;        //

sbit test = P1^7;

//sbit W4 = P2^3;      //

bit flag;

bit   alarm=0;

uchar bwei,swei,gwei;

uchar tm0_count;

unsigned long time;

//unsigned long timeV[8]={0,0,0,0,0,0,0,0};

//uchar count;

float distance;

//================================================================

//uchar code leddata[11]={         //共阴数码管

//

//    0xFC,  //"0"

//    0x60,  //"1"

//    0xDA,  //"2"

//    0xF2,  //"3"

//    0x66,  //"4"

//    0xB6,  //"5"

//    0xBE,  //"6"

//    0xE0,  //"7"

//    0xFE,  //"8"

//    0xF6,  //"9"

//     0x02,  //"-"

//};

uchar code leddata[11]={ 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴数码管

//================================================================

void delay_300us(void)   //误差 0us

{

    uchar a,b;

    for(b=33;b>0;b--)

        for(a=3;a>0;a--);

}

//================================================================

void delay_1ms(void)

{

    uchar a,b,c;

    for(c=1;c>0;c--)

        for(b=142;b>0;b--)

            for(a=2;a>0;a--);

}

//void delay_2ms(void)   //误差 0us

//{

//    uchar a,b;

//    for(b=4;b>0;b--)

//        for(a=248;a>0;a--);

//    _nop_();

//}

//void delay_10ms(void)

//{

//    uchar a,b;

//    for(b=249;b>0;b--)

//        for(a=17;a>0;a--);

//}

/*===================================================================================*/

void Display()

{

       uint tmp;

//     distance = (float)time*UNIT*0.0001;

//     tmp = (uint)distance;

       tmp = time;

       if(tmp<6)                       //测试距离不小于0.6米

       {

              tmp = 6;

       }

       if(tmp>100)                   //测试距离不大于10.0米

       {

             tmp = 100;

       }

       bwei = tmp / 100;

       tmp = tmp % 100;

       swei = tmp / 10;

       gwei = tmp % 10;

       P0 = leddata[gwei];

       W1 = 0;

       delay_1ms();

       W1 = 1;

       P0 = leddata[swei] | 0x80;    //0x01 小数点

       W2 = 0;

       delay_1ms();

       W2 = 1;

       P0 = leddata[bwei];

       W3 = 0;

       delay_1ms();

       W3 = 1;

}

//================================================================

//void InitUart(void)

//{

//    SCON  = 0x50;                    /* SCON: mode 1, 8-bit UART, enable rcvr      */

//    TMOD |= 0x20;               /* TMOD: timer 1, mode 2, 8-bit reload        */

//     PCON |= 0x80;

//    TH1   = 0xF3;                /* TH1:  reload value for 4800 baud @ 12MHz   */

//    TR1   = 1;                  /* TR1:  timer 1 run                          */

//    TI    = 1;                  /* TI:   set TI to send first char of UART    */

//}

//================================================================

void InitTimer0(void)

{

    tm0_count = 0;

       TMOD |= 0x01;

       ET0 = 1;

    TH0 = 0x00;

    TL0 = 0x00;

}

//void Timer1Interrupt(void) interrupt 3

//{

//     BOUT = ~BOUT;

//     Count++;     

//}

//================================================================

void send_bit(uchar n)    //周期25uS

{

       while(n--)

       {

              BOUT = 1;

              _nop_();      

              _nop_();      

              _nop_();      

              _nop_();      

              _nop_();      

              _nop_();      

              _nop_();      

              _nop_();      

              _nop_();      

              _nop_();      

              _nop_();      

              _nop_();

                    

              BOUT = 0;

              _nop_();      

              _nop_();      

              _nop_();      

       }

}

//================================================================

void send_wave()

{

       InitTimer0();

       send_bit(20);

       TF0 = 0;

       TR0 = 1; //超时退出

       IE0 = 0;

       delay_300us();

       delay_300us();

       flag = 0;

       IE0 = 0;

       EX0 = 1; //开外部中断0

//     while(1)

//     {

//            if(flag)

//            {

//                   LED = 0;

//                 break;

//            }

//            Display();     

//     }

       while((!flag) && (tm0_count<3))

       {

              Display();     

       }

       if(tm0_count>=3)

       {

              EX0 = 0; //关外部中断0

              TR0 = 0; //关T0

              TF0 = 0; //清除定时器中断标志

       }    

}

//================================================================

void Ex_INT0 (void) interrupt 0 using 1

{

      

       TR0 = 0; //关T0

       EX0 = 0; //关外部中断0

       time = 0;

       time = TH0;

       time = (time<<8) + TL0;

       time+= (65536*(unsigned long)tm0_count);

       time= (time+300)/600;

       flag = 1;

       if(time > 15)

       {

             alarm = 1;

       }

       else

       {

             alarm = 0;

       }

}

//================================================================

void Timer0Interrupt(void) interrupt 1 using 2

{

       tm0_count++;

}

//================================================================

void main()

       uchar t;

       InitTimer0();

//     InitUart();

       EA = 1;

       IT0 = 1;

       BOUT = 0;

       while(1)

       {

              send_wave();

              for(t=0;t<150;t++)

              {

                     Display();

                     if(alarm)

                     {

                            LED = !LED;

                     }

              }

       }

}

//================================================================

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多