找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 45347|回复: 21
收起左侧

基于单片机的超声波液位测量系统设计资料下载 WORD格式 可编辑

  [复制链接]
ID:195948 发表于 2017-5-3 11:55 | 显示全部楼层 |阅读模式

液位测量及控制广泛应用于工业、生活等领域,由于许多测量环境条件及其恶劣,例如对具有腐蚀性的液体的液位测量。显然,传统的液位测量设备已不能满要求。因此,一些基于超声波的非接触式液位测量控制技术应运而生。本文利用单片机的强大功能,通过硬件和软件的完美结合,设计、实现了一种基于超声波的液位检测控制系统。系统由液位测量模块、数据显示模块、液位控制模块、超限报警模块和参数设置模块组成,通过HC-SR04超声波测距模块采集数据,经过单片机进行数据处理,然后进行实时液位显示,同时发出液位控制信号和报警控制信号。最后,对所实现的实物进行了测试。测试结果表明系统功能符合设计要求,能达到易控制、稳定性强、测量精度高、安全性高、功耗低的预期目的。



目  录


第一章  绪论
  第一节  课题的提出和意义
  一、课题的提出
  二、课题的意义
  第二节  国内外液位检测控制技术的发展现状
  第三节  本课题主要研究内容
第二章  整体方案设计
  第一节 方案设计架构
  第二节 超声波测量技术
  一、超声波的定义及特性
  二、超声波测距原理
  第三节 本章小结
第三章  硬件设计
  第一节  单片机的最小系统组成
  第二节  LCD1602液晶显示模块
  一、LCD1602液晶显示简介
  二、显示内容
  第三节  设置模块
  第四节 报警模块
  第五节  液位测量模块
  一、HC-SR04简介
  二、引脚接线方式
  三、模块工作原理
  第六节  液位控制模块
  第七节 本章小结
第四章  软件设计
  第一节  编译语言与编译思想
  第二节  软件设计
  一、总体设计
  二、关键模块程序设计
  第三节  本章小结
第五章 仿真及调试
  第一节  仿真
  第二节 系统测试
  第三节  本章小结
结   论
致    谢
参考文献
附    录
一、英文原文
二、英文翻译
三、源程序



第一章  绪论

第一节 课题的提出和意义
一、课题的提出
在日常生产生活中,常遇到液位测量及控制问题。比如在一些工业生产自动化系统中对容器中物料位或者液位的测量,又特别是极其恶劣的环境下的测量,比如对具有腐蚀性的液体液位的测量,传统的采用差位分布电极的电极法,通过电脉冲去检测液位高度,电极长期处于这种环境中,极易被电解、腐蚀,从而很容易在短时间内就失去灵敏性。显然,在这种检测环境对测试设备的抗腐蚀性要求较高。因此传统的液位测量设备已不能满足现代工业生产的需要。超声波液位检测系统是一种新兴的液位测量系统,它利用了超声波传感技术的原理,采取一种非接触检测方法,能够实现对工业生产自动化系统中液位、物料位等进行检测。此外,超声波具有很好的束射性和方向性,一般也不会对人体造成伤害。基于超声波的检测控制系统具有实施方便、迅速,测量精度高,易于实时控制,所以有非常广阔的应用领域。
随着人们生活需求和工业标准的提高,液位检测技术愈来愈受到社会的重视,检测的精度以及实时性要求也愈来愈高,另外还要求检测系统对被检测对象具有自动控制功能。可以说,在现在以及今后的很长一段时间里,液位的检测及控制系统的研究也将依然是一个重要的课题。

二、课题的意义

为了改善工人的工作环境,降低工人的劳动强度,节省财力、物力,避免资源的浪费,降低工业生产成本,特别是对某些特殊的生产环境,比如:易爆、高温、低温、毒性、腐蚀性、高压、低压、有辐射性、易挥发等液体的液位进行检测,对于这些对身体健康有一定损害的测量环境,不易在实地直接进行测量及控制,而这种新兴的液位测量及控制技术就显得特别的重要。
在现代工业自动化生产系统中,对容器中液体的液位测量及控制是必不可少的。一般情况下,在生产过程中主要是通过液位的检测来确定容器里原料的剩余量,以保证生产过程中的各环节物料平衡,以及为进行成本核算提供可靠的依据;另外,在连续生产情况下,通过液位检测及控制以保证液位始终在规定的范围内,以保证生产的正常进行,也能更好的保证产品产量和产品质量。可见,液位测量及控制在现代工业生产过程中已起着举足轻重的作用。
仅从液位测量这一方面来讲,随着各行业的不断发展,液位测量已应用到愈来愈多的领域,不仅仅是用于各种管道、容器内的液位检测,还用于水库水渠、江河湖海等水位的检测。传统的液位检测手段在这些领域中已经无法达到所需要的精确性,因此,超声波液位测量这种测量方式已经成为一种新方法被广泛的应用。


第二节  国内外液位检测控制技术的发展现状
早期的液位检测大多采用机械原理。近年来,随着电子技术应用到越来越广泛的领域,也逐步向液位检测及控制方向发展,并且研究出来了一些新的液位检测技术。尽管在传统技术中也渗透了一些先进的电子技术及计算机技术,在结构和功能上也都有很大提升,但总体来说,目前我国的液位检测技术还是比较落后,液位检测方法也依然有一些不足之处,如果从国外进口我们所需的高精度液位检测设备,价格又比较高。因此,分析液位检测控制技术当前国内外形势,发展属于我们自己国家的液位检测技术就显得非常重要。目前,国内外在液位检测方面采用的技术更多的是传统检测技术,按其采用的检测技术及使用方法分类就已多达十余种。我们常见的液位检测技术有:浮体式液位测量仪表、人工检尺仪、磁致伸缩液位仪、差压式液位测量仪表、激光液位仪、雷达液位仪、超声波液位测量仪表、伺服式液位测量仪表。
超声波液位检测仪是我们最常见的一种,也是所有非接触式液位检测仪表中用途最广、发展最快的一种。它具有一些其它液位测量技术无法比拟的优点,它可以适应腐蚀性强、高压、低压、有辐射性、有毒性、高温、低温、易挥发、易爆等特殊环境,因此,能应用的范围比其它的检测技术更广泛。随着现在科学技术的飞速发展,液位的检测方法也变得更先进,精度也有了很大的提高。尤其是传感器技术和单片机技术的进步使得液位检测技术得到了更进一步的优化。超声波在液位测量中的应用愈来愈广,但从现在的发展水平看来,超声波在液位检测控制系统中的应用还存在着一定的限度,因此研究超声波的液位检测技术还有更宽更长的路要走,无论是在技术领域还是在产业领域它都具有极其广阔的发展空间。
在不远的将来,基于超声波的液位检测控制技术将会有更大更广的应用范围。它不但可以帮助人们解决很多生活中的难题,还可以作为一种科学探测和研究的手段。


第三节  本课题主要研究内容
本设计以简易水槽和水泵搭建实验模型,鉴于单片机的液位测量控制装置具有工作寿命长、测量精确、耗能低、重复性好等优点,设计以单片机为基础、超声波测距为核心的液位测量控制系统。本系统具有液位实时检测、控制、超限报警等功能。设计的内容包括:
设计基于超声波液位检测控制系统方案,实现液位检测、数据显示及闭环控制等功能;
设计、实现检测控制器相关的软硬件模块;
实现演示系统开发。


第一节 方案设计架构
根据实际生产生活需要,结合课题设计要求,本设计应该具有正常液位范围设定、液位测量、超限报警、液位显示、液位控制五大功能。方案设计架构如图2.1所示。

1.001.jpg




图2.1 液位测量控制系统设计方案

正常液位设定在该系统中对应输入设备,即后文所说的设置系统。可以通过设置系统将人的信息传递给系统,使得系统工作具有一定的目的性。实时液位测量是系统数据采集的唯一来源,用HC-SR04 超声波测距模块采集的数据经过单片机处理过后将成为后面液位显示、超限报警、液位控制等功能实现的重要依据,因此,实时液位测量是系统能否正常工作的关键所在。超限报警是在实时液位与设定正常液位范围比较之后做出的反应,提示相关工作人员该系统检测控制的对象正处于一种非正常状态(在这里主要指液位过高或过低)。液位显示是将单片机通过HC-SR04 测距模块采集回来的实时液位数据显示出来,便于相关工作人员了解具体情况。液位控制模块作为该系统唯一的执行器,主要功能是通过排水泵和进水泵保证液位始终在人为预先设定的一个正常范围内。


第二节 超声波测量技术
在第一节整体方案框图中可以很明显的看出,实时液位测量是系统工作的整个流程中的关键部分,因此,与此紧密相关的超声波液位测量技术在这里起着举足轻重的作用。

一、超声波的定义及特性

频率大于20000Hz的声波称之为超声波。
超声波具有吸收特性、束射特性、声压、高功率作用四个基本特性,四个基本特性使超声波在传播介质中对应热学、化学、光学、力学和电学五种效应。超声波的特点是它能在各种媒质中传播;波长短,因而分辨率很好;声束尖锐,因而声能比较集中;在不同的介质的界面上都会发生折射、反射、散射等一般现象。利用声在媒质中的衰减、反射、共振、声速这些现象可以测量物质的成分、比重、厚度等。可用于测距、测速、清洗、焊接、碎石、杀菌消毒等。在军事、医学、农业、工业上都会有很多的应用。利用超声波脉冲反射回波这一特点可以实现超声波测距。

二、超声波测距原理

空气中的超声波每秒的传播距离约为340米,因此,若能测出在介质中超声波的传播时间,就能计算出超声波在该介质中传播的距离。超声波测距就是通过测定超声波在测量仪与被测对象间的传播的时间来计算出声波传送的距离的。常用的超声波测距主要采用以下两种方法:

1直接式超声波测距法

测量超声波发射器发射超声波到超声波接收器接收到超声波的时间t1,已知超声波在传播介质中的传播速度V,那么超声波发射器与被测对象两者之间的距离S1为: 1.002.jpg

                            1.003.jpg                        (式2-1)

2反射式超声波测距法

将超声波发送器的发射方向面对被测对象,并发射超声波,在发射超声波的同时计时开始,超声波在介质中传播,遇到被测物后就立即反射回来,超声波接收器在接收到被测对象反射回来的超声波后计时停止,这样就可以计算出超声波从发射器到被测物间来回传播的时间t2,超声波在该传播介质中的传播速度V已知,从而发射器到被测物的距离S2可用下式计算出来:

                     1.004.jpg                        (式2-2)



第三节 本章小结
对于任何的系统设计,整体方案的拟定是极其重要的,就如同一篇文章的提纲。本课题是基于单片机的超声波检测控制系统设计,其中的各个模块的选定都必须符合实际情况需要,并且最好能保证成本低廉、选材容易。
超声波测量技术是本次设计中的关键所在,由于超声波具有其传播距离远、能量散失缓慢、方向性强等优点,因此常常应用于距离的测量。如测距仪和液位测量仪等都可以通过超声波原理来实现。超声波测距也广泛应用于倒车雷达、建筑工地以及井深、液位、管道长度等一些工业现场,在这些场合利用超声波测量常常计算简单、比较快捷,并且容易做到实时控制,能够保证足够高的测量精度,因此在测控系统的研制上也得到了极其广泛的应用。本课题就是做一套以AT89C51单片机和超声波测距模块为核心的低成本、高精度、微型化、低能耗、具有数字显示功能的超声波液位检测及控制系统。






第三章  硬件设计

