VL53L4CX TOF开发(2)----修改测距范围及测量频率

VL53L4CX TOF开发.2--修改测距范围及测量频率

  • 概述
  • 视频教学
  • 样品申请
  • 完整代码下载
  • 测距范围
  • 测量频率
  • 硬件准备
  • 技术规格
  • 系统框图
  • 应用示意图
  • 生成STM32CUBEMX
    • 选择MCU
    • 串口配置
    • IIC配置
  • XSHUT
  • GPIO1
  • X-CUBE-TOF1
  • app_tof.c
  • 详细解释
  • 测量频率修改
  • 修改测距范围

概述

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

VL53L4CX传感器是一款高性能的飞行时间(Time-of-Flight)传感器,广泛应用于各种距离测量和目标检测场景。其灵活的配置选项使得用户可以根据具体应用需求调整测距范围和测量频率,从而实现最佳性能。本篇文章将介绍如何通过修改VL53L4CX传感器的测距范围和测量频率来满足不同应用场景的需求。
在这里插入图片描述

视频教学

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

VL53L4CX TOF开发(2)----修改测距范围及测量频率

样品申请

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

完整代码下载

测距范围

VL53L4CX传感器支持多种测距模式,包括短距离、中距离和长距离模式。每种模式针对不同的测量距离进行了优化,用户可以根据目标物体与传感器之间的距离选择合适的测距模式:
● 短距离模式:适用于目标物体距离较近的应用,提供较高的测量精度和响应速度。
● 中距离模式:在一定距离范围内平衡了测量精度和响应速度,适用于多数通用测量应用。
● 长距离模式:适用于目标物体距离较远的应用,能够覆盖更大的测量范围,但响应时间相对较长。

测量频率

测量频率决定了传感器进行测距操作的频次。通过调整测量频率,用户可以在响应速度和功耗之间找到平衡点:
● 高频测量:适用于需要实时监测和快速响应的应用场景,如手势识别和快速移动物体检测。然而,高频测量会增加功耗。
● 低频测量:适用于功耗敏感的应用,如电池供电设备或对响应速度要求较低的场景。低频测量可以显著降低功耗。
本文将详细介绍如何配置VL53L4CX传感器的测距范围和测量频率,包括具体的配置方法、相关代码示例以及在实际应用中的注意事项。通过合理调整这些参数,用户可以充分发挥VL53L4CX传感器的性能优势,满足各种复杂多样的应用需求。

硬件准备

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

技术规格

在这里插入图片描述

系统框图

在这里插入图片描述
在这里插入图片描述

应用示意图

在这里插入图片描述

生成STM32CUBEMX

选择MCU

测试版所用的MCU为STM32G431CB。

在这里插入图片描述

串口配置

查看原理图,PA9和PA10设置为开发板的串口。

在这里插入图片描述

配置串口。

在这里插入图片描述

IIC配置

在这个应用中,VL53L4CX模块通过I2C(IIC)接口与主控器通信。具体来说,VL53L4CX模块的I2C引脚连接到主控器的PA8和PB5两个IO口。

在这里插入图片描述

配置IIC为快速模式,速度为400k。

在这里插入图片描述

XSHUT

XSHUT引脚是由主机连接和控制的,这种设计优化了功耗,因为设备在不使用时可以被完全关闭,然后通过主机使用XSHUT引脚来唤醒。当AVDD存在且XSHUT为低电平时,设备处于硬件待机模式(HW Standby mode)。如果XSHUT引脚不由主机控制,而是通过上拉电阻连接到AVDD,那么设备在固件启动(FW BOOT)后会自动进入软件待机(SW STANDBY),而不会进入硬件待机。

在这里插入图片描述

在这里插入图片描述

GPIO1

当传感器完成一次测距操作时,GPIO1引脚可以被配置为输出中断信号,通知微控制器读取测量结果。
这种方式比持续轮询传感器状态更加高效,尤其在低功耗应用中非常有用。

在这里插入图片描述

在这里插入图片描述

X-CUBE-TOF1

本节介绍在不需要使用样例应用时如何使用STM32CubeMX将X-CUBE-TOF1软件包添加到项目中。有了这样的设置,就只配置了驱动层。

在这里插入图片描述

app_tof.c

app_tof.c定义了一个静态函数 MX_VL53L4CX_SimpleRanging_Process,用于配置和执行VL53L4CX传感器的简单测距操作。

在这里插入图片描述

