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

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

3天内不再提示

VL53L5CX驱动开发(3)----检测阈值

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2023-12-01 16:30 次阅读

概述

本章展示如何使用VL53L5CX近接传感器的"检测阈值"功能。这个功能允许用户为传感器设置预定义的条件,当这些条件满足时,传感器可以触发一个中断。

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

在这里插入图片描述

VL53L5CX传感器允许用户更灵活地定义响应行为,特别是当检测到特定的测量结果时。例如,可以设置当对象的距离低于或高于特定值时,触发中断。这种功能在各种实际应用中,如智能开关、安全系统或机器人导航中,都非常有用。

实现demo

主要展示了如何使用VL53L5CX传感器来设置和使用检测阈值。
实现为每个区域(在4x4分辨率中有16个区域)设定了两个阈值:一个基于信号强度,另一个基于物体的测量距离。

视频教学

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

样品申请

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

在这里插入图片描述

源码下载

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

生成STM32CUBEMX

选择MCU

测试版所用的MCU为STM32G431CB。
在这里插入图片描述

串口配置

查看原理图,PA9和PA10设置为开发板的串口。
在这里插入图片描述

配置串口。
在这里插入图片描述

IIC配置

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

配置IIC为快速模式,速度为400k。
在这里插入图片描述

INT设置

自主模式可以通过获取INT管脚进行判断数据是否准备好。
在这里插入图片描述

配置PB4为输入模式。
在这里插入图片描述

配置使能与复位

驱动中有对模块进行复位的操作。
在这里插入图片描述

配置PB15和PB3为输出管脚。
在这里插入图片描述

X-CUBE-TOF1

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

由于需要自主模式,所以可以不开启主程序TOF执行代码。
在这里插入图片描述

串口重定向

打开魔术棒,勾选MicroLIB
在这里插入图片描述

在main.c中,添加头文件,若不添加会出现 identifier "FILE" is undefined报错。

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

函数声明和串口重定向:

/* USER CODE BEGIN PFP */
int fputc(int ch, FILE *f){
	HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
	return ch;
}
/* USER CODE END PFP */

代码配置

在custom_ranging_sensor.c代码中,有IO口驱动VL53L5CX进行复位的代码,由于没有配置对应的IO,所以需要注释掉。
在这里插入图片描述

由于没加载串口定义,所以注释掉#include "custom.h"
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

TOF代码配置

在main.c中添加对应头文件。

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

/* USER CODE END Includes */

函数与变量定义:

/* USER CODE BEGIN PFP */
int fputc(int ch, FILE *f){
	HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
	return ch;
}


static int32_t status = 0;
static RANGING_SENSOR_Result_t Result;

/* USER CODE END PFP */

添加TOF初始化。
主要为设置检测阈值。