第一节  单片机的最小系统组成
所谓单片机的最小系统,就是用最少元件组成的能够工作的单片机系统。MCS-51系列单片机的最小系统至少应该包括单片机、时钟电路、复位电路、输入/输出设备,如图3.1所示。

1.005.jpg

图3.1 单片机最小系统

在最小系统的时钟电路中,XTAL1(单片机的19脚)和XTAL2(单片机的18脚)是独立的输入、输出反相放大器,这两个脚能够利用石英晶振为单片机配置片内振荡器,此外,也可以直接通过XTAL1 、XTAL2由外部时钟驱动。本次设计中采用的是内部时钟模式,也就是用单片机的内部振荡电路时钟。在XTAL1 、XTAL2的引脚上分别外接与需要相匹配元件,即一个石英晶体和两个电容,内部振荡器就可以产生自激振荡。通常情况下,晶振的值可以在1.2~12MHz 之间任意选择,在本次设计中采用的是11.0592M 的石英晶振。通过改变和晶振并联的两个电容的大小可以微调频率。如果选用石英晶振,并联电容可在20~40pF之间任意选择,本此设计使用的是30pF,是单片机设计中常用的一个经典值。
复位电路在单片机系统中也是非常关键的,当单片机死机或程序跑飞时,就需要进行复位操作。MCS-51系列单片机的复位引脚是RST(第9管脚),当RST出现2个10ms或者更长的高电平时,单片机就会执行复位操作。若RST一直为高电平,单片机就将会处于循环复位的状态,当然这种情况没有什么实际的意义。
通常有两种最基本形式进行单片机的复位操作,即开关复位和上电自动复位,这两种最基本复位方式都已包含在图3.1中。上电自动复位过程如下:上电瞬间,有极电容两端电压是不会变的,由于此时电容负极和复位引脚RST相连,所以电压全部加在电阻上,RST的输入为高电平,芯片进行复位操作,随之然后5V电源开始给电容充电,电阻上的电压慢慢减小,最后约为零,芯片就开始正常工作。将复位按键并联在电容的两端,当复位按键没有按下时电路实现的是以上所说的上电复位。而在芯片正常工作后,可以通过按下复位按键使RST管脚出现高电平从而实现手动复位。理论上只要RST 管脚上持续10ms或者更长的高电平,就可以使单片机进行有效复位操作。以上设计图中所示的复位电阻和电容均为经典值,实际应用的时候可用同一数量级合适的电阻和电容替换,设计时也可根据自身设计需要自行计算RC充电时间以选取合适的电阻、电容值,以保证单片机的复位电路可靠,符合实际需求。


第二节  LCD1602液晶显示模块
一、LCD1602液晶显示简介
液晶显示有多种分类方式,常常可以按液晶显示器的显示方式分为字符式、段式、点阵式。除了最简单的黑白显示方式外,液晶显示器还有彩色、多灰度等显示方式,另外,还可以调节芯片的特定引脚电压控制其显示对比度。如果根据驱动方式来分,还可以分为主动矩阵驱动(Active Matrix)、单纯矩阵驱动(Simple Matrix)、静态驱动(Static)三种。
根据实际情况综合考虑,本次设计采用的是LCD1602液晶显示。LCD1602利用液晶的物理特性,用电压去控制显示的区域,有电就有显示,这样即可以显示出与输出信息相对应的图形。这种液晶显示器具有厚度薄、易于实现全彩色显示、适用于大规模集成电路直接驱动的特点,目前已经被广泛应用在便携式电脑、数字摄像机、移动通信工具等各个领域。
本次设计的LCD1602液晶显示模块与单片机连接如图3.2。

1.006.jpg

图3.2 LCD1602液晶显示模块设计图

二 、显示内容
本次设计的液晶显示模块显示内容分为两行两列,其内容分别为实时液位(DIS)、设定值的高限(DH)、液位状态(U(正常)、H(过高)、L(过低))、设定值的低限(DL)。


第三节  设置模块
设置模块共设计了四个按键,主要任务是设定预设液位的正常范围(预设正常液位范围的上、下限)。如图3.3。

1.007.jpg

图3.3 设置系统

Key1:模式(DH或者DL)选择,用于设置预设正常液位的范围;
Key2:选择每次改变值的大小,即每次递增(减)1或者0.1;
Key3:递加;
Key4:递减。


第四节 报警模块
报警模块共设置两个灯光报警器。当液位超过预设范围的最大值时,led1亮;当液位低于预设范围的最小值时,led2亮。如图3.4所示。

1.008.jpg

图3.4 报警系统



第五节 液位测量模块
一、HC-SR04简介
    HC-SR04超声波测距模块的有效测量距离为2cm-400cm,检测的精度为1 mm,模块包括信号控制电路、超声波接收器和超声波发射器。其实物图如图3.5,原理图如图3.6。
1.009.jpg
图3.5 HC-SR04 实物图

1.010.jpg
图3.6 HC-SR04原理图
HC-SR04电气参数如表3.1:

表3.1 HC-SR04电气参数
电气参数
HC-SR04超声波模块
工作电压
DC 5 V
工作电流
15mA
工作频率
40Hz
最远射程
4m
最近射程
2cm
测量角度
15度
输入触发信号
10usTTL脉冲
输出回响信号
输出与射程成比例的TTL电平信号,
规格尺寸
45*20*15mm

二、引脚接线方式

VCC:供5V电源;
Trig:输入出发控制信号;
Echo:输出回响信号;
GND:接地。

三、模块工作原理  

超声波测距模块采用单片机I/O口触发测距,给模块的控制端口一个10us以上的高电平信号,模块就会启动工作模式,自动发送8个40khz的方波,然后在超声波接收端开始自动检测是否有返回信号。若有信号返回,就通过一个I/O口输出高电平,超声波从超声波发射器到被测对象之间来回传播所用的时间就是这个高电平的保持时间,这个过程时序图如图3.7。

