0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2024-11-25 14:57 次阅读

概述

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

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

视频教学

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

样品申请

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

完整代码下载

[https://download.csdn.net/download/qq_24312945/89853013]

硬件准备

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

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=%dn",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=%dn",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 first
                    if (i >0)
                    {
                        value = (ogalgo_data_inst[i].expected_res + ogalgo_data_inst[i-1].expected_res)/2;
                    }
                    else
                        value = 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 1
                        break;
                    }
                    else
                    {
                        pos=1+i;
                        break;
                    }
                }
                else
                {
                    if (rangevalue > totaldistance+5)
                        pos=99;
                    else
                        pos=6;  // Need to find which one is max OG value or store it directly here

                }
            }
            else
                pos=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&C2
                break;
            case 3:
                    *rangevalue_out=rangevalue + ogalgo_data_inst[pos].og_val; // Category Underranging, 25mm average b/w C4&C3
                break;
            case 4:
                    *rangevalue_out=rangevalue + ogalgo_data_inst[pos].og_val; // Category Underranging, 12mm average b/w C2&C2
                break;
            case 5:
                    *rangevalue_out=rangevalue - ogalgo_data_inst[pos].og_val; // Category Overranging, 4mm average b/w C2&C2
                break;
            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 foundn");
            }

}
/* 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 %dn",meanranging, rangevalue_out);
                     if (rangevalue_out >0)
                          printf("Liquid level is = %d mmn",rangevalue_out);
                     else
                         printf("Invalid range is = %d mmn",invalid_range);
                 }
                 else
                     printf("Mean ranging is = %d mmn",meanranging);
             }

    }
    while(1);
}

演示

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

加水到7cm左右。

加水到11cm左右。

加水到14左右。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 液位检测
    +关注

    关注

    0

    文章

    46

    浏览量

    9409
  • TOF
    TOF
    +关注

    关注

    9

    文章

    478

    浏览量

    36270
收藏 人收藏

    评论

    相关推荐

    VL53L4CD TOF开发(1)----驱动TOF进行测距

    VL53L4CD适用于接近测量和短距离测量,可实现从仅仅1 mm到1300 mm的超精准距离测量。新一代激光发射器具有18°视场 (FoV),提高了环境光下的性能,其测距速度高达100Hz
    的头像 发表于 05-17 14:54 888次阅读
    <b class='flag-5'>VL53L4CD</b> TOF开发(1)----驱动TOF进行测距

    VL53L4CD TOF开发(2)----修改测量频率

    VL53L4CD是一款高度集成的飞行时间(ToF)传感器,广泛应用于距离测量和接近检测。为了满足不同应用场景的需求,合理调整传感器的测量频率至关重要。本文旨在介绍如何在VL53L4CD传感器上修改
    的头像 发表于 06-19 14:50 1099次阅读
    <b class='flag-5'>VL53L4CD</b> TOF开发(<b class='flag-5'>2</b>)----修改测量频率

    VL53L4CD TOF开发(3)----检测阈值

    了如何基于VL53L4CD传感器实现连续测距,并通过配置检测阈值来优化系统的响应能力。 我们将详细讲解如何初始化VL53L4CD传感器,设置其测量参数和检测阈值,并实现中断配置以
    的头像 发表于 06-19 10:56 1245次阅读
    <b class='flag-5'>VL53L4CD</b> TOF开发(3)----<b class='flag-5'>检测</b>阈值

    VL53L4CD TOF开发(4)----单次测量(One-Shot)模式

    了如何基于VL53L4CD传感器实现连续测距,并通过配置检测阈值来优化系统的响应能力。 我们将详细讲解如何初始化VL53L4CD传感器,设置其测量参数和检测阈值,并实现中断配置以
    的头像 发表于 06-19 10:58 1380次阅读
    <b class='flag-5'>VL53L4CD</b> TOF开发(<b class='flag-5'>4</b>)----单次测量(One-Shot)模式

    多点检测# 检测

    检测
    jf_86482833
    发布于 :2023年09月18日 21:44:15

    ICMAN多点检测

    检测
    ICman
    发布于 :2024年04月02日 09:31:20

    VL53L4CD能否实现~50uA@1Hz类似的功耗?

    我正在尝试为 1Hz 频率的近距离(低至 1mm)接近检测找到低功耗解决方案。看起来 VL53L4CD 可以很好地完成这项工作,但我没有在数据表中找到低功耗模式的功耗详细信息。我还发现有一个用于
    发表于 12-07 08:39

    如何使用VL53L1X来测量人的身高和柴油罐呢?

    你好我目前有 2 个项目,一个主要依靠 VL53L1X 进行水箱监测系统(水和柴油)。我正在尝试使用
    发表于 12-28 12:30

    智慧排水窨井监测系统方案

    分析等。窨井监测系统主要应用于智慧城市、智慧水务、智慧排水等新基建项目中,为排水管理部门提供实时的、有效的系统化监测数据。窨井
    的头像 发表于 03-07 17:57 839次阅读

    检测的方法有哪些

    检测是工业自动化中不可或缺的一项技术,其目的是对容器或管道中的液体进行实时监测,以保证生产过程的安全和稳定。
    的头像 发表于 05-17 13:58 4490次阅读
    <b class='flag-5'>液</b><b class='flag-5'>位</b><b class='flag-5'>检测</b>的方法有哪些

    污水检测用什么传感器

    污水检测用什么传感器,如今需要污水
    的头像 发表于 07-19 14:02 1515次阅读
    污水<b class='flag-5'>液</b><b class='flag-5'>位</b><b class='flag-5'>检测</b>用什么<b class='flag-5'>液</b><b class='flag-5'>位</b>传感器

    不接触液体就能检测变化的传感器

    不接触液体就能检测变化的传感器是一种高效和方便的传感器技术。可以监测液体的
    的头像 发表于 07-26 14:17 684次阅读
    不接触液体就能<b class='flag-5'>检测</b><b class='flag-5'>液</b><b class='flag-5'>位</b>变化的<b class='flag-5'>液</b><b class='flag-5'>位</b>传感器

    检测的方法有哪些

    检测是在工业和生活中常见的一项任务,用于测量液体或固体物料的高度。
    的头像 发表于 08-21 13:49 3283次阅读

    光电传感器如何检测

    光电传感器是一种基于光电原理的检测设备,主要用于测量液体的
    的头像 发表于 10-08 14:10 1108次阅读
    光电<b class='flag-5'>液</b><b class='flag-5'>位</b>传感器如何<b class='flag-5'>检测</b><b class='flag-5'>液</b><b class='flag-5'>位</b>

    VL53L4CD监测(1)----驱动TOF进行测距

    VL53L4CD适用于接近测量和短距离测量,可实现从仅仅1 mm到1300 mm的超精准距离测量。新一代激光发射器具有18°视场 (FoV),提高了环境光下的性能,其测距速度高达100Hz
    的头像 发表于 11-25 14:38 21次阅读
    <b class='flag-5'>VL53L4CD</b><b class='flag-5'>液</b><b class='flag-5'>位</b><b class='flag-5'>监测</b>(1)----驱动TOF进行测距