色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    47

    瀏覽量

    9420
  • TOF
    TOF
    +關注

    關注

    9

    文章

    482

    瀏覽量

    36331
收藏 人收藏

    評論

    相關推薦

    VL53L4CD TOF開發(1)----驅動TOF進行測距

    VL53L4CD適用于接近測量和短距離測量,可實現從僅僅1 mm到1300 mm的超精準距離測量。新一代激光發射器具有18°視場 (FoV),提高了環境光下的性能,其測距速度高達100Hz
    的頭像 發表于 05-17 14:54 ?926次閱讀
    <b class='flag-5'>VL53L4CD</b> TOF開發(1)----驅動TOF進行測距

    VL53L4CD TOF開發(2)----修改測量頻率

    VL53L4CD是一款高度集成的飛行時間(ToF)傳感器,廣泛應用于距離測量和接近檢測。為了滿足不同應用場景的需求,合理調整傳感器的測量頻率至關重要。本文旨在介紹如何在VL53L4CD傳感器上修改
    的頭像 發表于 06-19 14:50 ?1148次閱讀
    <b class='flag-5'>VL53L4CD</b> TOF開發(<b class='flag-5'>2</b>)----修改測量頻率

    VL53L4CD TOF開發(3)----檢測閾值

    了如何基于VL53L4CD傳感器實現連續測距,并通過配置檢測閾值來優化系統的響應能力。 我們將詳細講解如何初始化VL53L4CD傳感器,設置其測量參數和檢測閾值,并實現中斷配置以
    的頭像 發表于 06-19 10:56 ?1313次閱讀
    <b class='flag-5'>VL53L4CD</b> TOF開發(3)----<b class='flag-5'>檢測</b>閾值

    VL53L4CD TOF開發(4)----單次測量(One-Shot)模式

    了如何基于VL53L4CD傳感器實現連續測距,并通過配置檢測閾值來優化系統的響應能力。 我們將詳細講解如何初始化VL53L4CD傳感器,設置其測量參數和檢測閾值,并實現中斷配置以
    的頭像 發表于 06-19 10:58 ?1445次閱讀
    <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 ?866次閱讀

    檢測的方法有哪些

    檢測是工業自動化中不可或缺的一項技術,其目的是對容器或管道中的液體進行實時監測,以保證生產過程的安全和穩定。
    的頭像 發表于 05-17 13:58 ?4596次閱讀
    <b class='flag-5'>液</b><b class='flag-5'>位</b><b class='flag-5'>檢測</b>的方法有哪些

    污水檢測用什么傳感器

    污水檢測用什么傳感器,如今需要污水
    的頭像 發表于 07-19 14:02 ?1550次閱讀
    污水<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 ?711次閱讀
    不接觸液體就能<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 ?3361次閱讀

    光電傳感器如何檢測

    光電傳感器是一種基于光電原理的檢測設備,主要用于測量液體的
    的頭像 發表于 10-08 14:10 ?1164次閱讀
    光電<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 ?186次閱讀
    <b class='flag-5'>VL53L4CD</b><b class='flag-5'>液</b><b class='flag-5'>位</b><b class='flag-5'>監測</b>(1)----驅動TOF進行測距
    主站蜘蛛池模板: 强奸日本美女小游戏| 久久偷拍免费2017| 国产日韩欧美综合久久| 国产亚洲AV精品无码麻豆| 亚洲电影二区| 性欧美金发洋妞xxxxbbbb| 欧美一区二区三区久久综| 青青久在线| 四虎4hu亚洲精品| 人和拘一级毛片| 玖玖爱精品视频| 国产人A片777777久久| 国产在线AV一区二区香蕉| 九九精品在线播放| 国产精品一区二区人妻无码| 国产噜噜噜精品免费| 好男人免费观看在线高清WWW| 久久精品国产亚洲AV未满十八| 黄色三级视频网站| 国产精品一国产精品免费| 精品AV亚洲乱码一区二区| 美女屁股软件| 色网址在线观看| 亚洲欧洲日产国码久在线| 亚洲国产AV精品一区二区蜜芽| 曰批视频免费40分钟不要钱| 亚洲一在线| 97亚洲狠狠色综合久久位| 在线播放一区| videossexo乌克兰| 99这里有精品视频视频| 97草碰在线视频免费| 8x华人免费视频| 灌满内射HP1V1| 久久ZYZ资源站无码中文动漫| 欧美xxxx83d| 亚洲AV无码乱码国产麻豆P| 99久久国产极品蜜臀AV酒店| HEYZO精品无码一区二区三区| 国产视频成人| 欧美xxxx性喷潮|