VL53L4CD液位监测(2)----液位检测

VL53L4CD液位监测.2--液位检测

  • 概述
  • 视频教学
  • 样品申请
  • 完整代码下载
  • 硬件准备
  • STSW-IMG039
  • 容器特性
  • 包含必要的头文件
  • 变量定义
  • 测距函数 Ranging()
  • 液位误差补偿函数 Liquidlevelmeasureerrorcomponsate()
  • 数据轮询函数 get_data_by_polling()
  • 演示

概述

液位检测在工业自动化、环境监测和消费电子等领域中具有广泛的应用价值。随着技术的进步,基于飞行时间(Time-of-Flight, ToF)传感器的液位检测解决方案以其高精度、非接触式测量能力成为了热门选择。本文将介绍如何使用 STMicroelectronics 的 VL53L4CD ToF 传感器进行高精度液位检测,并重点探讨在不同液体和容器条件下如何通过非线性校正算法提升测量准确性。文中还将分析实验测试结果,并总结液位检测应用中可能面临的挑战及解决方案。

最近在弄ST的课程,需要样片的可以加群申请:615061293 。

在这里插入图片描述

视频教学

https://www.bilibili.com/video/BV1gj1BY1Ewe/

VL53L4CD液位监测(2)----液位检测

样品申请

https://www.wjx.top/vm/OhcKxJk.aspx#

完整代码下载

硬件准备

首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
在这里插入图片描述
在这里插入图片描述

STSW-IMG039

该液位监测解决方案基于意法半导体渡越时间测距传感器,可与VL53L4CD渡越时间高精度接近传感器或具有宽视野的VL53L5CX渡越时间8x8多区测距传感器配合使用。
采用FlightSense技术的创新型意法半导体解决方案支持用户使用非机械传感器来测量液体的液位,以降低锈蚀风险。意法半导体解决方案可以十分精准地测量各种液体,包括透明的水和深色的燃料等等。
VL53L4CD适用于接近测量和短距离测量,可实现从仅仅1 mm到1300 mm的超精准距离测量。新一代激光发射器具有18°FoV(视场),提高了环境光下的性能,其测距速度高达100 Hz。

在这里插入图片描述

容器特性

AN5851 文件的内容,第二章主要讲解了 ST 的建议,该章节分为两个部分,讨论了容器的属性和反射率对测量精度的影响,并给出了相应的优化建议。

容器的尺寸和传感器的视场角 (FoV):VL53L4CD 传感器的视场角是锥形的(18°),因此,如果容器的直径小于传感器的视场角,测量信号可能会从容器的边缘反射回来,导致测量精度下降。为了避免这一问题,建议使用直径大于传感器视场的容器。

传感器与液体表面的距离:传感器应放置在液面最高点上方至少 30 毫米的位置,以避免水滴反弹或容器晃动时造成的信号干扰,从而影响测量准确性。

在这里插入图片描述

低反射率容器:建议使用底部低反射率的容器,因为当液面较低时,如果容器底部反射信号过强,可能会与从液面反射回来的信号混淆,导致测量错误。

透明或高反射率容器的影响:透明或高反射率的容器底部容易导致测量信号混乱,尤其是在液面较低时。因此,低反射率的底部设计能够减少信号干扰,提高测量精度。

在这里插入图片描述

包含必要的头文件

/* USER CODE BEGIN Includes */
#include "vl53l4cd_api.h" // VL53L4CD 传感器 API
#include "custom_ranging_sensor.h" // 自定义测距传感器头文件
/* USER CODE END Includes */

变量定义