详细解释

  1. CUSTOM_RANGING_SENSOR_ReadID(CUSTOM_VL53L4CX, &Id);:
    ○ 读取传感器的ID,并将其存储在变量 Id 中。
  2. CUSTOM_RANGING_SENSOR_GetCapabilities(CUSTOM_VL53L4CX, &Cap);:
    ○ 获取传感器的能力,并将其存储在 Cap 结构中。
  3. 配置 Profile 结构的参数:
    ○ Profile.RangingProfile 设置为中距离多目标测距模式。
    ○ Profile.TimingBudget 设置测量时间预算。
    ○ Profile.Frequency 设置为0,不用于正常测距。
    ○ Profile.EnableAmbient 启用环境光测量。
    ○ Profile.EnableSignal 启用信号测量。
  4. CUSTOM_RANGING_SENSOR_ConfigProfile(CUSTOM_VL53L4CX, &Profile);:
    ○ 如果配置文件与默认配置不同,则应用新的配置文件。
  5. CUSTOM_RANGING_SENSOR_Start(CUSTOM_VL53L4CX, RS_MODE_BLOCKING_CONTINUOUS);:
    ○ 启动传感器,设置为阻塞连续测量模式。
  6. while (1) 循环:
    ○ 在无限循环中,定期读取传感器的距离数据。
    ○ 如果成功读取距离数据,则调用 print_result(&Result) 打印结果。
    ○ 使用 HAL_Delay(POLLING_PERIOD) 延迟一段时间,以控制轮询频率。

在main.c种添加头文件。

/* USER CODE BEGIN Includes */
#include "app_tof.h"
#include "custom_ranging_sensor.h"

/* USER CODE END Includes */

添加对应变量。

/* USER CODE BEGIN 0 */
#define TIMING_BUDGET (200U) /* 8 ms < TimingBudget < 200 ms */
#define POLLING_PERIOD (250U) /* refresh rate for polling mode (ms, shall be consistent with TimingBudget value) */


static RANGING_SENSOR_Capabilities_t Cap;
static RANGING_SENSOR_ProfileConfig_t Profile;
static RANGING_SENSOR_Result_t Result;
static int32_t status = 0;

static void print_result(RANGING_SENSOR_Result_t *Result);
static int32_t decimal_part(float_t x);
/* USER CODE END 0 */

测量频率修改

增加计时预算会增加单次测量发射的光子数量。这提高了测量精度和最大测距距离。
在这里插入图片描述

Profile.TimingBudget 设置测量时间预算,初始化代码如下所示,TIMING_BUDGET设置为200ms。

  /* USER CODE BEGIN 2 */
    uint32_t Id;

    // 读取传感器ID
    CUSTOM_RANGING_SENSOR_ReadID(CUSTOM_VL53L4CX, &Id);
    // 获取传感器的能力
    CUSTOM_RANGING_SENSOR_GetCapabilities(CUSTOM_VL53L4CX, &Cap);

    // 配置测距参数
    Profile.RangingProfile = VL53L4CX_PROFILE_MEDIUM; // 设置测距模式为中距离
    Profile.TimingBudget = TIMING_BUDGET; // 设置时间预算(测量时间)
    Profile.Frequency = 0; // 设置测量频率,这里不用于正常测距(设为0)
    Profile.EnableAmbient = 1; // 启用环境光测量(1:启用,0:禁用)
    Profile.EnableSignal = 1; // 启用信号测量(1:启用,0:禁用)

    // 如果配置文件与默认配置不同,则设置新的配置文件
    CUSTOM_RANGING_SENSOR_ConfigProfile(CUSTOM_VL53L4CX, &Profile);

    // 启动传感器,设置为短距离测量模式
    status = CUSTOM_RANGING_SENSOR_Start(CUSTOM_VL53L4CX, RS_MODE_BLOCKING_CONTINUOUS);
  /* USER CODE END 2 */

主程序如下所示,可以通过判断GPIO1来判定信号是否已经准备好。

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	if(HAL_GPIO_ReadPin  ( GPIOB, GPIO_PIN_15) ==0)		
	{		
    /* polling mode */
    status = CUSTOM_RANGING_SENSOR_GetDistance(CUSTOM_VL53L4CX, &Result);

    if (status == BSP_ERROR_NONE)
    {
      print_result(&Result);
    }
	}
    /* USER CODE END WHILE */

//  MX_TOF_Process();
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

若无法正常打印,需要修改堆栈。
在这里插入图片描述

在这里插入图片描述

此时时间为200ms输出一次,频率为5Hz。

在这里插入图片描述

修改测距范围

VL53L4CX最大可以测量6M距离,可以通过 Profile.RangingProfile 设置为测距模式。

  1. RS_MULTI_TARGET_SHORT_RANGE (VL53L4CX_PROFILE_SHORT):
    ○ 短距离多目标模式:
    ■ 此模式下,传感器优化用于较近距离的测量。
    ■ 适用于需要高精度但测量距离较短的应用。
    ■ 在短距离测量时,传感器可以提供更快的响应时间和更高的测量频率。
  2. RS_MULTI_TARGET_MEDIUM_RANGE (VL53L4CX_PROFILE_MEDIUM):
    ○ 中距离多目标模式:
    ■ 此模式下,传感器在中等距离范围内工作。
    ■ 适用于需要在中等距离内进行测量的应用。
    ■ 提供了距离和精度之间的平衡。
  3. RS_MULTI_TARGET_LONG_RANGE (VL53L4CX_PROFILE_LONG):
    ○ 长距离多目标模式:
    ■ 此模式下,传感器优化用于较远距离的测量。
    ■ 适用于需要测量更远距离的应用。
    ■ 在长距离测量时,响应时间可能会更长,但可以覆盖更大的测量范围。

