基于超声波传感器的液位测量及控制系统设计(STM32)

news2024/9/24 1:20:58

一、引言

随着工业的发展,计算机、微电子、传感器等高新技术的应用和研究,液位仪表的研制得到了长足的发展,以适应越来越高的应用要求。液位的测量在工业生产过程中已经起着相当重要的作用,其类型大概可以分为接触型和非接触型两大类。

超声波液位测量就属于非接触型液位测量的一种,所以它也有不受被测介质影响,不影响被测介质,能适应粘度高、腐蚀性强等特殊介质的测量的特点,能适应的范围比其它的测量手段更广泛。单片机技术和传感器技术的结合使液位测量方法得到了更进一步的发展,精度也有了更佳的提高。

本设计中,采用超声波传感器测距,根据相关计算得到液位高度。本设计可以完成0~20cm水位高度的测量,并可实现10~20cm之间的液位自动调节,该设计可以精确到mm位。结合STM32单片机,加上按键输入控制、OLED显示部分、Lora无线串口、电机等元器件,通过软件程序设计实现了整个系统对于水位的监测、控制的功能。

二、系统设计方案

 

超声波测量控制部分:通过超声波模块反馈的数据通过相应的计算分析处理,得到液面高度,然后将此数据与按键输入设置的期望液面高度进行误差比较,对得到的误差进行PID计算,将计算后结果加到控制电机的PWM波中,以实现对两个蠕动泵进行控制。

当实际液面高度大于期望液面高度时,误差为负,单片机会发送低电平给一个泵,给另一个泵高电平,进而控制两个电机蠕动泵正反转实现抽水,直至实际液面高度达到期望液面高度为止;同理,当实际液面高度小于期望液面高度时,误差为正,合理控制两个电机蠕动泵正反转实现进水。

显示部分:通过软件程序设计,在OLED显示屏上显示实际液面高度、期望液面高度等有效信息,同时采用Lora无线串口,将数据实时传输到电脑上位机端,方便清晰地显示出该测量控制系统的调节过程曲线变化。

三、硬件选型HC-SR04模块

1、HC-SR04模块是一款常用的超声波测距模块,该模块具有性能稳定,测度距离精确,模块高精度,盲区小的优点

工作原理:

1)采用IOTRIG触发测距,给至少10us的高电平信号;

2)模块自动发送840khz的方波,自动检测是否有信号返回

3)有信号返回,通过IOECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。

测试距离=(高电平时间*声速(340M/S))/2;

4)本模块使用方法简单,一个控制口发一个10US以上的高电平,就可以在接收口等待高电平输出。一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离。如此不断的周期测,即可以达到你移动测量的值。

2、L298N模块

该驱动板可驱动两路直流电机,两个使能端为高电平时有效,若要对直流电机进行PWM调速,需要设置IN1和IN2,确定电机的转动方向,然后对使能端输出PWM脉冲,即可实现调速。注意当使能信号为0时,电机处于自由停止状态;当使能信号为1,且IN1和IN2为00或01时,电机处于制动状态,阻止电机转动。

四、软硬件设计

1、硬件

电源部分:采用12V锂电池,4500mAH锂电池供电。

稳压部分:通过稳压模块将电压转换到5V对单片机STM32F103C8T6、L298N模块以及超声波HC-SR04模块进行供电。

检测部分:采用超声波HC-SR04模块检测液面高度,单位采用毫米。

控制部分:通过单片机STM32F103C8T6对采集的数据进行分析,并通过PWM脉冲宽度对水泵进行控制,实现水泵的抽水、进水功能。

显示部分:采用OLED液晶显示屏将超声波采集的数据进行输出,以便于人为观察及调试;通过上位机波形显示可得到系统调节稳定过程。

输入装置:通过按键输入数据,以达到手动调节水位的目的。

2、软件

超声波控制水位软件设计:当实际液面高度大于期望液面高度时,设置程序,给单片机电机驱动模块合适的占空比,使泵往容器外抽水,直至实际液面高度达到期望液面高度。

PID反馈控制软件设计:PID控制器(比例-积分-微分控制器)是一个在工业控制应用中常见的反馈回路部件,由比例单元P、积分单元I和微分单元D组成。PID控制的基础是比例控制;积分控制可消除稳态误差,过大可能增加超调;微分控制可加快大惯性系统响应速度以及减弱超调趋势。这个理论和应用的关键是,做出正确的测量和比较后,如何才能更好地纠正系统。

