STM32F103驱动VL53L0X激光测距模块

news2024/11/26 15:51:20

STM32F103驱动VL53L0X激光测距模块

    • 简介
    • 引脚定义
    • STM32F103ZET6开发板与VL53L0X模块接线
    • 测试代码
    • 实验结果

简介

TOF 是飞行时间(Tlme of Flight)技术的缩写,即传感器发出经过调制的近红外光,遇到物体后反射,传感器通过计算光线发射和反射时间差或相位差,来换算被测量物体的距离。
VL53L0X是新一代飞行时间(ToF)激光测距模块,无论目标反射率如何,都能提供精确的距离测量。它可以测量2m的绝对距离,为测距性能等级设定了新的基准。VL53L0X集成了一个领先的SPAD阵列(单光子雪崩二极管),并内嵌ST的第二代FlightSense™专利技术。
VL53L0X的940nm VCSEL发射器(垂直腔面发射激光器)完全不为人眼所见,加上内置的物理红外滤光片,使其测距距离更长,对环境光的免疫性更强,对盖片的光学串扰具有更好的稳定性。
VL53L0X 传感器提供了 4 种测量模式。分别为默认测量模式、高精度测量模式、长距离测量模式以及高速测量模式。根据 ST 官方提供的 4 种不同的精度模式的特点,具体参数如下表所示。

精度模式S测量时间(ms)测距性能(m)
默认301.2
高精度2001.2精度<±3%
长距离332
高速201.2精度<±5%

由表格可知,在不同精度工作模式下,测量时间长短是不同的,测量时间最快是高速模式,只需 20ms 内就可以采样一次,但精度确存在有±5%的误差范围。而在长距离精度模式下,测距距离能达到 2m,测量时间在 33ms 内,但测量时需在黑暗条件。用户可以根据实际需要,在不用的应用场景可使用不同的工作模式。
在这里插入图片描述

引脚定义

在这里插入图片描述
在这里插入图片描述
SCL:IIC接口时钟信号线;
SDA:IIC接口数据信号线;.
VIN:3.3-5V电源正极;
GND:电源负极
XSHUT(reset):复位,低有效;
GPIO1:中断输出
IIC器件地址:0x52
IIC通信频率:可达400KHz

STM32F103ZET6开发板与VL53L0X模块接线

STM32F103ZET6VL53L0X
3.3VVIN
GNDGND
PB10SCL
PB11SDA
XSHUTPA4

在这里插入图片描述

测试代码

  1. 主函数与初始化配置
    以下按照程序的执行流程,代码清单 1 main 函数(main.c 文件),在 main 函数中,首先对 USART 串口初始化配置。然后进入VL53L0X 传感器功能测试阶段。
int main(void)
{
 /*初始化 USART 配置模式为 115200 8-N-1,中断接收*/
 USART_Config();
 
 printf(" 欢迎使用野火开发板\r\n");
 printf(" 激光测距传感器实验\r\n");
  while (1) {
 vl53l0x_test();
 }
}

代码清单2 VL53L0X 传感器测试(VL53L0X.c 文件)在测试函数中先是对 VL53L0X 传感器进行了初始化设置,当初始化成功则退出 while循环函数进入激光测距过程(第 16 行代码)。

1 /**
2 * @brief VL53L0X 主测试程序
3 * @param 无
4 * @retval 无
5 */
6 void vl53l0x_test(void)
7 {
8 /*vl53l0x 初始化*/
9 while (vl53l0x_init(&vl53l0x_dev)) {
10 printf("初始化失败\r\n");
11 printf("请检查连接\r\n");
12 }
13 printf("初始化成功\r\n");
14 
15 while (1) {
16 vl53l0x_general_test(&vl53l0x_dev);
17 }
18 }

代码清单 3 VL53L0X 工作模式测试函数(VL53L0X.c 文件)在 test 函数中,第 8 行使用 scanf 函数,使开发板获取来自串口调试助手发出的控制指令。当开发板接收到的指令字符 ch 为有效指令时(0<=ch<4 的整数),开发板控制传感器通过vl53l0x_general_start(dev,ch)函数(第 17 行代码)进入相对应激光测距模式;当接收的字符是无效指令时,则打印提示用户输入合法指令。