此时 Profile.RangingProfile = VL53L4CX_PROFILE_MEDIUM; // 设置测距模式为中距离
若测量长距离,可能出现如下测量失败情况,TIMING_BUDGET修改为200。

在这里插入图片描述

Status状态位如下所示。
在使用VL53L4CX传感器时,返回的状态码(status)为4通常表示特定的错误类型。根据VL53L4CX传感器的文档,状态码4对应的具体错误类型是 VL53L4CX_RANGESTATUS_OUTOFBOUNDS_FAIL。
VL53L4CX_RANGESTATUS_OUTOFBOUNDS_FAIL:
● 状态码4:此状态码表示测距过程中发生了超出边界失败(out of bounds fail)的错误。
● 含义:传感器在测量过程中检测到目标物体距离超出了其测量范围,或者接收到的信号不在预期的范围内。
在这里插入图片描述

修改测量范围为长范围。

Profile.RangingProfile = RS_MULTI_TARGET_LONG_RANGE;

此时测距可以测量长距离范围。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端开发入门指南:掌握网页设计的第一课

UI设计与前端开发是相辅相成&#xff0c;UI设计可以视觉美化产品界面&#xff0c;而前端开发可以通过代码实现设计稿。作为UI设计师&#xff0c;如果画出来的图片美观方便对前端开发者非常有益。如果设计复比较难以实现&#xff0c;沟通就会变得更加困难。因此&#xff0c;UI设…

html+CSS+js部分基础运用14

熟悉插值{{}}的用法&#xff0c;在页面中显示下列内容。图1 插值语法的效果图 在页面中统计鼠标单机按钮的次数。【提示&#xff1a;v-on指令】&#xff0c;页面效果如下图所示&#xff1a;图2 统计效果图 3、①单击按钮可以修改黑体字。②通过调试工具vue-devtools修改黑体字。…

数据结构:并查集

数据结构&#xff1a;并查集 题目描述参考代码 题目描述 输入样例 5 5 C 1 2 Q1 1 2 Q2 1 C 2 5 Q2 5输出样例 Yes 2 3参考代码 #include <iostream>using namespace std;const int N 100010;int n, m; int p[N], sz[N];int find(int x) // 返回x的祖宗节点 路径…

AI网络爬虫:用GraphQL查询爬取动态网页数据

任务&#xff1a;爬取网站www.skillshare.com搜索结果页面数据&#xff1a; 查看网站的请求信息&#xff1a; 请求网址: https://www.skillshare.com/api/graphql 请求方法: POST 状态代码: 200 OK 远程地址: 127.0.0.1:10809 引荐来源网址政策: strict-origin-when-…

Go 群发邮件Redis 实现邮件群发

一、安装 go get github.com/go-redis/redis/v8 go get gopkg.in/gomail.v2 二、使用"gopkg.in/gomail.v2"群发 package mainimport (gomail "gopkg.in/gomail.v2" )func main() {// 邮件内容m : gomail.NewMessage()m.SetHeader("From", &qu…

实验11 OSPF协议配置

实验11 OSPF协议配置 一、OSPF单区域配置&#xff08;一&#xff09;原理描述&#xff08;二&#xff09;实验目的&#xff08;三&#xff09;实验内容&#xff08;四&#xff09;实验配置&#xff08;五&#xff09;实验步骤 二、OSPF多区域配置&#xff08;一&#xff09;原理…

44-5 waf绕过 - SQL注入绕WAF方法

环境准备: 43-5 waf绕过 - 安全狗简介及安装-CSDN博客然后安装sqlilabs靶场:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、双写绕过 打开sql靶场的第一关:http://127.0.0.1/sqli-labs-master/Less-1/?id=1 验证一下waf是否开启防…

创新指南|2024企业如何开启生成式AI创新?从5大应用场景和6步抓手

想要了解如何采用生成式AI来提高企业效率和竞争力&#xff1f;本指南将介绍如何采用生成式AI来实现数字化转型&#xff0c;并打造智能化商业模式。从5大应用场景和6大步骤切入&#xff0c;让您了解如何开启生成式AI创新。立即连线创新专家咨询或观看创新战略方案视频进一步了解…

具有可编程电流限制的1.5A电源开关LPW5210用于5V或USB供电输出过流保护只要3毛

前言 适合要求反应时间较快的保护电路&#xff0c;保险丝或自恢复保险丝也能起到保护作用&#xff0c;但断开电流是额定电流的一倍&#xff0c;过流较小时&#xff0c;甚至需要数秒或更长的时间才能保护&#xff0c;因此半导体的过流保护开关更合适&#xff0c;相对成本要高一…

ABC318-E

挺有意思的一题&#xff0c;就当积累一下吧。 做法 枚举i和k会超时&#xff0c;那就只枚举j。 #include<bits/stdc.h> using namespace std; int n; int a[300010]; vector<int> v[300010]; int main(){ scanf("%d",&n); map<int,int&…

MQ之初识kafka

1. MQ简介 1.1 MQ的诞生背景 以前网络上的计算机&#xff08;或者说不同的进程&#xff09;传递数据&#xff0c;通信都是点对点的&#xff0c;而且要实现相同的协议&#xff08;HTTP、 TCP、WebService&#xff09;。1983 年的时候&#xff0c;有个在 MIT 工作的印度小伙突发…

Android AAudio——C API控制音频流(四)

上一篇文章我们介绍了 C API 中音频流的创建流程,以及打开音频流操作,这里我们再来看一下音频流的其他操作流程 一、音频流操作介绍 1、操作流程图 下图是状态变化流程图,虚线框表示瞬时状态,实线框表示稳定状态。 2、操作函数 上图中主要包含下面几个操作函数: aaudio…

AI-WEB-1 vulnhub靶场

AI-WEB-1 端口扫描 仅开放80端口 访问80端口 啥也没有 目录扫描 查看robots.txt 发现两个新目录 Disallow: /m3diNf0/ Disallow: /se3reTdir777/uploads/全都无权限访问 加入路径后再次扫描目录 发现/m3diNf0/目录下存在info.php&#xff0c;/se3reTdir777/目录下存在ind…

大文件上传处理:分卷压缩

大文件上传处理&#xff1a;分卷压缩 大文件上传处理&#xff1a;分卷压缩1、分卷压缩&#xff08;1&#xff09;Bandizip压缩工具&#xff1a;&#xff08;2&#xff09;分卷压缩后&#xff1a; 2、分卷压缩解压3、解压缩工具下载 大文件上传处理&#xff1a;分卷压缩 1、分卷…

将单列数据帧转换成多列数据帧

文章目录 1. 查看数据文件2. 读取数据文件得到单例数据帧3. 将单列数据帧转换成多列数据帧 在本次实战中&#xff0c;我们的目标是将存储在HDFS上的以逗号分隔的文本文件student.txt转换为结构化的Spark DataFrame。首先&#xff0c;使用spark.read.text读取文件&#xff0c;得…

Python | Leetcode Python题解之第132题分割回文串II

题目&#xff1a; 题解&#xff1a; class Solution:def minCut(self, s: str) -> int:n len(s)g [[True] * n for _ in range(n)]for i in range(n - 1, -1, -1):for j in range(i 1, n):g[i][j] (s[i] s[j]) and g[i 1][j - 1]f [float("inf")] * nfor …

TCP 建链(三次握手)和断链(四次握手)

TCP 建链&#xff08;三次握手&#xff09;和断链&#xff08;四次挥手&#xff09; 背景简介建链&#xff08;三次握手&#xff09;断链&#xff08;四次挥手&#xff09;序号及标志位延伸问题为什么建立连接需要握手三次&#xff0c;两次行不行&#xff1f;三次握手可以携带数…

【Vue】Vue生命周期

Vue生命周期&#xff1a;就是一个Vue实例从创建&#xff08;new一个Vue实例&#xff09; 到 销毁&#xff08;关闭网页&#xff09; 的整个过程。 生命周期四个阶段&#xff1a;① 创建 ② 挂载 ③ 更新 ④ 销毁 创建阶段&#xff1a;创建响应式数据 通过data给当前的Vue实例提…

【设计模式】结构型-适配器模式

前言 在软件开发中&#xff0c;经常会遇到需要将一个类的接口转换成另一个类的接口的情况。这可能是因为新旧系统之间的接口不兼容&#xff0c;或者是因为需要使用的第三方库的接口与当前系统的接口不匹配。为了解决这类问题&#xff0c;设计模式中的适配器模式应运而生。 一…

Leetcode3164. 优质数对的总数 II

Every day a Leetcode 题目来源&#xff1a;3164. 优质数对的总数 II 解法1&#xff1a;统计因子 遍历 nums1&#xff0c;统计所有元素的因子个数&#xff0c;记录到哈希表 cnt 中。 遍历 nums2&#xff0c;那么有 cnt[nums2[i]*k] 个数可以被 nums2[i]*k 整除&#xff0c;…