PID反馈控制方式:增量式PID控制将当前时刻的控制量和上一时刻的控制量做差,以差值为新的控制量,是一种递推式的算法。
    

五、实验与分析

在搭好硬件之后,开始对液面高度进行标定,在软件设计中,让液面初始高度为10.00cm,贴好标准尺。

通过不断设置期望高度,根据实际液面高度计算公式,得到其与期望高度的偏差,对初步程序进行参数调整(标准高度、PID参数等)。                 

实际液面高度=标准高度-(高电平时间*声速(340m/s))/2

最终设定到较好的参数值,达到课程设计的误差要求。

按照实验要求测量数据:根据要求我们以10mm为间隔,从上升过程和下降过程分别测了16组数据。

每次设定期望高度,相当于给这个系统一个阶跃信号,以超声波模块高电平时间为采样周期,我们可以从上位机变化波形中,得到该系统稳定调节过程,并计算出响应时间和超调量。

实验数据记录

 

实验数据分析

1、超调量: 

上升过程:在初始高度为12.00cm,期望高度设置为14.00cm时,响应时间为18.8s,此时类似于一个二阶系统,对应的超调量为0.7143%。

下降过程:在初始高度为18.00cm,期望高度为13.00cm时,响应时间为20s,对应的超调量为2.308%。示意图如图5。

 

误差分析计算

由得到的上升过程16组,数据计算得稳态误差(相对误差)为0.201%。由得到的下降过程16组,数据计算得稳态误差(相对误差)为0.463%。均符合实验要求的误差小于2%,超声波测量水位实验较为成功,完成实验控制要求。

工程源码分享:

链接:https://pan.baidu.com/s/1o5tF5hN9AbTs-0ETC_vilw 
提取码:scls

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/431087.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最近搭了一个数据监测看板。

在大数据时代(这个开头我已经看腻了 ),为了挖掘冗余数据的价值,数据分析需求日益增多,而分析结果的常见表现形式有数据分析报告和数据看板(大屏),与报告文档不同,数据看板…

8.1.0:DHTMLX Suite JavaScript UI Crack

适用于现代 Web 应用程序的强大 JavaScript 小部件库 - DHTMLX 套件 用于创建现代用户界面的轻量级、快速且通用的 JavaScript/HTML5 UI 小部件库。 DHTMLX Suite 有助于推进 Web 开发和构建具有丰富功能的数据密集型应用程序。 DHTMLX Suite 是一个 UI 小部件库,用…

移动端高性能Unity播放器实现方案

前情提要: 视听体验再进化——如何在24小时内全面升级你的视频应用 如何打造新时代的终端播放产品? 随着VR、AR、元宇宙等新玩法的出现,Unity平台的视频播放需求逐渐增加,比如下面两个动图就是在百度真实的案例。前者是演唱会场景…

ChatGPT能够知道当下最流行的开发语言,以及各语言哪个开发框架最火吗?

如果你准备成为一名开发人员,但是面对琳琅满目的开发语言,然后每种语言的开发框架却无从下手,张三推荐你学这个,李四推荐你学那个,而你的时间又是有限的,于是我决定问一问这个万事通ChatGPT。 目录 1. 目前…

C语言小项目 -- 扫雷游戏完整代码(递归展开 + 选择标记)

目录 🚀0. 游戏介绍: 🐷 游戏规则 🛸雷诀八条 🚀1. 开发环境及框架: 🚀2. 游戏具体功能分析实现: 🐷2.1 棋盘 🐷2.2 棋盘初始化 init_Board; &#x1…

用Abp实现两步验证(Two-Factor Authentication,2FA)登录(三):免登录验证

文章目录原理修改请求报文配置JwtBearerOptions生成Token校验Token修改认证EndPoint修改前端登录登出最终效果项目地址免登录验证是用户在首次两步验证通过后,在常用的设备(浏览器)中,在一定时间内不需要再次输入验证码直接登录。…

Go 语言 入门 基于 GoLand 2023.1 创建第一个Go程序

文章目录Go 语言 入门go 语言是什么?go 入门 需要 学习 什么?Go 语言有 那些优势?Go 语言 与 Java 语言 对比Go 语言 与Python 语言 对比Go 语言 基于 GoLand 创建第一个程序1. 打开 GoLand2.选择 new3. 选择SDK版本4. 输入项目名称,点击 cteate项目创建完成下一步,创建一个…

SpringBoot-心跳机制+redis实现网站实时在线人数统计