1 /**
2 * @brief vl53l0x 工作模式测试
3 * @param dev:设备 I2C 参数结构体
4 * @retval 无
5 */
6 void vl53l0x_general_test(VL53L0X_Dev_t *dev)
7 {
8 uint32_t ch;
9 
10 Show_GenTask_Message(); //显示普通测量模式 UI
11 
12 while (1) {
13 scanf("%d",&ch);
14 printf("接收到字符:%d\r\n",ch);
15 
16 if ((ch>=0) && (ch<=3)) {
17 vl53l0x_general_start(dev,ch);
18 Show_GenTask_Message();
19 } else {
20 /*如果不是指定指令字符,打印提示信息*/
21 printf("请输入合法指令!\r\n");
22 Show_GenTask_Message();
23 }
24 }
25 }

代码清单 4 VL53L0X 测量模式配置函数(VL53L0X.c 文件)在测量模式配置函数中,由于频繁切换精度模式容易导致采集距离数据不准 ,所以在使用之前先对 VL53L0X 传 感 器 进 行 复 位 处 理 ( 第 18 行 代 码 ) , 然 后 使 用VL53L0X_StaticIni()函数对传感器参数恢复为默认。另外,精度模式的配置是根据函数参数 mode 变量决定的,mode 值对应 0:默认,1:高精度 2:长距离,3:高速,根据全局数组 Mode_data[]变量的写入,从而实现不同精度模式的配置。

