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

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

3天内不再提示

VL53L8CX TOF开发(3)----检测阈值

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2024-06-19 10:36 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

概述

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

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

wKgaomZyQ1mAXBWEAAcB-Ql8Cok445.png


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

视频教学

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

样品申请

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

wKgaomZyQ1mAXBWEAAcB-Ql8Cok445.png

源码下载

https://download.csdn.net/download/qq_24312945/89328194

实现demo

配置VL53L8CX传感器以实现特定条件下的目标检测和距离测量。通过设置信号强度和距离阈值,可以根据具体应用需求定制传感器的检测行为,使其在各种场景中发挥作用。
实现为每个区域(在4x4分辨率中有16个区域)设定了两个阈值:一个基于信号强度,另一个基于物体的测量距离。

硬件准备

首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
主控为STM32G431CB,TOF为VL53L8CX

wKgaomZyQ1mAXBWEAAcB-Ql8Cok445.png

生成STM32CUBEMX

选择MCU

测试版所用的MCU为STM32G431CB。

wKgZomZyQ1iAAR9eAAR1UeljDKE713.png

串口配置

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

wKgZomZyQ1iARTymAAHBFIZYfLo226.png

配置串口。

wKgaomZyQ1mAc0EHAAKBhL00-c0246.png

IIC配置

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

wKgZomZyQ1iAN3IpAAJSKsghdCo717.pngwKgaomZyQ1mAKXYiAAR1UeljDKE626.png

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

wKgaomZyQ1mAd2gqAASCMOAabgA601.png

LPn 设置

若进行IIC通讯,LPn设置为高电平状态。

wKgaomZyQ1mAYc1kAAYzNgmAqRE866.png

这里对应管脚为PA12。

wKgaomZyQ1mAZqyLAAMaEbrBClQ980.png

配置为PA12。

wKgaomZyQ1mAIizLAAYrxgqYN9o078.png

INT设置

自主模式可以通过获取INT管脚进行判断数据是否准备好。

wKgZomZyQ1iAQLaDAAMThLQO4ig448.png


配置PA11为输入模式。

wKgZomZyQ1iAV6hRAAWxXavDHGw277.png

X-CUBE-TOF1

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

wKgZomZyQ1mAYAseAAb8yKQ-MaA164.png

串口重定向

打开魔术棒,勾选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口驱动VL53L8CX进行复位的代码,由于没有配置对应的IO,所以需要注释掉。

wKgaomZyQ1mALB1NAAe6JgBX4N8744.png

TOF代码配置

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

/* USER CODE BEGIN Includes */
#include "stdio.h"
#include "vl53l8cx.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 */

kcps阈值检测

在激光雷达和飞行时间(ToF)传感器的测量中,kcps 代表 每秒千计数(kilo counts per second)。这是一个用于表示传感器每秒钟探测到的光子返回计数的单位。具体来说,它反映了每秒钟每个感光单元(SPAD)检测到的光子数量。
较高的kcps值通常表示反射率较高的目标或较近的目标,而较低的kcps值则表示反射率较低的目标或较远的目标。

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

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

	
  VL53L8CX_Object_t *pL8obj = CUSTOM_RANGING_CompObj[CUSTOM_VL53L8CX];

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

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

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

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

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

  status = vl53l8cx_start_ranging(&(pL8obj->Dev));
  if (status != VL53L8CX_STATUS_OK)
  {
    printf("vl53l5cx_start_ranging failedn");
    while (1);
  }



  static VL53L8CX_ResultsData data;

检测类型

这些宏定义用于在配置VL53L8CX传感器时指定“检测器”的类型,它们表示测量值的窗口或范围,由低阈值和高阈值定义。每个宏定义代表不同的检测条件类型。

/**
 * @brief The following macro are used to define the 'type' of a checker.
 * They indicate the window of measurements, defined by low and a high
 * thresholds.
 */

#define VL53L8CX_IN_WINDOW					((uint8_t)0U)
#define VL53L8CX_OUT_OF_WINDOW				((uint8_t)1U)
#define VL53L8CX_LESS_THAN_EQUAL_MIN_CHECKER ((uint8_t)2U)
#define VL53L8CX_GREATER_THAN_MAX_CHECKER	((uint8_t)3U)
#define VL53L8CX_EQUAL_MIN_CHECKER			((uint8_t)4U)
#define VL53L8CX_NOT_EQUAL_MIN_CHECKER		((uint8_t)5U)

VL53L8CX_IN_WINDOW:如果测量值在指定的低阈值和高阈值之间,则检测为真。
VL53L8CX_OUT_OF_WINDOW:如果测量值在指定的低阈值和高阈值之外,则检测为真。
VL53L8CX_LESS_THAN_EQUAL_MIN_CHECKER: 如果测量值小于或等于指定的低阈值,则检测为真。
VL53L8CX_GREATER_THAN_MAX_CHECKER:如果测量值大于指定的高阈值,则检测为真。
VL53L8CX_EQUAL_MIN_CHECKER:如果测量值等于指定的低阈值,则检测为真。
VL53L8CX_NOT_EQUAL_MIN_CHECKER:如果测量值不等于指定的低阈值,则检测为真。

距离阈值检测

配置VL53L8CX传感器进行距离测量,并设置每个区域的检测阈值,使传感器能够检测特定距离范围内的目标。通过设置测量频率和启动测量,传感器将开始定期进行测距,并根据配置的阈值进行检测。这些步骤确保传感器按预期工作,并在指定条件下触发相应的检测结果。

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

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

	
  VL53L8CX_Object_t *pL8obj = CUSTOM_RANGING_CompObj[CUSTOM_VL53L8CX];


    /* 为所有区域添加阈值(在4x4的分辨率中有16个区域,或在8x8中有64个) */
  for (int i = 0; i < 16; i++) {	
		/* 第二个所需的检查器是IN_WINDOW模式。我们将设置一个数学阈值VL53L5CX_OPERATION_OR,以将前一个检查器添加到此检查器。
		 * 在此示例中,距离阈值设置在200mm和400mm之间(格式会在驱动程序内自动更新)。
		 */		
    thresholds[i].zone_num = i;
    thresholds[i].measurement = VL53L8CX_DISTANCE_MM;
    thresholds[i].type = VL53L8CX_IN_WINDOW;
    thresholds[i].mathematic_operation = VL53L8CX_OPERATION_OR;
    thresholds[i].param_low_thresh = 200;
    thresholds[i].param_high_thresh = 400;		
		
	}
	

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

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

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

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

  status = vl53l8cx_start_ranging(&(pL8obj->Dev));
  if (status != VL53L8CX_STATUS_OK)
  {
    printf("vl53l5cx_start_ranging failedn");
    while (1);
  }



  static VL53L8CX_ResultsData data;

主程序

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

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	if(HAL_GPIO_ReadPin  ( GPIOA, GPIO_PIN_11) ==0)		
	{
	
		// 获取传感器的测距数据
		status = vl53l8cx_get_ranging_data(&(pL8obj->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[VL53L8CX_NB_TARGET_PER_ZONE * i],
							 data.distance_mm[VL53L8CX_NB_TARGET_PER_ZONE * i],
							 data.signal_per_spad[VL53L8CX_NB_TARGET_PER_ZONE * i]);
		}	
	}
    /* USER CODE END WHILE */

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

演示结果

1500-1700kcps/SPADs检测。

wKgaomZyQ1qAKJTCABDqJiuyGQ0057.png

200-400mm距离检测。

wKgZomZyQ1qAOipGABttJC0TY2o123.png


审核编辑 黄宇

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

    关注

    9

    文章

    522

    浏览量

    38190
  • stm32cubemx
    +关注

    关注

    5

    文章

    287

    浏览量

    17156
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    VL53L4CX小板开发(1)----驱动TOF进行测距

    性能。 得益于ST的专利算法和创新的模块结构,VL53L4CX还能在视场范围内检测到多个物体,并理解深度信息。ST的直方图算法确保了超过80厘米的距离覆盖玻璃的串扰免疫,并对80厘米以下的目标提供动态污渍补偿。
    的头像 发表于 11-08 16:29 2364次阅读
    <b class='flag-5'>VL53L4CX</b>小板<b class='flag-5'>开发</b>(1)----驱动<b class='flag-5'>TOF</b>进行测距

    VL53L4CD小板开发(2)----修改测量频率

    VL53L4CD是一款高度集成的飞行时间(ToF)传感器,广泛应用于距离测量和接近检测。为了满足不同应用场景的需求,合理调整传感器的测量频率至关重要。本文旨在介绍如何在VL53L4CD
    的头像 发表于 11-05 10:19 4401次阅读
    <b class='flag-5'>VL53L</b>4CD小板<b class='flag-5'>开发</b>(2)----修改测量频率

    SATEL-VL53L4CX:一款便于集成的飞行时间传感器分线板

    STMicroelectronics SATEL-VL53L4CX分线板设有两个分线板,可轻松集成到用户设计中。
    的头像 发表于 10-30 16:23 477次阅读
    SATEL-<b class='flag-5'>VL53L4CX</b>:一款便于集成的飞行时间传感器分线板

    基于VL53L4CX的飞行时间传感器扩展板:X-NUCLEO-53L4A2技术解析

    STMicroelectronics X-NUCLEO-53L4A2扩展板设计用于配备Arduino R3连接器的任何STM32 Nucleo开发板。X-NUCLEO-53L4A2扩展
    的头像 发表于 10-30 16:10 370次阅读
    基于<b class='flag-5'>VL53L4CX</b>的飞行时间传感器扩展板:X-NUCLEO-<b class='flag-5'>53L</b>4A2技术解析

    VL53L4CX飞行时间传感器技术解析与应用实践

    STMicroelectronics P-NUCLEO-53L4A2 STM32 Nucleo Pack是一款完整的评估套件,支持用户使用具有扩展距离测量功能的VL53L4CX飞行时间 (ToF
    的头像 发表于 10-29 11:43 364次阅读
    <b class='flag-5'>VL53L4CX</b>飞行时间传感器技术解析与应用实践

    基于VL53L4CD的高精度ToF接近传感器扩展板:X-NUCLEO-53L4A1 技术解析

    STMicroelectronics P-NUCLEO-53L4A1 STM32 Nucleo Pack是一款完整的评估套件,支持用户使用VL53L4CD飞行时间 (ToF) 高精度接近传感器评估
    的头像 发表于 10-29 11:36 357次阅读
    基于<b class='flag-5'>VL53L</b>4CD的高精度<b class='flag-5'>ToF</b>接近传感器扩展板:X-NUCLEO-<b class='flag-5'>53L</b>4A1 技术解析

    ST VL53L7CX飞行时间传感器与X-NUCLEO-53L7A1扩展板技术解析

    。 STMicroelectronics 推出的这款评估套件,旨在帮助用户了解、评测和开发基于VL53L7CX飞行时间8x8多区90° 视场角测距传感器的应用程序。该款扩展板配有盖玻片托架,在盖玻片下方可适配0.25mm 、
    的头像 发表于 10-28 11:34 377次阅读
    ST <b class='flag-5'>VL53L7CX</b>飞行时间传感器与X-NUCLEO-<b class='flag-5'>53L</b>7A1扩展板技术解析

    ST VL53L7CX 飞行时间传感器技术解析与应用指南

    STMicroelectronics VL53L7CX飞行时间多区测距传感器设计用于需要超宽FoV的应用。STMicroelectronics VL53L7CX飞行时间传感器提供90° 对角线FoV
    的头像 发表于 10-28 11:15 400次阅读
    ST <b class='flag-5'>VL53L7CX</b> 飞行时间传感器技术解析与应用指南

    基于VL53L7CX ToF传感器的STM32开发套件技术解析与应用实践

    STMicroelectronics P-NUCLEO-53L7A1评估套件支持使用具有90°对角线视场 (FoV) 的VL53L7CX飞行时间8x8多区域测距传感器学习、评估和开发
    的头像 发表于 10-28 09:25 305次阅读
    基于<b class='flag-5'>VL53L7CX</b> <b class='flag-5'>ToF</b>传感器的STM32<b class='flag-5'>开发</b>套件技术解析与应用实践

    基于ST VL53L8CX ToF传感器的技术解析与应用设计

    STMicroelectronics VL53L8CX 8x8多区域飞行时间传感器提高了环境光下的性能,降低了功耗。VL53L8CX基于ST的FlightSense技术,设计用于提供高达400cm
    的头像 发表于 10-25 17:44 1426次阅读
    基于ST <b class='flag-5'>VL53L8CX</b> <b class='flag-5'>ToF</b>传感器的技术解析与应用设计

    VL53L8系列ToF传感器开发板技术解析与应用指南

    STMicroelectronics SATEL-VL53L8分线板具有两个分线板,设计用于轻松集成到用户设计中。PCB部分穿孔并嵌入VL53L8飞行时间传感器模块。VL53L8CX是一款8x
    的头像 发表于 10-25 11:37 974次阅读
    <b class='flag-5'>VL53L8</b>系列<b class='flag-5'>ToF</b>传感器<b class='flag-5'>开发</b>板技术解析与应用指南

    ‌STM32 ToF传感器评估套件技术解析:基于P-NUCLEO-53L8A1数据手册

    STMicroelectronics P-NUCLEO-53L8A1传感器评估套件是一个完整的评估套件,让用户可使用VL53L8系列飞行时间传感器的不同商业产品来学习、评估和开发应用程序。VL
    的头像 发表于 10-25 11:14 957次阅读
    ‌STM32 <b class='flag-5'>ToF</b>传感器评估套件技术解析:基于P-NUCLEO-<b class='flag-5'>53L8</b>A1数据手册

    VL53L8CH飞行时间传感器技术解析与应用指南

    (VCSEL),可发射1级认证且完全不可见的940nm红外光。 VL53L8CH ToF传感器采用光学LGA16封装,尺寸为6.4mm x 3mm x 1.75mm。
    的头像 发表于 10-24 10:34 391次阅读
    ‌<b class='flag-5'>VL53L8</b>CH飞行时间传感器技术解析与应用指南

    基于VL53L4ED ToF传感器的SATEL-VL53L4ED分线板技术解析与应用指南

    STMicroelectronics SATEL-VL53L4ED分线板嵌入VL53L4ED飞行时间 (ToF) 高精度接近传感器,具有扩展温度能力。此板提供高性能接近测距,不受目标尺寸和反射率
    的头像 发表于 10-22 10:28 356次阅读
    基于<b class='flag-5'>VL53L</b>4ED <b class='flag-5'>ToF</b>传感器的SATEL-<b class='flag-5'>VL53L</b>4ED分线板技术解析与应用指南

    TOF传感器(VL53L5),无法得到data ready怎么解决?

    软件环境:基于STSW-IMG023示例代码,将代码移植到KEIL5下使用; 硬件环境:STM32F405芯片和VL53L5CX-SATEL模块; 问题描述:完成传感器初始化(测距频率10hz,测距
    发表于 07-10 08:18