1.011.jpg

图3.7 HC-SR04模块工作时序图


第六节 液位控制模块
液位控制模块分为进水系统和排水系统。当液位超过预设液位范围的最大值时,排水系统运行,通过微型水泵将槽内的水陆续排除,直到槽内液位低于预设范围的最大值;当液位低于预设液位范围的最小值时,进水系统运行,通过微型水泵向槽内加水,直到槽内液位高于预设范围的最小值。控制模块的设计如图3.8所示。

1.012.jpg 1.013.jpg
a                               b

图3.8 液位控制模块


第七节 本章小结
一个大的系统总是可以分为多个模块的,每个模块又是这个系统正常实现所有功能不可缺少的部分。在最初的系统设计中常常用这种化大为小的设计方式,从而使得设计过程变得更有条理。特别是每个模块可以分给不同的人进行设计时,这样就加快了方案的设计进度。


第四章  软件设计

第一节                编译语言与编译思想
汇编语言和C语言是目前单片机的两种主流编程语言。汇编语言的优点是代码短、程序效率高,但存在可移植性可读性差的缺点;C语言的优点是可移植性好、可读性好,但存在代码较长、代码效率较低的缺点。考虑到本次设计的超声波液位测量控制系统要求不太高,本次超声波液位测量控制系统的设计采用C语言编写。
本次软件设计采用程序设计模块化的思想,对实现不同功能的程序进行分段编程,这样不但使得整个程序有比较清晰的层次和结构,而且还很有利于软件的后期调试和修改。按本次设计的需要,单片机主要任务是发出控制信号使超声波模块开始工作并自动发出40kHz的脉冲,控制信号驱动超声波探头器发射超声波,同时单片机通过一个I/O口检测回波,该I/O口在有回波时输出高电平,高电平持续时间即是超声波的传播时间,由此得出超声波在测距系统与被测物间的往返传输时间t,再用前文推导的公式(式2-2)
可求出待测距离S。


第二节                软件设计
  • 总体设计
    单片机液位控制系统的软件首要功能是控制超声波的发射和接收,测量介质中超声波的传播时间,再根据介质中超声波的传输传播速度来计算出被测对象与测量仪器之间的距离,并将计算出来的数据加上相关标识用LCD1602液晶显示器显示出来,同时使单片机输出控制信号以控制报警系统和液位控制系统。要实现上述功能,软件具体来说应该包含初始化、参数读入、超声波发射、超声波传接收、计时、距离计算、数据显示、超限报警、液位控制等功能模块。程序设计流程图如图4.1所示。

                             

1.014.jpg

过高                 过低

图4.1 程序设计流程图

二、关键模块程序设计

1超声波测距子程序

通过测量超声波模块与液面的传播时间来计算液面高度,流程图如图4.2。
1.015.jpg

图4.2 超声波测距程序设计流程图

测距程序如下:

void CJ(void)

{

              Trig=1;     //启动一次检测模块

              delay_20us();

              Trig=0; //停止向检测模块Trig端发送高电平

              while(!Echo);      //无回波时等待

              TR0=1;             //计时开始

              while(Echo);       //有回波是计数并继续等待

              TR0=0;

              time=TH0*256+TL0;   /计算超声波的传播时间

              TH0=0;

              TL0=0;

              distance=145.05-time*0.172;//  计算距离,算出来的单位是mm

              if(distance<=0)distance=0;

              if(distance>=145.05)distance=145.05;

//              distance=(int)(distance*100)/100; //强制保留2位小数

}

2、按键控制子程序

通过按键控制程序实现参数设定,其中主要是正常液位范围的设定。包括设置参数的模式选择、单次递增(减)值大小(1或0.1)、递减、递增。程序如下:

float set_distance(float set_dis)

{

   if(!key3)

     {

                  delay(10);

                 if(!key3)

                 {

                 while(!key3);

                   set_dis=set_dis+b;

                            if(set_dis>=99)

                            set_dis=99;

                 }

}

     ……

              return set_dis;

}

3显示子程序

显示程序实现数据的实时显示,包括实时液位,允许的最高液位和最低液位,液位正常与否的状态。程序如下:

void display(uchar x,uchar y,uchar sz,uint num)//x:位置 y:第几排 sz:位数 num:值

{

  uchar a[5]={0};

   uchar i=0;

   uint Temp=num;

   while(Temp)

   {

     a[ i] = Temp%10;

                Temp = Temp/10;

                i++;

   }

   if(y%2==1)

       write_Com(0x80+x-1);

              else

                 write_Com(0xc0+x-1);

              for(i=sz;i>0;i--)

                {

                   write_Data(0x30+a[i-1]);

                }            

}

4、主程序

主程序通过调用个子程序实现各功能。主程序如下:

     void main()

{

uint w;

              init();

              while(1)

              {            

              w++;

              if(w==5)

              {

                            w=0;

                            CJ();

              }

              BJ();                           

              display_Init();

              }

}

5延时子程序

在系统编程中,延时程序的应用是极其普遍的,按键的延时去抖就是一个很好的例子。本次设计的演示程序如下:

void delay(uint x)