/* USER CODE BEGIN 2 */


	/*********************************/
	/*  程序检测阈值 */
	/*********************************/

    /* 在此示例中,我们希望每个区域有2个阈值,分辨率为4x4 */
    /* 创建阈值数组(大小不能更改) */
	VL53L5CX_DetectionThresholds thresholds[VL53L5CX_NB_THRESHOLDS];	
	
  /* Set all values to 0 */
  memset(&thresholds, 0, sizeof(thresholds));

	
  VL53L5CX_Object_t *pL5obj = CUSTOM_RANGING_CompObj[CUSTOM_VL53L5CX];

    /* 为所有区域添加阈值(在4x4的分辨率中有16个区域,或在8x8中有64个) */
  for (int i = 0; i < 16; i++) {
		/* 第一个所需的阈值是GREATER_THAN模式。请注意,第一个必须始终使用数学操作VL53L5CX_OPERATION_NONE设置。
		 * 在此示例中,信号阈值设置为150 kcps/spads(格式会在驱动程序内自动更新)
		 */
    thresholds[2 * i].zone_num = i;
    thresholds[2 * i].measurement = VL53L5CX_SIGNAL_PER_SPAD_KCPS;
    thresholds[2 * i].type = VL53L5CX_GREATER_THAN_MAX_CHECKER;
    thresholds[2 * i].mathematic_operation = VL53L5CX_OPERATION_NONE;
    thresholds[2 * i].param_low_thresh = 150;
    thresholds[2 * i].param_high_thresh = 150;

		/* 第二个所需的检查器是IN_WINDOW模式。我们将设置一个数学阈值VL53L5CX_OPERATION_OR,以将前一个检查器添加到此检查器。
		 * 在此示例中,距离阈值设置在200mm和400mm之间(格式会在驱动程序内自动更新)。
		 */
    thresholds[2 * i + 1].zone_num = i;
    thresholds[2 * i + 1].measurement = VL53L5CX_DISTANCE_MM;
    thresholds[2 * i + 1].type = VL53L5CX_IN_WINDOW;
    thresholds[2 * i + 1].mathematic_operation = VL53L5CX_OPERATION_OR;
    thresholds[2 * i + 1].param_low_thresh = 200;
    thresholds[2 * i + 1].param_high_thresh = 400;
  }

	/* 必须明确指出最后的阈值。因为我们有32个检查器(16个区域x 2),所以最后一个是第31个 */
  thresholds[31].zone_num = VL53L5CX_LAST_THRESHOLD | thresholds[31].zone_num;

	/* 向传感器发送阈值数组 */
	status |= vl53l5cx_set_detection_thresholds(&pL5obj- >Dev, thresholds);

	/* 启用阈值检测 */
	status |= vl53l5cx_set_detection_thresholds_enable(&pL5obj- >Dev, 1U);

	/* 设置传感器的测量频率,这决定了传感器执行测量的速度 */
	status |= vl53l5cx_set_ranging_frequency_hz(&(pL5obj- >Dev), 10);
	
	
  if (status != VL53L5CX_STATUS_OK)
  {
    printf("ERROR : Configuration programming error!nn");
    while (1);
  }

  status = vl53l5cx_start_ranging(&(pL5obj- >Dev));
  if (status != VL53L5CX_STATUS_OK)
  {
    printf("vl53l5cx_start_ranging failedn");
    while (1);
  }



  static VL53L5CX_ResultsData data;

  /* USER CODE END 2 */

主程序
主程序来获取对应的INT位状态来判定数据是否准备好。

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	
	if(HAL_GPIO_ReadPin  ( GPIOB, GPIO_PIN_4) ==0)		
	{
		// 获取传感器的测距数据
		status = vl53l5cx_get_ranging_data(&(pL5obj- >Dev), &data);
		printf("n");
		// 循环打印所有16个区域的数据
		for (int i = 0; i < 16; i++) {
			printf("Zone : %3d, Status : %3u, Distance : %4d mm, Signal : %5lu kcps/SPADsrn",
							 i,
							 data.target_status[VL53L5CX_NB_TARGET_PER_ZONE * i],
							 data.distance_mm[VL53L5CX_NB_TARGET_PER_ZONE * i],
							 data.signal_per_spad[VL53L5CX_NB_TARGET_PER_ZONE * i]);
		}
	}
	
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

Kcps/SPAD定义

Kcps/SPAD 是一个测量单位,其中 "Kcps" 代表千计数每秒(Kilo Counts Per Second),而 "SPAD" 代表单光子雪崩二极管(Single Photon Avalanche Diode)。
SPAD是一种高度敏感的光电二极管,当它接收到单个光子时就能产生雪崩击穿,从而输出较大的电流。由于其极高的灵敏度,它经常用于低光强度的测量中,如激光时间飞行距离测量(ToF)中。
在这里插入图片描述

状态说明

正常的数据返回状态为5,为了保持数据一致,用户需要过滤无效的目标器状态。为了给出信心评级,状态为5的目标被认为是100%有效的。6或9的状态可以用50%的置信度来考虑。所有其他状态都低于50%置信度。
在这里插入图片描述

演示结果

当测量距离为200mm-400mm时,会触发中断,进行数据打印。

在这里插入图片描述

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

    关注

    0

    文章

    120

    浏览量

    18350
  • 驱动开发
    +关注

    关注

    0

    文章

    129

    浏览量

    12010
  • TOF
    TOF
    +关注

    关注

    9

    文章

    435

    浏览量

    35902
  • stm32cubemx
    +关注

    关注

    5

    文章

    260

    浏览量

    14447