/* USER CODE BEGIN 0 */
int status;// 存储操作状态
volatile int IntCount;// 中断计数器
uint8_t p_data_ready;// 数据准备标志
uint16_t dev, sensor_id;// 设备 ID 和传感器 ID
VL53L4CD_ResultsData_t results;		/* Results data from VL53L4CD */
VL53L4CD_Version_t sw_version;	/* Driver version *//* Below code has to be updated depending on customer setup parameters */
/* Start: Measure liquid level application*/
/* Consider X indicator levels and define a structure to store level, expected result and compensation value*/
// 液位标志的数量,定义有 10 个级别
#define MAX_LABEL 10 /* Number of level indicators – To be updated depending on the number of levels in the OffGainVal.csv file */
typedef struct ogalgo_data
{uint8_t level ;// 液位级别uint16_t  expected_res;// 预期测量结果uint16_t  og_val;// 补偿值
}ogalgo_data;/* Design a lookup table with a structure of compensate value data received from GUI once characterization is done*/
/* First column : indicator level , Second column: Expected result , Third column: compensate value*/
/* Example of values given below - To be updated with values from the GUI*//* 使用测量补偿数据初始化查找表 */
ogalgo_data ogalgo_data_inst[MAX_LABEL]={{ 9, 21, 4 },{ 8, 42, 4 },{ 7, 63, 2 },{ 6, 84, 1 },{ 5, 105, 5 },{ 4, 126, 14 },{ 3, 147, 25 },{ 2, 168, 30 },{ 1, 189, 20 },};/* Ranging 函数的原型声明 */
int Ranging(Dev_t dev,uint16_t *ouputranging);/* 开启算法标志 */
uint8_t algo_enable=1; /* algo_enable=1 to apply the lookup table - algo_enable=0 to not apply */
uint16_t totaldistance=270; /* 传感器到容器底部的高度,单位为毫米 */
uint16_t meanranging=0;// 平均测距值
uint16_t rangevalue_out=0;// 最终补偿后的测距值
uint16_t invalid_range=999;// 无效测距值void get_data_by_polling(Dev_t dev);// 数据轮询获取函数
/* USER CODE END 0 */

测距函数 Ranging()

该函数执行 10 次测距操作并计算平均值,确保测量结果的稳定性。