在社交网站中,通常需要实时统计某个网站的在线人数,通过该指标来实时帮助运营人员更好的维护网站业务: 先说一下目前在市面上主流的做法再加上我自己查阅的资料总结: 创建一个session监听器,在用户登录时即创建一个s…

WEB集群之反向代理,动静分离,NFS,mysql,MHA高可用

目录 第一章实验架构 1.1.实验图谱架构 1.2.实验前环境部署 第二章实验步骤 2.1.在ha01,ha02上部署keeplived,lvs-dr 2.2.Slave01,slave02安装nginx 2.3.LVS负载均衡 2.4.搭建动态网页 2.5.nginx反向代理 2.6.部署NFS 2.7.安装mysql 2.8.安装mha 2.9.主…

教你安装 CodeWhisperer: 一款个人免费的类似GitHubCopilot能代码补全的 AI 编程助手

1、官网 AI Code Generator - Amazon CodeWhisperer - AWS 官方扩展安装教程 2、安装VSCode 下载安装VSCode 3、VSCode安装CodeWhisperer插件 安装VSCode插件 - AWS Toolkit主侧栏,点击AWS ,展开CodeWhisperer,点击Start 在下拉菜单中点…

洗浴中心管理系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设!!! 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址: 更多系统资源库地址:骚戴的博客_CSDN_更多系统资源 更多系统…

煤矿井下人员精准定位系统,煤矿应急救援高效应用

煤矿行业的安全发展,事关数人民群众的生命财产安全。自2020年起,国家连续三年出台煤矿智能化建设及重大风险防控的相关指导政策,其中,2022年出台的《煤矿及重点非煤矿山重大灾害风险防控建设工作总体方案》中提到,要充…

52 openEuler搭建PostgreSQL数据库服务器-管理数据库角色

文章目录52 openEuler搭建PostgreSQL数据库服务器-管理数据库角色52.1 创建角色创建角色示例52.2 查看角色查看角色示例52.3 修改角色52.3.1 修改用户名52.3.2 修改用户示例52.3.3 修改用户密码52.3.4 修改角色密码示例52.4 删除角色删除角色示例52.5 角色授权角色授权示例52.6…

Python旅游好帮手:提前15天准备五一旅游景点详细数据

人生苦短,我用python 虽然还是有15天才放五一的假, 但是我的心早已经在旅游的路上了~ 本文源码:点击此处跳转文末名片获取 趁现在,先来用python做一个旅游攻略 知识点: requests parsel csv 第三方库&#x…

python查看时间序列数据的季节规律matplotlib画时间(10分钟为间隔)序列坐标

目录0 问题描述1. 案例12. 案例2参考资料0 问题描述 将多个时间序列数据,绘制到一张图上,每段时间序列数据一般只有几个月,少则 1 个月左右,想看它们的季节规律,需要去除年份,只看月份。 也就是横轴是1月…

44.CSS Grid布局概述

什么是CSS Grid? ● CSS Grid 是一组用于构建二维布局的 CSS 属性 ● CSS Grid 背后的主要思想是我们将容器元素划分为行和列,这些行和列可以填充是子元素。 ● 在两段式语境中,CSS网格允许我们写出更少的嵌套HTML和更容易阅读的CSS ● CSS …

二分查找原理及使用场景

建议使用左闭右开区间[l, r)查找。二分查找的最后,索引l,r会落到右区间第一个元素位置。因此但凡是能够见数组分成左右两个区间的都能应用二分查找法。 1、普通查值 常见问题方式:寻找含重复值的有序数组 [...,a, tar, tar, tar,.b....]&am…

AI制药 - RCSB PDB 数据集的多维度分析与整理 (1)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/130089781 整体: RCSB PDB 数据集是一个收集了蛋白质的三维结构信息的数据库,是世界蛋白质数据库(…

SQL SERVER调Web Service时候权限错误的解决

日期 2023/4/15 18:00:00 日志 作业历史记录 (AIPACS) 步骤 ID 1 服务器 GOOGLE 作业名称 AIPACS 步骤名称 RUNWS 持续时间 00:00:00 SQL 严重性 16 SQL 消息 ID 15281 已通过电子邮件通知的操作员 已通过…

MATLAB 基于空间格网的点云抽稀 (3)

MATLAB 基于空间格网的点云抽稀 (3) 一、实现效果二、原理步骤三、代码实现四、重点函数与对象的解释说明4.1 indices= pcbin(incloud,[rowNum colNum LayerNum]);4.2 occupancyGrid = cellfun(@(c) ~isempty(c), indices);4.3 outpointIndex = [];4.4 outpointIndex(end+1) …