收藏 人收藏

    评论

    相关推荐

    VL53L5CX驱动开发(4)----运动指示器

    VL53L5CX传感器内置了一个固件功能,可以检测场景中的运动。这个运动指示器是基于连续帧之间来计算的。使用插件vl53l5cx_plugin_motion_indicator可以使用这个选项
    的头像 发表于 12-01 16:31 324次阅读
    <b class='flag-5'>VL53L5CX</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>(4)----运动指示器

    VL53L5CX驱动开发(5)----运动阈值检测

    本章目的是展示如何充分利用VL53L5CX传感器的高级特性,通过结合运动指示器和阈值检测功能,实现对特定场景的精确监控。首先,程序通过特定的配置,确保了传感器能够在特定的分辨率下工作,同时还可
    的头像 发表于 12-01 16:33 305次阅读
    <b class='flag-5'>VL53L5CX</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>(5)----运动<b class='flag-5'>阈值</b><b class='flag-5'>检测</b>

    请问VL53L5CX如何实现超过15HZ的采样?

    VL53L5CX如何实现超过15HZ的采样?超频会引发什么现象?
    发表于 03-12 07:06

    VL53L5CX #高达 8x8 多区域测距和 63°对角线宽视场 飞行时间多区域测距传感器

    ,可实现双摄像头立体视觉和 3D 深度辅助* 智能建筑和智能照明(用户检测以唤醒设备)* IoT(用户和物体检测)* 视频对焦跟踪。60 Hz 测距可优化连续对焦算法VL53L5CX
    发表于 09-01 10:10

    在没有物理红外滤光片的情况下使用VL53L5CX会不会很危险呢?

    物理红外滤光片会给出一些错误的测量结果,并且不会完美地粘在 VL53L5CX 上。在没有物理红外滤光片的情况下使用 VL53L5CX 是否存在危险?
    发表于 12-08 07:15

    测试VL53L5CX,LPn引脚的行为与数据表中描述的不同是为什么?

    我正在测试 VL53L5CX,发现 LPn 引脚的行为与数据表中描述的不同。数据表说“当设备处于 LP 模式时,将此引脚驱动为逻辑 0 以禁用 I2C 通信。将此引脚驱动为逻辑 1 以在 LP 模式
    发表于 12-12 06:41

    求助,X-CUBE-TOF1中VL53L5CX传感器的API与VL53L5CX的ULD API不同吗?

    VL53L5CX 只有一个驱动程序。他们应该是一样的。
    发表于 12-12 06:40

    VL53L5CX带盖窗大气隙垫片要求是什么?

    VL53L5CX 带窗盖PCB和窗口相互平行PCB 到覆盖窗口的距离 = 3mm窗口厚度 = 0.5mm测量距离从 20mm 到 1000mm在这些条件下是否需要垫圈?
    发表于 12-13 08:09

    VL53L5CX Linux驱动程序1.2.0 - _vl53l5cx_poll_for_answer() 函数中的超时怎么修复?

    for an answer from VL53L5CX sensor. */static uint8_t _vl53l5cx_poll_for_answer( VL53L5CX
    发表于 12-13 08:29

    有什么方法可以验证VL53L5CX是否正确配置了I2C呢?

    有什么方法可以验证VL53L5CX是否正确配置了I2C呢?
    发表于 12-15 06:06

    VL53L5CX ULD API和单个4x4阈值之间为什么会发生冲突呢

    (uint8_t i = 0; i < 16; i++) { 阈值 .zone_num = i; 阈值.measurement = VL53L5CX_DISTANCE_MM; 阈值.
    发表于 12-21 06:22

    vl53l5cx_plugin_detection_thresholds.h文件中,检测阈值混乱怎么解决?

    几个问题。首先,似乎有一些相互矛盾的评论。在 vl53l5cx_plugin_detection_thresholds.h 文件中,有以下关于多个检查器的数学运算符的声明。“请注意,第一个检查器必须
    发表于 12-26 07:51

    VL53L5CX-SATEL和Rpi Linux驱动程序构建失败的原因?怎么解决?

    嗨,我正在尝试在我的树莓派 4 上为 VL53L5CX 模块构建用户模式 ​​linux 驱动程序,当我按照 RPI 指南中的说明进行操作时,我 cd 进入用户/测试并制作,我收到以下错误
    发表于 12-26 06:01

    VL53L5CX在i2cdetect树莓派上没有正确显示是为什么?

    嗨,我已经按照 VL53L5CX linux 驱动程序中的 PDF“VL53L5CX_Linux_Getting_started_with_Rpi.pdf”中的说明进行操作,并且已经构建了程序。当我
    发表于 12-26 07:37

    为什么读取VL53L5CX的多字节会触发超时呢?

    我们似乎无法通过 vl53l5cx_init(&Dev); 功能为VL53L5CX 。我们可以读取单个字节,但多字节 (4) 读取会触发超时,并且 ULD 无法成功加载。这是我们
    发表于 12-28 11:06