STM32F103驱动VL53L0X激光测距模块

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 串口输给串口调试助手软件显示出来。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

「提高你的CSS技能」:15个重要的CSS属性详解

这篇文章介绍了15个重要的CSS属性&#xff0c;旨在提高读者的CSS知识和技能。文章以清晰的方式解释了每个属性的作用和用法&#xff0c;并提供了相应的示例代码。通过这篇文章&#xff0c;读者可以了解到一些有趣且实用的CSS属性。 1:in-range 和:out-of-range 伪类 CSS的:in…

[C++] C++特殊类设计 以及 单例模式:设计无法拷贝、只能在堆上创建、只能在栈上创建、不能继承的类, 单例模式以及饿汉与懒汉的场景...

特殊类 1. 不能被拷贝的类 注意, 是不能被拷贝的类, 不是不能拷贝构造的类. 思路就是 了解什么时候 会以什么途径 发生拷贝, 然后将路堵死. 拷贝发生一般发生在 拷贝构造 和 赋值重载 所以, 只要把类的这两个成员函数堵死, 此类就不能拷贝了 C98 在C11之前, 可以通过这种方…

python-计算两个矩阵的相似度。

余弦相似度 在pytorch中&#xff0c;有一个专门的函数用于计算相似度&#xff1a;torch.cosine_similarity() https://pytorch.org/docs/stable/nn.functional.html#cosine-similarity import torch import torch.nn.functional as F input1 torch.randn(100, 128) input2 t…

技术讨论:我心中TOP1的编程语言

欢迎关注博主 六月暴雪飞梨花 或加入【六月暴雪飞梨花】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术…

使用STM32 再实现感应开关盖垃圾桶

硬件介绍 SG90舵机 如上图所示的舵机SG90&#xff0c;橙线对应PWM信号&#xff0c;而PWM波的频率不能太高&#xff0c;大约50Hz&#xff0c;即周期0.02s&#xff0c;20ms左右。 在20ms的周期内&#xff0c;高电平占多少秒和舵机转到多少度的关系如下&#xff1a; 0.5ms-----0度…

msvcr110.dll丢失的修复教程,找不到msvcr110.dll解决办法哪个更推荐

msvcr110.dll是微软的Visual C运行库文件之一。它是Microsoft Visual Studio 2012的一部分&#xff0c;用于支持运行在Windows操作系统上使用Visual C编写的应用程序。在Windows系统中非常重要&#xff0c;如果丢失或是损坏就会造成很多程序无法启动运行。 会出现以下的报错提…

【云原生】k8s之存储卷

容器磁盘上的文件的生命周期是短暂的&#xff0c;这就使得在容器中运行重要应用时会出现一些问题。首先&#xff0c;当容器崩溃时&#xff0c;kubelet 会重启它&#xff0c;但是容器中的文件将丢失——容器以干净的状态&#xff08;镜像最初的状态&#xff09;重新启动。其次&a…

简单版本视频播放服务器V1

一直想做个家用版本的视频播放器&#xff0c;通过这个可以实现简单的电脑&#xff0c;通过浏览器就是可以访问电脑里面的视频&#xff0c;通过手机&#xff0c;平板等都是可以访问自己的视频服务了 后端代码&#xff1a; package mainimport ("fmt""io/iouti…

JMeter 中 3 种参数值的传递

目录 前言&#xff1a; (一) 从 CSV 文件读取要批量输入的变量 (二) 利用 Cookie 进行值的传递 (三) 利用正则匹配提取上一个接口的返回数据作为下个请求的输入 前言&#xff1a; 在JMeter中&#xff0c;参数值的传递是非常重要的&#xff0c;因为它允许你在测试过程中动态…

Proxy-Reflect使用详解