{

uint i,j;

for(j=0;j<x;j++)[ size][="" p][p="24," null,="" left][size="12pt]" for(i="0;i
第三节 本章小结

程序是一个系统运行必不可少的一部分,如果没有程序,硬件设备就如同虚设。因此,程序的编写及变得极其重要。本次程序设计语言选用我们比较熟悉的是C语言,而且编写过程中又采用了模块化方法,从而更易于编写和理解,也有助于后期的修改和调试。



第五章 仿真及调试

第一节 仿真
结合Protues和Keil软件,将设计的程序与电路在电脑上仿真,由于超声波液位测距模块没有相应的仿真元件,故超声波液位测距模块无法进行仿真,现将实时液位设为一固定值,通过改变设定正常液位的上下限来实现仿真。
如图5.1,实时液位为25.0mm,上限为25.5mm,下限为24.5mm,即当实时液位在正常液位范围内时,报警系统和水位控制系统均无异常。

1.016.jpg
图5.1 仿真(液位正常)

如图5.2,实时液位为25.0mm,上限为24.5mm,下限为23.5mm,即当实时液位高于正常液位范围内时,报警系统led1亮,排水系统启动。

1.017.jpg
图5.2 仿真(液位过高)

通过以上仿真,可以说明编写的程序是正确的,并且能够实现预期的所有功能,这也有利于后面的实物功能实现。


第二节 系统测试
在程序编译完成并仿真调试成功和硬件电路制作完成之后,将编译好的程序下载到本次设计所用的单片机上,进行下一步的综合调试。综合调试成功后对检测控制的重复一致性和误差进行相关分析,从而进一步优化该系统的性能,以达到预期设计的检测及控制要求。硬件实物图如5.3所示。
现在设置正常液位下限为80.5mm,上限为99.5mm。
当实时液位为72.2mm,即液位小于80.5mm时,系统红色水位过低报警灯亮启,并启动进水系统,使得液面逐渐升高。实物运行图5.4。



1.018.jpg



图5.3 硬件实物图

1.019.jpg

图5.4 系统调试图(一)


当实时液位为88.8mm,即液位大于80.5mm且小于99.5时,液位在正常范围之内,报警系统和水位控制系统均无异常。实物运行图如图5.5。

1.020.jpg

图5.5 系统调试图(二)

当实时液位为110.4mm,大于99.5mm时,系统绿色水位过高报警灯亮启,并启动排水系统,使得液面逐渐下降,直到在正常液位范围内。实物运行图如图5.6。

1.021.jpg

图5.6 系统调试图(三)


第三节 本章小结
在仿真及调试中总会遇到一些或大或小的问题,在本次设计的仿真及调试中主要遇到以下三个问题:
控制电机起停的继电器不工作。
问题分析及解决方案:记过反复实验发现造成上问题的原因是单片机发出的控制信号经过一个功率放大器后仍然太弱,不足以能够控制继电器。于是在之前的基础上再加一个功率放大器,最后实现了单片机输出控制信号通过继电器控制进、排水泵的起停。
用一个电源为该系统中所有模块时,系统不能正常工作。
问题分析及解决方案:查明是水泵负载过大导致系统出现上述问题。解决办法是为液位控制模块单独供电。并且设计水泵的额定电压为3.3V,系统提供的电压为5V不适合为该水泵供电。
在液位控制系统的作用下,液位在设置的上限和下限附近时出现抖动(进(排)水系统时而运行时而停止、报警灯持续闪烁)。
问题分析及解决方案:通过反复试验观察发现是由于液位采集频率过高,水泵停止时水管中还未排出的那段水返回原来的水槽内。以液位在上限处为例:液位从超出设定上限在排水泵的作用下刚好低于设定上限时,排水泵停止工作,此时排水管中还未排出的那段水又会在重力作用下回到被测液位的水槽中,导致水槽中的水位再一次上升,从而又会再次启动排水泵,如此循环。
解决办法是通过改变控制程序降低液位采集频率,增大两次液位检测的时间间隔,从而增大两次水泵控制信号发出的间隔时间,从而增大这期间水泵的排水量,使得水泵停止后水管中为排出的那段水即使回到水槽中也不会超过设定的液位上限。




结  论

本设计以单片机为核心,利用超声波测距原理,通过软件程序的编写、实物的制作、以及软硬件的综合调试,最终实现系统的液位测量及控制功能。系统的实物包括超声波发射及接收模块、报警模块、显示模块、设置模块、液位控制模块等;在软件设计上采用了模块化的程序设计思想,提高了程序编写的效率。本设计能够对2cm~400cm的距离内进行有效的测量,其精度可以达到1mm,并达到了低成本、高精度、低功耗、微型化、美观的预期设计目的。可见基于单片机设计的超声波液位测量控制系统具有硬件结构简单、工作可靠等特点。本系统不仅可以用于液位检测,距离测量,还可广泛应用于诸如移动机器人精确定位等各种检测控制系统中。




附  录
一、英文原文

1.022.jpg

1.023.jpg

1.024.jpg
1.025.jpg

1.026.jpg

1.027.jpg

1.028.jpg

1.029.jpg

1.030.jpg

二、英文翻译

一项超声波距离测量中可行且精确的确定飞行时间的技术

Tarik Namas and Murat Dogruel

Sarajevo国际大学自然科学工程系

电子邮箱: mdogruel@ius.edu.ba

摘要——这篇文章提出了一种关于在空中高精度超声波距离测量的高效算法的数字信号处理技术。开始发射脉冲和响应峰值之间的时差用于确定飞行时间(TOF)。过滤后的峰值响应决定于使用Hilbert变换和适当的抛物线插值处理过的一个特殊的复杂信号的幅值。该方法有效地消除了接收信号中的噪声和干扰,使得TOF与接收到的信号强度无关。实验结果表明精度优于千分之一。
【关键词】 超声波测距 飞行时间 Hilbert变换 抛物线插值
1、简介
许多科学和工业应用需要距离测量,一些地方需要非接触式测量。空气中的距离通常通过使用超声波传感器测量,这类系统价格便宜并能提供很好的性能。
根据不同的应用程序中,有很多使用超声波技术来测量距离[1]。
它主要测量原理是根据估计飞行时间(TOF)来计算距离。接收机和发射机之间的距离d = v×TOF ,v是声音在传播介质中的速度(通常情况下是空气速度) [2]。
一个简单而快速典型的方法来确定TOF是阈值方法[3],然而,这种方法不是首选,因为由于噪声和错误的振幅,所以接收到的信号并不是固定的。
确定TOF的另一种方法是互相关技术[4]。时间在接收和传输信号之间的哪个地方互相关的最大,就在这里取得TOF。
在距离测量中,一个不同的概念就是相移法。通过测量信号发射和接收之间的相移计算距离[5]。组合这两个以前的概念被认为是第三个甚至更准确的概念[6]。
我们采用一种新方法确定TOF,即使用时间(样本)的峰值(接收信号)和开始发射脉冲的不同响应。
避免使用被噪声影响的阈值水平,超声波前置放大器的峰值转换成举行脉冲,从而决定TOF。
2、建议方法。
从理论上讲,一个典型双二阶系统的振荡响应如图1。这个信号大约代表当一个发射机发射脉冲信号时超声波接收器接收信号的期望值。

1.031.jpg     1.032.jpg

图1 超声换能器的预期响应       图2 一个典型的超声收发短脉冲的实际响应

另一方面,超声波收发器的实际响应是短脉冲,如图2所示。由于非线性影响,这个形状足够接近,但不完全与图1中的理论情况下相同。
这种方法介绍了轻松、准确地找到在脉冲开始和响应峰值间的时差,可以概括为如下:
1.使用数据采集设备,在延迟之间传输大量短脉冲;
2.获得传播的信号和收到的信号,确定开始脉冲的样本;
3.消除噪声的影响,从接收到的信号Sh [n]获得的带通过滤过的信号Sb[n];
4.找到相应的由Sh[n] 到Sb[n] 的Hilbert变换

5.使用 1.033.jpg 确定超声波的包络响应;

6.获得平滑的包络信号,Eb[n],在E上使用零相位正向和反向带通滤波;
7.在Eb[n]的峰值处应用抛物线插值来确定相应的抛物线的最大峰值实际样本的位置;
8.计算实际样品差别,在脉冲和高峰值获得相应的TOF;
9.找到所有其他脉冲TOF值脉冲序列,找出TOF的平均水平值准确地确定距离。

3、实验装置

实验的设置是图3和图4所示。使用一个IOtech PCI-DAQboard / 3000产生脉冲序列和获取响应。
操作在最大1 MHz 16位分辨率。发射脉冲获得一个数量10伏特样本,总宽度为12个微秒。

1.034.jpg 1.035.jpg

图3 一般的实验设置                  图4 发射机和接收机设置

商业超声换能器使用40 KHz的中心频率,发射器与接收器相对。如图5所示。使用MATLAB进行重复的获取和算法实现。
发射机和接收机安装在图4中使用,所以只有一个模拟输入通道可以用于发送和接收信号。另一种替代方法是使用两个模拟输入获取信号和接收信号。在这种情况下不需要使用发射机和接收机之间的电阻(链接点见图4)。
用于测量罗盘实验平均误差为0.05毫米。
因为这项工作中使用的采样率是1MHz,声音在空气中传播速度大概是330米/秒,这个误差相当于一个采样间隔是0.33毫米。

1.036.jpg

图5 测量系统设置

4、结果

在图6中,10个传播的脉冲和对应的接收信号显示在一起。图7显示了一个放大了的脉冲部分。

1.037.jpg 1.038.jpg

图6 超声波脉冲序列                  图7 图6中的一部分放大

根据所述方法,可以发现信号的包络E如图8所示。平滑的包络信号Eb通过应用零相位数字滤波如图9所示。

1.039.jpg 1.040.jpg

图8 超声波响应的包络                  图9 过滤后的包络信号

对于每一个距离测量实验,都用20个离散的脉冲延时16毫秒。每次测量计算的平均样本不同。平均各种距离结果描绘在图10中,平均样本差异和实际距离呈现非常准确的线性关系。

1.041.jpg

图10 平均样本差异和实际距离之间的线性关系

表1中,实际的测量距离,平均样本差异,标准偏差的测量。从中可以看出标准偏差值非常小,表明测量非常粗略。
获得相应的距离测量,平均样本差异和距离之间形成了一个仿射关系,在毫米校准测量系统距离在75.5毫米和146.3毫米之间。
在表2中,实际的距离和相应的超声测量的距离,获得相应的测量误差。
与用1 MHz超声波测量一个采样间隔距离产生0.33毫米的误差相比,相应的测量误差获得相当小,表明所使用的测量方法的准确性和鲁棒性。

表1 样本差异和标准差                   表2 实际和测量距离

1.042.jpg     1.043.jpg


5、结论

研究提出利用包络的峰值时间值的超声短脉冲响应这一新方法计算飞行时间。
提出了实验装置搭建方式和算法,一个可行的和准确的超声波距离测量系统就可以通过中等大小单片机有效地实现,不需要复杂的电子设备和其他方法。

参考文献

[1]  B. Barshan, “Fast Processing Techniques for Accurate Ultrasonic Range Measurements”, Measurement Science Technology, vol. 11, 2000, pp. 45–50
[2]  D. Marioli, “Digital time-of-flight measurements for ultrasonic sensors”, IEEE Trans. Iinst.. & Meas., vol. 41, February 1992, pp. 93-94.
[3]  R. Queir′os, P. S. Gir?ao, A. Cruz Serra, “Cross-correlation and Sine-Fitting
Techniques  for  High   Resolution  Ultrasonic  Ranging”, IMTC  2006- Instrumentation  and  Measurement Technology Conference, Sorrento, Italy April 2006,pp.552-556.
[4]  G. Andria, F. Attivissimo, N. Giaquinto, “Digital signal processing techniques for  accurate ultrasonic sensor measurement”, Elsevier Measurement. vol. 30, 2001, pp. 105–114 , Vol. 1.
[5]  F.E.  Gueuning,  M. Varlan,  C.E. Eug`ene, P. Dupuis, “Accurate Distance Measurement  by  an Autonomous Ultrasonic System Combining Time-of- Flight  and  Phase-Shift Methods”,  IEEE  Trans. Iinst. & Meas., vol. 46, December 1997, pp. 1236–1240.
[6]  M. Parrila, J.J. Anaya, C. Fritsch, “Digital  signal processing techniques for high  accuracy  ultrasonic range measurements”, IEEE Trans. Iinst. & Meas., vol. 4, August 1991, pp. 759-763.



三、源程序
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uint  unsigned int
  4. #define uchar unsigned char

  5. sbit key1=P2^0;
  6. sbit key2=P2^1;
  7. sbit key3=P2^2;
  8. sbit key4=P2^3;

  9. sbit M1=P1^0;
  10. sbit M2=P1^1;
  11. sbit LED1=P1^2;
  12. sbit LED2=P1^3;

  13. sbit RS=P2^4;
  14. sbit RW=P2^5;
  15. sbit EN=P2^6;

  16. sbit Trig=P1^4;//  定义HC-SR04发送端
  17. sbit Echo=P1^5;//定义HC-SR04接收端

  18. bit flag=1,bflag=1;//succeed_flag超声波测距成功标志  flag设置距离加1或加0.1标志
  19. float distance,DH=99.55,DL=80.55,b;//b加的值大小

  20. uint s,time,disflag;
  21. uint ff=0,distance_xs,DH_xs,DL_xs;
  22. uchar cache[4]={0,0,0,0};

  23. void delay(uint x)
  24. {
  25. uint i,j;
  26. for(j=0;j<x;j++)
  27.    for(i=0;i<123;i++);
  28. }
  29. void delay_20us()
  30. {
  31.     uchar a ;
  32.     for(a=0;a<100;a++);
  33. }

  34. void write_Com(uchar com)
  35. {
  36.    RW=0;
  37.    RS = 0;
  38.    P0 = com;
  39.    EN = 1;
  40.    delay(2);
  41.    EN = 0;
  42. }
  43. void write_Data(uchar date)
  44. {
  45.    RS = 1;
  46.    P0 = date;
  47.    EN = 1;
  48.    delay(2);
  49.    EN = 0;
  50. }

  51. void LCD_Init(void)
  52. {
  53.    write_Com(0x38);
  54.    write_Com(0x0c);
  55.    write_Com(0x06);
  56.    write_Com(0x01);
  57. }
  58. void show_char(uchar x,uchar y,char a)
  59. {
  60.     if(y%2==1)
  61.        write_Com(0x80+x-1);
  62.               else
  63.                  write_Com(0xc0+x-1);

  64.               write_Data(a);               
  65. }
  66. int xs(float xs)
  67. {            
  68.               float a;
  69.               a=xs-(int)xs;
  70.               xs=(int)10*a;
  71.               return xs;
  72. }

  73. void display(uchar x,uchar y,uchar sz,uint num);//x:位置 y:排数 sz:个数 num:数值
  74. void display_Init()
  75. {
  76.     show_char(1,1,'D');            
  77.               show_char(2,1,'I');            
  78.               show_char(3,1,'S');
  79.               show_char(4,1,':');
  80.               show_char(8,1,'.');

  81.               show_char(1,2,'C');            
  82.               show_char(2,2,'O');            
  83.               show_char(3,2,'N');
  84.               show_char(4,2,':');


  85. //              show_char(10,1,'D');            
  86.               show_char(11,1,'H');
  87.               show_char(12,1,':');
  88.               show_char(15,1,'.');

  89. //              show_char(10,2,'D');            
  90.               show_char(11,2,'L');
  91.               show_char(12,2,':');
  92.               show_char(15,2,'.');
  93.             
  94.               switch ( ff ) //判断进水放水情况
  95.                             {
  96.                               case 0:show_char(7,2,'U');;break;//无操作
  97.                               case 1:show_char(7,2,'H');;break;//放水
  98.                               case 2:show_char(7,2,'L');;break;//进水
  99.                             }
  100.               distance_xs=xs(distance);
  101.               DH_xs=xs(DH);
  102.               DL_xs=xs(DL);
  103.               display(5,1,3,distance);
  104.               display(9,1,1,distance_xs);

  105.               display(13,1,2,DH);
  106.               display(16,1,1,DH_xs);

  107.               display(13,2,2,DL);
  108.               display(16,2,1,DL_xs);
  109.                                                                                                                                                                                                                                                            
  110. }
  111. void display(uchar x,uchar y,uchar sz,uint num)//x:位置 y:第几排 sz:位数 num:值
  112. {
  113.    uchar a[5]={0};
  114.    uchar i=0;
  115.    uint Temp=num;
  116.    while(Temp)
  117.    {
  118.       a[i] = Temp%10;
  119.                 Temp = Temp/10;
  120.                 i++;
  121.    }

  122.    if(y%2==1)
  123.        write_Com(0x80+x-1);
  124.               else
  125.                  write_Com(0xc0+x-1);

  126.               for(i=sz;i>0;i--)
  127.                 {
  128.                    write_Data(0x30+a[i-1]);
  129.                 }
  130.                
  131. }
  132. //按键控制函数
  133. float set_distance(float set_dis)
  134. {

  135.    if(!key3)
  136.      {
  137.                   delay(10);
  138.                  if(!key3)
  139.                  {
  140.                  while(!key3);
  141.                    set_dis=set_dis+b;
  142.                             if(set_dis>=99)
  143.                             set_dis=99;
  144.                  }
  145.                 }
  146.               if(!key4)
  147.      {              delay(10);
  148.                  if(!key4)
  149.                  {
  150.                  while(!key4);
  151.                    set_dis=set_dis-b;
  152.                             if(set_dis<=0)
  153.                             set_dis=0;
  154.                  }
  155.      }
  156.               if(!key1)
  157.      {              delay(10);
  158.                  if(!key1)
  159.                  {
  160.                  while(!key1);
  161.                    flag=~flag;
  162.                  }
  163.      }
  164.               if(!key2)
  165.      {              delay(10);
  166.                  if(!key2)
  167.                  {
  168.                  while(!key2);
  169.                    bflag=~bflag;
  170.                  }
  171.      }
  172.               return set_dis;
  173. }

  174. void CJ(void)
  175. {
  176.               Trig=1;     //启动一次检测模块
  177.               delay_20us();
  178.               Trig=0; //停止向检测模块Trig端发送高电平
  179.               while(!Echo);      //当接收为零时等待
  180.               TR0=1;             //开启计数
  181.               while(Echo);       //当接收为1计数并等待
  182.               TR0=0;
  183.               time=TH0*256+TL0;   //检测 所需时间
  184.               TH0=0;
  185.               TL0=0;
  186.               distance=145.05-time*0.172;//  计算距离,算出来的单位是mm
  187. //              distance=(int)(distance*100)/100; //强制保留2位小数
  188. }

  189. void BJ()
  190. {
  191.               if(flag)
  192.               {
  193.                             DH=set_distance(DH);if(DH<DL)DL=DH;
  194.               }
  195.               else
  196.               {
  197.                             DL=set_distance(DL);if(DL>DH)DH=DL;
  198.               }
  199.               if(bflag)
  200.               {
  201.                             b=1.00;
  202.               }
  203.               else
  204.               {
  205.                             b=0.10;
  206.               }
  207.               if(distance>DH)
  208.               {
  209.                 LED1=1;
  210.                 LED2=0;
  211.                 M1=1;
  212.                 M2=0;
  213.                 ff=1;
  214.               }
  215.    else if(distance<DL)
  216.                             {
  217.                             LED2=1;
  218.                             LED1=0;
  219.                             M2=1;
  220.                             M1=0;
  221.                             ff=2;
  222.                             }
  223.                             else
  224.                               {
  225.                               M1=0;
  226.                               M2=0;
  227.                               LED1=0;
  228.                               LED2=0;
  229.                               ff=0;
  230.                               }
  231. }
  232. void init()
  233. {
  234.               TMOD=0x01;  //高T0工作方式为方式1,GATE=1
  235.               TH0=0;
  236.               TL0=0;
  237.               ET0=1;      //允许T0中断
  238.               EA=1;       // 开启总中断
  239.               M1=0;
  240.               M2=0;
  241.               LED1=0;
  242.               LED2=0;
  243.               LCD_Init();
  244.               delay(5);
  245.               display_Init();
  246. }
  247. void main()
  248. {
  249. uint w;
  250.               init();
  251.               while(1)
  252.               {            
  253.               w++;
  254.               if(w==5)

  255. …………限于本文篇幅 余下代码请从51hei论坛下载附件…………
复制代码

完整文档下载 WORD格式 可编辑:
基于单片机的超声波液位检测系统设计.doc (4.15 MB, 下载次数: 245)

评分

参与人数 1黑币 +5 收起 理由
aa521314 + 5 很给力!

查看全部评分

回复

使用道具 举报

ID:1 发表于 2017-5-3 20:56 | 显示全部楼层
好资料,51黑有你更精彩.
回复

使用道具 举报

ID:238178 发表于 2017-10-10 08:23 | 显示全部楼层
借鉴 借鉴 借鉴
回复

使用道具 举报

ID:89286 发表于 2017-10-10 11:25 | 显示全部楼层
thanks for sharing
回复

使用道具 举报

ID:268885 发表于 2018-5-27 15:57 | 显示全部楼层
为什么仿真出来距离为0,而且仿真是trig和echo没有对应的标号啊
回复

使用道具 举报

ID:439417 发表于 2018-12-5 11:12 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:452967 发表于 2018-12-23 22:44 | 显示全部楼层
谢谢分享                    
回复

使用道具 举报

ID:452967 发表于 2018-12-23 22:47 | 显示全部楼层
谢谢分享                 
回复

使用道具 举报

ID:376748 发表于 2019-2-14 23:53 | 显示全部楼层
给力啊
回复

使用道具 举报

ID:546314 发表于 2019-5-24 14:11 | 显示全部楼层
谢谢大佬
回复

使用道具 举报

ID:601354 发表于 2019-8-19 21:52 来自手机 | 显示全部楼层
楼主,你这个文我挺感兴趣,可是我下载失败了,唉
回复

使用道具 举报

ID:601354 发表于 2019-8-20 21:03 来自手机 | 显示全部楼层
楼主我今天又下载失败了,我该怎么办才能下载成功啊如果看到了可以回复一下吗
回复

使用道具 举报

ID:603471 发表于 2019-8-25 01:18 来自手机 | 显示全部楼层
挺好的,我要下载使用
回复

使用道具 举报

ID:640181 发表于 2019-11-12 09:46 来自手机 | 显示全部楼层
谢谢楼主分享,正好需要用这个文档做参考
回复

使用道具 举报

ID:675188 发表于 2019-12-27 10:10 来自手机 | 显示全部楼层
怎么下载?
回复

使用道具 举报

ID:439653 发表于 2020-2-6 16:37 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:709656 发表于 2020-3-16 19:16 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:713592 发表于 2020-3-30 00:53 | 显示全部楼层
非常棒!下载下来看看
回复

使用道具 举报

ID:315512 发表于 2020-4-15 09:37 | 显示全部楼层
哈哈,我也在做这个论文,而且我也是重邮的
回复

使用道具 举报

ID:555681 发表于 2020-5-10 20:22 | 显示全部楼层
楼主我想知道你这个英文文现咋式图片  没有文字格式的吗  想要
回复

使用道具 举报

ID:677874 发表于 2020-5-16 10:50 | 显示全部楼层
赞!很给力
回复

使用道具 举报

ID:897091 发表于 2021-3-29 12:04 | 显示全部楼层
不错不错,等明天登录一下就下载
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表