/* Ranging 函数 - 获取测量数据并计算平均值 */
int Ranging(Dev_t dev,uint16_t *ouputranging)
{uint8_t cnt=0;uint16_t mean_distance=0;uint16_t meanranging=0;/* 进行 10 次测量,取平均值 */for (cnt = 0; cnt < 10;){status = VL53L4CD_CheckForDataReady(dev, &p_data_ready);
//		printf("status11=%d,data_ready=%d\n",status,p_data_ready);HAL_Delay(3);if (p_data_ready){VL53L4CD_ClearInterrupt(dev);VL53L4CD_GetResult(dev, &results);if(results.range_status ==0){mean_distance+=results.distance_mm;cnt++;HAL_Delay(3);}}}
//	printf("cnt=%d\n",cnt);meanranging=mean_distance/10;// 计算平均值*ouputranging =meanranging;return status;
}

液位误差补偿函数 Liquidlevelmeasureerrorcomponsate()

/* 液位测量误差补偿函数 */
void Liquidlevelmeasureerrorcomponsate(uint16_t rangevalue,uint16_t *rangevalue_out)
{uint16_t pos=0;uint16_t i=0; uint16_t value;for (i=0;i<MAX_LABEL;i++){if  (rangevalue <totaldistance+5) //5 buffer{if (rangevalue < ogalgo_data_inst[i].expected_res){//Check firstif (i >0){value = (ogalgo_data_inst[i].expected_res + ogalgo_data_inst[i-1].expected_res)/2;}elsevalue = ogalgo_data_inst[i].expected_res;if(rangevalue <= value){/* First position */if (i ==0 ){pos=1;break;}pos=1+(i-1); // adding one bcz position starts from 1break;}else{pos=1+i;break;}}else{if (rangevalue > totaldistance+5)pos=99;elsepos=6;  // Need to find which one is max OG value or store it directly here}}elsepos=99;}/* 根据位置补偿测量值 *//switch(pos){case 1:*rangevalue_out=rangevalue + ogalgo_data_inst[pos].og_val; // Category Underranging,break;case 2:*rangevalue_out=rangevalue + ogalgo_data_inst[pos].og_val; // Category Underranging, 30mm average b/w C3&C2break;case 3:*rangevalue_out=rangevalue + ogalgo_data_inst[pos].og_val; // Category Underranging, 25mm average b/w C4&C3break;case 4:*rangevalue_out=rangevalue + ogalgo_data_inst[pos].og_val; // Category Underranging, 12mm average b/w C2&C2break;case 5:*rangevalue_out=rangevalue - ogalgo_data_inst[pos].og_val; // Category Overranging, 4mm average b/w C2&C2break;case 6:*rangevalue_out=(uint16_t)(rangevalue - ogalgo_data_inst[pos].og_val); // Category Overranging,break;case 7:*rangevalue_out=(uint16_t)(rangevalue - ogalgo_data_inst[pos].og_val); //Category Overranging,break;case 8:*rangevalue_out=(uint16_t)(rangevalue - ogalgo_data_inst[pos].og_val); // Category Overranging,break;case 9:*rangevalue_out=(uint16_t)(rangevalue - ogalgo_data_inst[pos].og_val); // Category Overranging,break;default:printf("Valid water level not found\n");}}
/* End:Measure liquid level application */

数据轮询函数 get_data_by_polling()

该函数不断轮询 VL53L4CD 传感器的数据,计算平均测距值并输出补偿后的液位数据。

/* 通过轮询获取数据 */
void get_data_by_polling(Dev_t dev){do{/* Liquid level Measure application */status=Ranging(dev,&meanranging);if (!status){if (algo_enable == 1){Liquidlevelmeasureerrorcomponsate(meanranging,&rangevalue_out);//printf("rg=%d %d\n",meanranging, rangevalue_out);if (rangevalue_out>0)printf("Liquid level is = %d mm\n",rangevalue_out);elseprintf("Invalid range is = %d mm\n",invalid_range);}elseprintf("Mean ranging is = %d mm\n",meanranging);}}while(1);
}

演示

水瓶大概19cm左右,当只剩下一点水时。

在这里插入图片描述

加水到7cm左右。

在这里插入图片描述

加水到11cm左右。

在这里插入图片描述

加水到14左右。

在这里插入图片描述

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

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

相关文章

十大时间序列预测模型

目录 1. 自回归模型 原理 核心公式 推导过程: 完整案例 2. 移动平均模型 原理 核心公式 推导过程: 完整案例 3. 自回归移动平均模型 原理 核心公式 推导过程: 完整案例 4. 自回归积分移动平均模型 原理 核心公式 推导过程 完整案例 5. 季节性自回归积分…

LeetCode讲解篇之695. 岛屿的最大面积

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们遍历二维矩阵&#xff0c;如果当前格子的元素为1进行深度优先搜索&#xff0c;将搜索过的格子置为0&#xff0c;防止重复访问&#xff0c;然后对继续深度优先搜索上下左右中为1的格子 题解代码 func maxAr…

【通信协议】一文学会异步、同步、串行、并行、单工、半双工、全双工(一)

通信方式详解&#xff1a;异步、同步、串行、并行、单工、半双工、全双工 引言一、通信方式分类概述二、串行通信与并行通信串行通信 (Serial Communication)并行通信 (Parallel Communication)串行与并行通信对比表 三、全双工、半双工、单工通信单工通信 (Simplex Communicat…

LLM+知识图谱新工具! iText2KG:使用大型语言模型构建增量知识图谱

iText2KG是一个基于大型语言模型的增量知识图谱构建工具&#xff0c;通过从文本文档中提取实体和关系来逐步构建知识图谱。该工具具有零样本学习能力&#xff0c;能够在无需特定训练的情况下&#xff0c;在多个领域中进行知识提取。它包括文档提炼、实体提取和关系提取模块&…

最新版IntelliJ IDEA 2024.2.3 创建SpringBoot项目(包含各种依赖的选择和功能)

创建SpringBoot项目 1 . 打开IDEA 选择新建项目 2. 基础项目创建 在顶端几个选项可以选择创建基本的java项目 填写项目名称,文件位置,选择构建工具 3. 下方选择springboot 选择构建的方式 三种方式虽然不同但是,基本功能都一致, Gradle-Groovy 是指使用 Groovy 语言编写…

Redis安装RedisBloom插件

Redis安装RedisBloom插件 1. 下载RedisBloom2. 安装RedisBloom3. Redis 安装RedisBloom4. 验证是否安装成功5. 其他安装方法5.1 使用 Docker 安装 RedisBloom5.2 通过 RedisStack 安装 RedisBloom 是一个 Redis 模块&#xff0c;它提供了一种高效的方式来存储和检索大数据集中的…

(笔记)第三期书生·浦语大模型实战营(十一卷王场)–书生基础岛第5关---XTuner 微调个人小助手认知

学员闯关手册&#xff1a;https://aicarrier.feishu.cn/wiki/ZcgkwqteZi9s4ZkYr0Gcayg1n1g?open_in_browsertrue 课程视频&#xff1a;https://www.bilibili.com/video/BV1tz421B72y/ 课程文档&#xff1a; https://github.com/InternLM/Tutorial/tree/camp3/docs/L1/XTuner 关…

2024.9月29日~10月6日 SSM框架项目-《电信资费管理系统》

一、数据库介绍&#xff1a; 1、account&#xff1a;帐务信息表 2、admin_info&#xff1a;管理员信息表 3、admin_role&#xff1a;管理员角色信息表 4、cost&#xff1a;资费信息表 5、privilege_info&#xff1a;权限信息表 6、role_info&#xff1a;角色信息表 7、role_pri…

使用frp将树莓派穿透到外网

引言 frp官网 最近买了一块树莓派 zero 2w&#xff0c;想要它可以进行远程访问&#xff0c;所以想到了frp这个方案进行穿透&#xff0c;后期会使用树莓派搭建音乐服务器&#xff0c;本人手机内存有点小&#xff0c;xxxx云音乐太占空间&#xff0c;有兴趣的话可以关注后续。 …

数据结构与算法——Java实现 30.合并多个有序链表 小顶堆实现

后来我们都走了很久&#xff0c;远到提及往事时&#xff0c; 总会加上once upon a time —— 24.10.6 23. 合并 K 个升序链表 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1…

Maven安装使用

说明&#xff1a;Maven是Apache旗下的一个开源项目&#xff0c;是一款用于管理和构建java项目的工具。一般来说&#xff0c;它帮助我们管理依赖、构建项目。本文介绍在Windows系统下安装Maven。 下载&安装&验证 下载 首先&#xff0c;在Maven官网&#xff08;https:…

C++模版SFIANE应用踩的一个小坑

一天一个C大佬同事&#xff0c;突然截图过来一段代码&#xff1a;这写的啥呀&#xff0c;啰里吧嗦的&#xff0c;这个构造函数模板参数T1感觉是多余的呀 template<class T> class TestClass { public:TestClass(){}//函数1template<class T1 T, std::enable_if_t<…

vSAN05:vSAN延伸集群简介与创建、资源要求与计算、高级功能配置、维护、故障处理

目录 vSAN延伸集群延伸集群创建延伸集群的建议网络配置vSAN延伸集群的端口见证主机的资源要求vSAN延伸集群中见证节点带宽占用vSAN延伸集群的允许故障数vSAN延伸集群不同配置下的空间占用 vSAN延伸集群的HA配置vSAN延伸集群的DRS配置vSAN存储策略以及虚拟机/主机策略的互操作vS…

十四、深入理解Mysql索引底层数据结构与算法

文章目录 一、索引的本质1、索引是帮助MySQL高效获取数据的排好序的数据结构2、索引的数据结构3、数据结构可视化网站 二、常见数据结构介绍1、B-Tree2、BTree&#xff08;B-Tree变种&#xff09;3、Hash结构 三、存储引擎的索引实现1、MyISAM存储引擎索引实现MyISAM索引文件和…

AI配音(声音克隆)

Fish Audio: Free Generative AI Text To Speech & Voice Cloning 【【AI配音】终于找到免费 & 小白友好的声音克隆软件了&#xff01;真人相似度98%!】https://www.bilibili.com/video/BV1MwbFeCE2X?vd_source3cc3c07b09206097d0d8b0aefdf07958 我终于找到总这3款免…

新机配置Win11

Win11跳联网 在连接网络的界面输入ShiftF10打开命令行&#xff0c;然后输入oobe\bypassnro然后会重启&#xff0c;在联网的界面就可以进行跳过了。 编码 在中国大陆Windows使用的编码是GBK编码 查看电脑系统版本 WinR输入winver即可 桌面图标 设置->个性化->主题…

【机器学习】深度学习、强化学习和深度强化学习?

深度学习、强化学习和深度强化学习是机器学习的三个重要子领域。它们有着各自独特的应用场景和研究目标&#xff0c;虽然都属于机器学习的范畴&#xff0c;但各自的实现方式和侧重点有所不同。 1. 深度学习&#xff08;Deep Learning&#xff09; 深度学习是一种基于神经网络的…

Vite多环境配置与打包:

环境变量必须以VITE开头 1.VITE_BASE_API&#xff1a; 在开发环境中设置为 /dev-api&#xff0c;这是一个本地 mock 地址&#xff0c;通常用于模拟后端接口。 2.VITE_ENABLE_ERUDA&#xff1a; 设置为 "true"&#xff0c;表示启用调试工具&#xff0c;通常是为了…

【MySQL】-- 库的操作

文章目录 1. 查看数据库1.1 语法 2. 创建数据库2.1 语法2.2 示例2.2.1 创建一个名为java114的数据库2.2.2 创建数据库java114&#xff0c;如果数据库不存在则创建2.2.3 查看警告信息 3. 字符集编码和校验&#xff08;排序&#xff09;规则3.1 查看数据库支持的字符集编码3.2 查…