1 监听对象的操作 2 Proxy类基本使用 3 Proxy常见捕获器 4 Reflect介绍和作用 5 Reflect的基本使用 6 Reflect的receiver Proxy-监听对象属性的操作(ES5) 通过es5的defineProperty来给对象中的某个参数添加修改和获取时的响应式。 单独设置defineProperty是只能一次设置一…

Spring专家课程Day01_Spring-IOC

​ 文章目录 基础配置1)基础文件结构(Maven项目创建) 一、01_Spring概述_IOC_HelloWorld1.Spring框架的两个核心功能1.1) IOC/DI ,控制反转依赖注入!1.2) AOP,面向切面编程 2.IOC的两种模式2.1)配置文件中配置 Bean2.2)配置文件,组件扫描注解类注解Component 二、02_JavaBean_J…

Ajax简介和实例

目录 什么是 AJAX &#xff1f; AJAX实例 ajax-get无参 ajax-get有参 对象和查询字符串的互转 ajax-post ajax-post 表单 AJAX 是一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。 什么是 AJAX &#xff1f; 菜鸟教程是这样介绍的&#xff1a…

本地Linux 部署 Dashy 并远程访问

文章目录 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 转载自cpolar极点云文章&#xff1a;本地Linux 部署 Dashy 并远程访问 简介 Dashy 是一个开源的自托管的导航页配置服务&#xff0c;具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你…

Gradle下载和配置教程:Windows、Mac和Linux系统安装指南

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

扒开 TCP 的外衣,看清 TCP 的本质

TCP 非常重要&#xff0c;它的内容很多&#xff0c;今天只能讲解其中的一部分&#xff0c;但足以让你超越 80 % 的编程开发人员对于 TCP 的认知。 本篇内容非常多&#xff0c;非常干&#xff0c;希望你花点时间仔细研究&#xff0c;我相信会对你有所帮助。 1. TCP 协议是什么…

云之道知识付费V2小程序V3.1.1独立平台版安装使用教程

据播播资源了解&#xff0c;云之道知识付费小程序是一款专注于知识付费的小程序源码&#xff0c;为内容创业者、自媒体和教育培训机构提供全方位的互联网解决方案。 由播播资源小编全套安装云之道知识付费V2独立版系统&#xff0c;系统支持无限多开&#xff0c;相比上几版出现…

Freertos-mini智能音箱项目---IO扩展芯片PCA9557

项目上用到的ESP32S3芯片引脚太少&#xff0c;选择了PCA9557扩展IO&#xff0c;通过一路i2c可以扩展出8个IO。这款芯片没有中断输入&#xff0c;所以更适合做扩展输出引脚用&#xff0c;内部寄存器也比较少&#xff0c;只有4个&#xff0c;使用起来很容易。 输入寄存器 输出寄存…

2021年美国大学生数学建模竞赛D题音乐的影响解题全过程文档及程序

2021年美国大学生数学建模竞赛 D题 音乐的影响 原题再现&#xff1a; 音乐是人类社会的一部分&#xff0c;是文化遗产的重要组成部分。 作为理解音乐在人类集体经验中所扮演角色的努力的一部分&#xff0c;我们被要求开发一种方法来量化音乐进化。 当艺术家创作一首新音乐时&…

运维小知识(二)——Linux大容量磁盘分区及挂载

centos系统安装&#xff1a;链接 目录 1.&#x1f353;&#x1f353;命令格式化磁盘 2.&#x1f353;&#x1f353;大容量硬盘分区 3.&#x1f353;&#x1f353;自动挂载 整理不易&#xff0c;欢迎一键三连&#xff01;&#xff01;&#xff01; 新系统装完之后&#xff0…

Go实现socks5服务器

SOCKS5 是一个代理协议&#xff0c;它在使用TCP/IP协议通讯的前端机器和服务器机器之间扮演一个中介角色&#xff0c;使得内部网中的前端机器变得能够访问Internet网中的服务器&#xff0c;或者使通讯更加安全。SOCKS5 服务器通过将前端发来的请求转发给真正的目标服务器&#…