问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

VL53L4CD ToF传感器单次测量模式开发指南

创作时间:
作者:
@小白创作中心

VL53L4CD ToF传感器单次测量模式开发指南

引用
1
来源
1.
https://m.elecfans.com/article/3379709.html

概述

在现代嵌入式系统中,精确的距离测量和实时响应能力对于许多应用场景至关重要。VL53L4CD 是一款先进的飞行时间(Time-of-Flight, ToF)传感器,能够提供高精度的距离测量。本文介绍了如何基于VL53L4CD传感器实现连续测距,并通过配置检测阈值来优化系统的响应能力。

我们将详细讲解如何初始化VL53L4CD传感器,设置其测量参数和检测阈值,并实现中断配置以响应特定的测量条件。通过这种方式,系统能够在距离测量达到预设的阈值范围内触发中断,从而实现实时响应和高效数据处理。

硬件准备

首先需要准备一个开发板,这里使用的是STM32G431CB MCU。开发板的硬件连接如下:

  • 串口:PA9和PA10
  • I2C接口:PA8和PB5
  • XSHUT引脚:用于控制传感器的开启和关闭
  • GPIO1:用于中断输出

软件配置

STM32CubeMX配置

  1. IIC配置:配置IIC为快速模式,速度为400k。
  2. XSHUT:XSHUT引脚由主机控制,设备在不使用时可以被完全关闭,然后通过主机使用XSHUT引脚来唤醒。
  3. GPIO1:当传感器完成一次测距操作时,GPIO1引脚可以被配置为输出中断信号,通知微控制器读取测量结果。

代码实现

在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 */

在main函数中进行传感器初始化和配置:

/* USER CODE BEGIN 2 */
uint32_t Id;
CUSTOM_RANGING_SENSOR_ReadID(CUSTOM_VL53L4CD, &Id);// 读取传感器ID并存储在Id变量中
CUSTOM_RANGING_SENSOR_GetCapabilities(CUSTOM_VL53L4CD, &Cap);// 获取传感器的能力并存储在Cap变量中
Profile.RangingProfile = VL53L4CD_PROFILE_AUTONOMOUS;// 设置测距配置文件为自主测量模式
Profile.TimingBudget = TIMING_BUDGET;// 设置测距的时间预算(以毫秒为单位)
Profile.Frequency = 0; // 设置测量频率为0,这意味着使用测量之间的间隔时间,而不是连续测量
Profile.EnableAmbient = 1; // 启用环境光测量
Profile.EnableSignal = 1; // 启用信号测量
// 如果配置文件与默认配置文件不同,则应用新的配置文件
CUSTOM_RANGING_SENSOR_ConfigProfile(CUSTOM_VL53L4CD, &Profile);
// 启动传感器进行单次测量
status = CUSTOM_RANGING_SENSOR_Start(CUSTOM_VL53L4CD, RS_MODE_BLOCKING_ONESHOT);
/* USER CODE END 2 */

在主循环中轮询GPIO状态并处理测量结果:

/* 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_VL53L4CD, &Result);
        if (status == BSP_ERROR_NONE)
        {
            print_result(&Result);
        }
        // 停止测量
        CUSTOM_RANGING_SENSOR_Stop(CUSTOM_VL53L4CD);
        HAL_Delay(1000);
        // 再次启动传感器进行单次测量
        status = CUSTOM_RANGING_SENSOR_Start(CUSTOM_VL53L4CD, RS_MODE_BLOCKING_ONESHOT);
    }
    /* USER CODE END WHILE */
}
/* USER CODE END 3 */

演示结果

配置成功后,数据可以正常打印。若对部分代码进行注释,可以查看到测距只执行一次,可以判断当前已经进入单次模式。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号