VL53L1CB小板开发(2)----修改测距范围及测量频率 VL53L1CB传感器是一款高性能的飞行时间(Time-of-Flight)传感器,广泛应用于各种距离测量和目标检测场景。其灵活的配置选项使得用户可以根据具体应用需求调整测距范围和测量频率,从而实现最佳性能。本篇文章将介绍如何通过修改VL53L1CB传感器的测距范围和测量频率来满足不同应用场景的需求。
最近在弄ST Demo,需要样片的可以加群申请:615061293 。
[https://www.bilibili.com/video/BV1WWBRY8EWS]
[https://www.wjx.top/vm/OhcKxJk.aspx#]
[https://download.csdn.net/download/qq_24312945/90228600
VL53L4CX传感器支持多种测距模式,包括短距离、中距离和长距离模式。每种模式针对不同的测量距离进行了优化,用户可以根据目标物体与传感器之间的距离选择合适的测距模式:
● 短距离模式:适用于目标物体距离较近的应用,提供较高的测量精度和响应速度。
● 中距离模式:在一定距离范围内平衡了测量精度和响应速度,适用于多数通用测量应用。
● 长距离模式:适用于目标物体距离较远的应用,能够覆盖更大的测量范围,但响应时间相对较长。
测量频率决定了传感器进行测距操作的频次。通过调整测量频率,用户可以在响应速度和功耗之间找到平衡点:
● 高频测量:适用于需要实时监测和快速响应的应用场景,如手势识别和快速移动物体检测。然而,高频测量会增加功耗。
● 低频测量:适用于功耗敏感的应用,如电池供电设备或对响应速度要求较低的场景。低频测量可以显著降低功耗。
本文将详细介绍如何配置VL53L4CX传感器的测距范围和测量频率,包括具体的配置方法、相关代码示例以及在实际应用中的注意事项。通过合理调整这些参数,用户可以充分发挥VL53L4CX传感器的性能优势,满足各种复杂多样的应用需求。
首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
主控为STM32H503CBT6,TOF为VL53L4CX





https://github.com/CoreMaker-lab/VL53L1CB
https://gitee.com/CoreMaker/VL53L1CB
用STM32CUBEMX生成例程,这里使用MCU为STM32H503CB。 配置时钟树,配置时钟为250M。

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

配置串口,速率为115200。

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


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

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



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




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

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

在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) /* 16 ms < TimingBudget < 500 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_VL53L1CB, &Id);
// 获取传感器的能力
CUSTOM_RANGING_SENSOR_GetCapabilities(CUSTOM_VL53L1CB, &Cap);
// 配置测距参数
Profile.RangingProfile = RS_MULTI_TARGET_MEDIUM_RANGE; // 设置测距模式为中距离
Profile.TimingBudget = TIMING_BUDGET; // 设置时间预算(测量时间)
Profile.Frequency = 0; // 设置测量频率,这里不用于正常测距(设为0)
Profile.EnableAmbient = 1; // 启用环境光测量(1:启用,0:禁用)
Profile.EnableSignal = 1; // 启用信号测量(1:启用,0:禁用)
// 如果配置文件与默认配置不同,则设置新的配置文件
CUSTOM_RANGING_SENSOR_ConfigProfile(CUSTOM_VL53L1CB, &Profile);
// 启动传感器,设置为短距离测量模式
status = CUSTOM_RANGING_SENSOR_Start(CUSTOM_VL53L1CB, RS_MODE_BLOCKING_CONTINUOUS);
/* USER CODE END 2 */
主程序如下所示,可以通过判断GPIO1来判定信号是否已经准备好。
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
if(HAL_GPIO_ReadPin ( GPIOB, GPIO_PIN_8) ==0)
{
/* polling mode */
status = CUSTOM_RANGING_SENSOR_GetDistance(CUSTOM_VL53L1CB, &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。

修改TIMING_BUDGET为20,此时为20ms刷新一次,频率为50Hz,此时数据抖动较大。

VL53L1CB最大可以测量4M+距离,可以通过 Profile.RangingProfile 设置为测距模式。
此时 Profile.RangingProfile = VL53L1CB_PROFILE_MEDIUM; // 设置测距模式为中距离
若测量长距离,可能出现如下测量失败情况,TIMING_BUDGET修改为200。

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

修改测量范围为长范围。
Profile.RangingProfile = RS_MULTI_TARGET_LONG_RANGE;
此时测距可以测量长距离范围。

审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !