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

news2024/11/24 3:18:00

VL53L5CX驱动开发----3.检测阈值

  • 概述
  • 实现demo
  • 视频教学
  • 样品申请
  • 源码下载
  • 生成STM32CUBEMX
    • 选择MCU
    • 串口配置
    • IIC配置
  • INT设置
  • 配置使能与复位
  • X-CUBE-TOF1
  • 串口重定向
  • 代码配置
  • TOF代码配置
  • Kcps/SPAD定义
  • 状态说明
  • 演示结果

概述

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

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

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

实现demo

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

视频教学

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

VL53L5CX驱动开发(2)----设置自主模式

样品申请

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

在这里插入图片描述

源码下载

生成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!\n\n");
    while (1);
  }

  status = vl53l5cx_start_ranging(&(pL5obj->Dev));
  if (status != VL53L5CX_STATUS_OK)
  {
    printf("vl53l5cx_start_ranging failed\n");
    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/SPADs\r\n",
							 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时,会触发中断,进行数据打印。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vscode用密钥文件连接ssh:如果一直要输密码怎么办

commandshiftP&#xff1a;打开ssh配置文件 加上这么一段&#xff0c;host就是你给主机起的名字 对IdentityFile进行更改&#xff0c;改成相应的密钥文件 然后commandshiftP链接到主机就可以了 但是有时候它会让输入密码 这是由于你给这个IdentityFile的权限太多了&#xf…

【VTK】基础知识分析

很高兴在雪易的CSDN遇见你 &#xff0c;给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文分享VTK基础操作技术&#xff0c;记录vtk编程中常用的接口&#xff0c;变量等的创建及使用方法希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易…

程序包org.apache.commons.XXX不存在

看了好几个博客找这个出现的原因&#xff0c;最后亲测有用的&#xff1a; [IDEA]Java&#xff1a;“程序包XXX不存在”问题的三种解决方案 - lodalo - 博客园 (cnblogs.com) 使用第一种方式&#xff0c;不需要重启&#xff0c;就是在这个条件下输入&#xff1a;mvn idea:idea…

Ruby语言基础知识

Ruby是一种简单快捷的面向对象脚本语言&#xff0c;由日本人松本行弘&#xff08;Yukihiro Matsumoto&#xff09;在20世纪90年代开发&#xff0c;遵守GPL协议和Ruby License。它的灵感和特性来自于Perl、Smalltalk、Eiffel、Ada以及Lisp语言。 以下是Ruby语言的一些特点&#…

Mini小主机All-in-one搭建教程1-安装Esxi7.0虚拟机系统

Mini小主机All-in-one搭建教程1-安装Esxi7.0虚拟机系统 最近小主机似乎很火&#xff0c;知名不知名的品牌&#xff0c;都出了各自的小主机。今天主要介绍小主机下搭建教程安装Esxi、Openwrt、群晖NAS、Win11、centos7、黑苹果、Android-x86系统&#xff0c;这戏系统 搞得好是…

嵌入式C语言自我修养《GNU C编译器扩展语法》学习笔记

目录 一、C语言标准和编译器 二、指定初始化 三、宏构造“利器”&#xff1a;语句表达式 四、typeof与container_of宏 五、零长度数组 六、属性声明&#xff1a;section 七、属性声明&#xff1a;aligned 一、C语言标准和编译器 C语言标准的发展过程&#xff1a; ●…

想要精通算法和SQL的成长之路 - 前缀和的应用

想要精通算法和SQL的成长之路 - 前缀和的应用 前言一. 区域和检索 - 数组不可变二. 二维区域和检索 - 矩阵不可变2.1 前缀和的计算2.2 用前缀和计算二维区域和 三. 矩形区域不超过 K 的最大数值和 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 区域和检索 - 数组不可变 原…

c# xml 参数读取的复杂使用

完整使用2 生产厂家里面包含很多规格型号,一个规格型号里面包含很多出厂序列号,点击下一步如果检测到填充的和保存的不一样 就新增一条(如检测到生产厂家相同,但是规格型号不同,就新增一组规格型号)。 界面一:新增界面 界面2 删除界面 界面一:新增界面 load 其中…

导入Maven项目遇到的一些问题及解决

开发工具是IDEA&#xff0c; 一个Maven项目初次导入IDEA中&#xff0c;需要注意的几件事&#xff1a; 设置项目的编码格式&#xff08;或者提前设置全局的编码格式&#xff09;&#xff0c;一般是UTF-8&#xff1b;检查JDK版本和编译级别&#xff1b;检查Maven的版本&#xf…

centos7下安装elasticsearch7.8.1并配置远程连接

1、下载安装包 sudo wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.1-linux-x86_64.tar.gz 2、解压 sudo tar -zxvf elasticsearch-7.8.1-linux-x86_64.tar.gz 3、添加用户并设置密码 sudo useradd es sudo passwd es # 设置密码 Lida15…

NewStarCTF2023week2-Upload again!

尝试传修改后缀的普通一句话木马&#xff0c;被检测 尝试传配置文件 .htaccess 和 .user.ini 两个都传成功了 接下来继续传入经过修改的木马 GIF89a <script language"php"> eval($_POST[cmd]); </script> 没有被检测&#xff0c;成功绕过 直接上蚁剑…

课题学习(八)----卡尔曼滤波动态求解倾角、方位角

一、 卡尔曼滤波 卡尔曼滤波的应用要求系统和底层过程的测量模型都是线性的。离散时间线性状态空间系统的描述为: x k Φ k , k − 1 x k − 1 G k − 1 w k − 1 x_k\Phi_{k,k-1}x_{k-1}G_{k-1}w_{k-1} xk​Φk,k−1​xk−1​Gk−1​wk−1​    式中 Φ k , k − 1 \Phi_{…

原创先锋后台管理平台未授权访问

漏洞描述 原创先锋后台管理平台存在未授权访问漏洞&#xff0c;攻击者通过漏洞可以任意接管账户权限 漏洞复现 访问未授权的url&#xff1a; /admin/admin/admin_list.html漏洞证明如下&#xff1a; 文笔生疏&#xff0c;措辞浅薄&#xff0c;望各位大佬不吝赐教&#xff0…

智慧公厕云管理平台:公厕云大脑引领厕所革命未来之路

智慧公厕作为城市管理的重要组成部分&#xff0c;不仅为市民提供便利&#xff0c;更是城市形象的重要窗口。随着科技的发展&#xff0c;全域联网管理的智慧公厕云管理平台指挥大脑的建立&#xff0c;使得智慧公厕的跨区域、跨系统、跨业务、跨流程作业功能更加强大&#xff0c;…

Linux shell编程学习笔记12:布尔运算和逻辑运算

Linux Shell 脚本编程和其他编程语言一样&#xff0c;支持算数、关系、布尔、逻辑、字符串、文件测试等多种运算。前面几节我们陆续研究了 Linux shell编程 中的 字符串运算、算术运算和关系运算&#xff0c;今天我们来研究 Linux shell编程中的的布尔运算、逻辑运算。 一、…

COM编程入门Part Ⅱ - 深入理解COM服务器[译]

文章目录 1. 本文的目的 2. 介绍 3. 快速浏览COM服务器 4. 服务器生命周期管理 5. 实现接口&#xff0c;从IUnknown开始 6. CoCreateInstance()的内部 7. 注册COM服务器 8. 创建COM对象 - 类工厂 9. 示例自定义接口 10. 客户端使用我们的COM服务 11. 其他细节 本篇…

[入门一]C# webApi创建、与发布、部署、api调用

一.创建web api项目 1.1、项目创建 MVC架构的话&#xff0c;它会有view-model-control三层&#xff0c;在web api中它的前端和后端是分离的&#xff0c;所以只在项目中存在model-control两层 1.2、修改路由 打开App_Start文件夹下&#xff0c;WebApiConfig.cs ,修改路由&…

12.SpringBoot之RestTemplate的使用

SpringBoot之RestTemplate的使用 初识RestTemplate RestTemplate是Spring框架提供用于调用Rest接口的一个应用&#xff0c;它简化了与http服务通信方式。RestTemplate统一Restfull调用的标准&#xff0c;封装HTTP链接&#xff0c;只要需提供URL及返回值类型即可完成调用。相比…

小程序之基础入门(1)

⭐⭐ 小程序专栏&#xff1a;小程序开发专栏 ⭐⭐ 个人主页&#xff1a;个人主页 目录 一.前言 二.小程序简介 2.1 微信小程序的特点和优势&#xff1a; 三.小程序的安装与使用 五.小程序入门案例及目录结构 好啦&#xff01;&#xff01;今天的分享就到这啦&#xff01;…

多测师肖sir_高级金牌讲师_python之模块008

python之模块 一、模块的介绍 &#xff08;1&#xff09;python模块&#xff0c;是一个python文件&#xff0c;以一个.py文件&#xff0c;包含了python对象定义和pyhton语句 &#xff08;2&#xff09;python对象定义和python语句 &#xff08;3&#xff09;模块让你能够有逻辑…