1 /**
2 * @brief VL53L0X 测量模式配置
3 * @param dev:设备 I2C 参数结构体
4 * @param mode: 0:默认;1:高精度;2:长距离
5 * @retval 状态信息
6 */
7 VL53L0X_Error vl53l0x_set_mode(VL53L0X_Dev_t *dev,uint8_t mode)
8 {
9 VL53L0X_Error status = VL53L0X_ERROR_NONE;
10 uint8_t VhvSettings;
11 uint8_t PhaseCal;
12 uint32_t refSpadCount;
13 uint8_t isApertureSpads;
14 
15 /*复位 vl53l0x(频繁切换工作模式容易导致采集距离数据不准,需加上这一代码)*/
18 vl53l0x_reset(dev);
19 status = VL53L0X_StaticInit(dev);
20 
21 /*已校准好了,写入校准值*/
22 if (AjustOK!=0) {
23 /*设定 Spads 校准值*/
24 status= VL53L0X_SetReferenceSpads(dev,Vl53l0x_data.refSpadCount,
25 Vl53l0x_data.isApertureSpads);
26 if (status!=VL53L0X_ERROR_NONE) goto error;
27 delay_ms(2);
28 
29 /*设定 Ref 校准值*/
30 status= VL53L0X_SetRefCalibration(dev,Vl53l0x_data.VhvSettings,
31 Vl53l0x_data.PhaseCal);
32 if (status!=VL53L0X_ERROR_NONE) goto error;
33 delay_ms(2);
34 
35 /*中间省略代码*/
36 .......
37
38 
39 /*设定 VCSEL 脉冲周期*/
40 status = VL53L0X_SetVcselPulsePeriod(dev,
41 VL53L0X_VCSEL_PERIOD_PRE_RANGE, 
Mode_data[mode].preRangeVcselPeriod);
43 if (status!=VL53L0X_ERROR_NONE) goto error;
44 delay_ms(2);
45 
46 /*设定 VCSEL 脉冲周期范围*/
47 status = VL53L0X_SetVcselPulsePeriod(dev,
 VL53L0X_VCSEL_PERIOD_FINAL_RANGE,
 Mode_data[mode].finalRangeVcselPeriod);
50 
51 error:/*错误信息*/
52 if (status!=VL53L0X_ERROR_NONE) {
53 print_pal_error(status);
54 return status;
55 }
56 return status;
57}

代码清单 5 VL53L0X 单次距离测量函数(VL53L0X.c 文件)在该函数中,通过调用 VL53L0X_PerformSingleRangingMeasurement ()函数启动单次测量(第 15 行代码),该函数为阻塞函数,当测量结束后,测量的数据将被保存到 pdata 测量数据结构体上, 最后将获取测量结构体的测量数据赋值给 Distance_data 全局变量(第24 行代),通过读取 Distance_data 变量的值我们就可以知道测量距离了。

1 /**
2 * @brief VL53L0X 单次距离测量函数
3 * @param dev:设备 I2C 参数结构体
4 * @param pdata:保存测量数据结构体
5 * @retval 状态信息
6 */
7 VL53L0X_Error vl53l0x_start_single_test(VL53L0X_Dev_t *dev, 
VL53L0X_RangingMeasurementData_t *pdata,
9 char *buf)
10 {
11 VL53L0X_Error status = VL53L0X_ERROR_NONE;
12 uint8_t RangeStatus;
13 
14 /*执行单次测距并获取测距测量数据*/
15 status = VL53L0X_PerformSingleRangingMeasurement(dev, pdata);
16 if (status !=VL53L0X_ERROR_NONE) 
return status;
17 
18 /*获取当前测量状态*/
19 RangeStatus = pdata->RangeStatus;
20 memset(buf,0x00,VL53L0X_MAX_STRING_LENGTH);
21 /*根据测量状态读取状态字符串*/
22 VL53L0X_GetRangeStatusString(RangeStatus,buf);
23 /*保存最近一次测距测量数据*/
24 Distance_data = pdata->RangeMilliMeter;
25 
26 return status;
27 }

实验结果

在串口助手软件输入对应测距模式的编号后,激光测距传感器获取感应信息,将结果通过开发版 usart1 串口输给串口调试助手软件显示出来。
在这里插入图片描述

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

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

相关文章

bug:file name too long文件名超出系统最大限制

各操作系统支持最长的文件和目录名称长度&#xff08;Linux、Win、Mac&#xff09; 今天开发需求的时候发现无法新建文件&#xff0c;提示file name too lang&#xff0c;于是翻阅和查询了一些资料&#xff0c;发现不同操作系统下文件名和目录名最长的长度不同。 操作系统文件名…

游戏如何应对虚拟定位问题

在游戏系统设计中&#xff0c;排行榜这一设计可谓是十分巧妙。它可以充分调动玩家的“胜负欲”&#xff0c;给予玩家前进的目标及动力&#xff0c;满足玩家的心理需求。 排行榜的设计使用范围广&#xff0c;对游戏留存、付费等指标提升效果出众&#xff0c;在不少游戏中都可以…

玩机搞机---某些安卓定制机解除系统安装限制的思路与分析过程

定制机的意义不多做解释&#xff0c;懂的人都明白. 在一些定制机中会限制用户安装app。当你使用第三方工具或者adb指令安卓app是他会提示de xxx.apk. autostarter is not auth,install failed!等等类似的提示&#xff0c;在解决某些定制系统中类似问题的过程中&#xff0c;基本…

Unity知识记录--项目升级URP

URP是指Unity的通用渲染管线&#xff0c;此处主要针对原有项目进行升级使用&#xff0c;但并不是所有的内容都可以直接通过升级完成&#xff0c;直接使用的Unity默认的shader通常可以完成直接升级&#xff0c;自己编写的shader通常需要重做。 首先我们先要安装这个Package&…

汇报方案设计方案规划方案资源下载

标题汇报方案设计方案规划方案资源下载https://wheart.cn/so/home?mdw&tag%E5%AE%89%E5%85%A8文章标签事业单位人事人才信息综合管理系统建设设计报价方案人事系统,人事人才,事业单位,工资系统,职称系统xx纪检委智慧监督平台建设方案汇报.docx建设方案,规划设计,汇报方案营…

程序员如何走向世界!

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

训练速度提升300倍,Niantic最新VPS视觉定位方案亮相

近年来在谷歌、Niantic等推动下&#xff0c;视觉定位对于AR应用的重要性越来越明显&#xff0c;尤其是在室内导航场景&#xff0c;定位精度可超越传统GPS方案。为了进一步提升视觉定位、深度视觉地图构建的准确性&#xff0c;Niantic Labs在CVPR 2023期间公布了ACE方案&#xf…

[MySql]表的增删查改

目录 前言: 1.插入数据 2.查询数据 2.1全列查询 2.2指定查询 2.3别名 2.4去重 2.5排序 2.6条件查询 2.7聚合查询 2.7.1group by语句 2.7.2havin语句 2.8联合查询 2.8.1内连接 2.8.2外连接 2.8.3自连接 2.8.4子查询 3.修改 4.删除 前言: 本次大多数使用…

【计算机视觉】MobileSAM论文解读:比SAM小60倍,比FastSAM快4倍,速度和效果双赢

文章目录 一、导读二、摘要三、Introduction三、Related work3.1 SAM&#xff1a;泛化和通用功能性3.2 ViT&#xff1a;轻巧高效 四、Mobile-Friendly SAM4.1 Background and Project Goal4.1.1 Background on SAM4.1.2 Project goal 4.2 Proposed Method4.2.1 耦合蒸馏4.2.2 从…

这个工具,补齐了 JMeter性能分析最后一公里短板

要说现在企业中主流的性能测试工具是什么&#xff1f; 答案肯定有 JMeter。 但是Jmeter 贵为测试工具界的“大牛”&#xff0c;在性能分析能力方面&#xff0c;还是有些欠缺的。 像Allen巨佬在高级性能实际教学的过程中就会经常遇到&#xff0c;学生截取一个监听器的图&…

使用传统的jdbc方式操作数据库

现在开发中有了mybatis、jdbcTemplate之后&#xff0c;已经很少公司会直接使用jdbc来连接数据库了&#xff0c;但是无论是mybatis还是jdbcTemplate&#xff0c;其底层都是jdbc。 这篇文章就主要介绍一下怎么通过jdbc来连接数据库。 在这之前&#xff0c;创建数据库jdbc&#xf…

JS相关介绍

1.JS引入&#xff1a; 内部&#xff1a;直接在html文件内部使用script标签调用 外部&#xff1a;另外新建JS文件&#xff0c;再在html文件中调用 2.输入输出&#xff1a; 输入&#xff1a;prompt(请输入您的姓名&#xff1a;) 输出&#xff1a;document.write(你们真是天才) 注…

2.9 Bootstrap 辅助类

文章目录 Bootstrap 辅助类文本背景其他更多实例关闭图标插入符快速浮动内容居中清除浮动显示和隐藏内容屏幕阅读器 Bootstrap 辅助类 下面将讨论 Bootstrap 中的一些可能会派上用场的辅助类。 文本 以下不同的类展示了不同的文本颜色。如果文本是个链接鼠标移动到文本上会变…

【自定义类型】(结构体、枚举、联合)

结构体内存对齐&#xff1a; 计算结构体的大小 结构体成员不是按照顺序在内存中连续存放的而是有一定的对齐规则的 结构体内存对齐的规则&#xff1a; 1、结构体的第一个成员永远放在相比于结构体变量起始位置的偏移量为0的位置。 2、从第二个成员开始&#xff0c;往后的每…

我打赌!这个 SQL 题,大部分人答不出来

周末的时候&#xff0c;一个读者问了我一个很有意思的问题&#xff0c;是关于 MySQL 中 update 加锁的问题。 他用下面这张数据库表&#xff0c;做了个 MySQL 实验的时候。 发现事务 B 的 update 不会阻塞&#xff0c;而事务 C 的 update 会阻塞&#xff0c;都是对 id 10 这条…

使用 uniswap 模拟交易时遇到一个问题

使用 uniswap 模拟交易时遇到一个问题 Error: VM Exception while processing transaction: socket hang upat web3.js:6365:9(39)at send (web3.js:5099:62(29))at <eval>:1:20(11)我的入参是 > eth.sendTransaction({from:0xe26a357fcc5A010421A49B8a5A99Af14CDe2…

Elasticsearch 中的矢量搜索:设计背后的基本原理

作者&#xff1a;Adrien Grand 你是否有兴趣了解 Elasticsearch 用于矢量搜索&#xff08;vector search&#xff09;的特性以及设计是什么样子&#xff1f; 一如既往&#xff0c;设计决策有利有弊。 本博客旨在详细介绍我们如何选择在 Elasticsearch 中构建矢量搜索。 矢量搜索…

科研 | 入门大全

文章目录 1. 读文献1.1 文献查阅与管理、如何快速找到与研究方向相关文章如何快速了解国内外发展现状找到后&#xff0c;怎么高效阅读&#xff1f;需要逐词逐句阅读吗&#xff1f;需要顺序阅读&#xff1f;读完之后&#xff0c;好像懂了&#xff0c;好像也没懂读过的文章&#…

通过GWO算法对8个发电机进行了最佳调度编码(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 通过GWO&#xff08;Grey Wolf Optimization&#xff09;算法对8个发电机进行最佳调度编码是一种优化问题的解决方法。GWO算法灵…

【C++】C++异常机制

文章目录 C异常C语言传统的错误处理方式C错误处理方式异常的使用方法异常的使用规范异常安全问题异常规范自定义异常体系STL中的异常体系异常的优缺点 C异常 C语言传统的错误处理方式 终止程序&#xff0c;如assert直接断言报错&#xff0c;缺陷&#xff1a;非常麻烦&#xff…