STM32传感器模块编程实践(九) VL53L0X激光红外测距传感器简介及驱动源码

news2024/10/20 16:32:04

文章目录

    • 一.概要
    • 二.VL53L0X测距原理
    • 三.VL53L0X主要特性
    • 四.VL53L0X硬件参考设计
    • 五.模块接线说明
    • 六.模块通讯协议介绍
    • 七.光学盖玻片介绍
    • 八.STM32单片机与VL53L0模块实现距离测量实验
      • 1.硬件准备
      • 2.软件工程
      • 3.软件主要代码
      • 4.实验效果
    • 九.小结

一.概要

VL53L0X是一款由ST(意法半导体)生产的红外传感器,通常用于测量物体与传感器之间的距离。
VL53L0X是ST推出的第二代FlightSense技术的飞行时间传感器,与传统的测距传感器不同,它使用时飞行时间(Time-of-Flight,TOF)测量原理,可以实现精确、快速的非接触式测量。无论目标颜色和反射率如何,都可以进行距离测量,抗干扰能力更强。

在这里插入图片描述

二.VL53L0X测距原理

VL53L0X激光测距模块的原理是利用激光脉冲的飞行时间来测量距离。该模块通过发射一束激光脉冲,并测量该激光脉冲从发射到被接收的时间来计算出物体与传感器之间的距离。
在这里插入图片描述

VL53L0X传感器的测距视场角(FOV)为25°,这个视场角决定了传感器在测距时所能覆盖的区域大小。
在这里插入图片描述

三.VL53L0X主要特性

‌尺寸‌:VL53L0的尺寸非常小,具体为4.4 x 2.4 x 1.0mm,这使得它成为市场上最小的飞行时间(ToF)测距传感器之一‌。
‌测距范围‌:该传感器的测距范围为30mm到2000mm,具体参数为30 ~ 2000mm‌。
‌最大测距‌:VL53L0的最大测距为2米(2000mm)。
‌工作电压‌:工作电压范围为2.6V到3.5V,通常使用3.3V或5V供电‌。
‌通信方式‌:采用I2C通信协议,设备地址为0x52,支持读写操作‌。
‌激光波长‌:使用940nm的VCSEL(垂直腔面发射激光器),这种激光器完全不可见且对人眼安全‌。
‌工作环境‌:工作温度范围为-20°C到70°C,适合各种环境使用‌。
‌测距精度‌:在高速模式下精度为±5%,高精度模式下为±3%‌(室内1.2米以内的白色物体)。
‌测距时间‌:高速模式下测距时间为20ms,高精度模式下为200ms‌。

测量距离(客观因素:室内/室外/被测物体偏白/北侧物体偏灰)
由下表可以看出传感器能够测量的最大距离和在室内环境或在户外强光环境有关系,也和被测物体是偏白还是偏灰有关系。可以看出最佳的测量环境是在室内测量白色障碍物的距离。
在这里插入图片描述

测量精度(客观因素:测量的距离远近/被测物体偏白/北侧物体偏灰)
33ms列为"Default"模式,"HighAccuracy"模式为200ms,在室内默认模式下测量1.2米之内白色的物体精度为4%,测量灰色物体精度为7%。
在这里插入图片描述

为啥测量灰色或者黑色的物体测量的最大距离会减少以及测量精度会降低,因为黑色或者灰色的物体能吸收大量的光子能量,导致反射回传感器的光子比较少,从而影响测量距离以及精度。

四.VL53L0X硬件参考设计

芯片引脚定义,从芯片底部角度观看:

在这里插入图片描述

参考原理图设计
在这里插入图片描述

五.模块接线说明

模块引脚说明:
在这里插入图片描述

在这里插入图片描述

5根杜邦线可以实现模块与开发板相连:
板子3.3----模块VIN
板子A11----模块SCL
板子A12----模块SDA
板子B7-----模块XSHUT
板子G------模块GND

六.模块通讯协议介绍

IIC数据写
在这里插入图片描述

IIC数据读
在这里插入图片描述

VL53L0X芯片的寄存器手册厂家是没提供的,提供了API函数,直接调用就可以实现数据读取。

操作流程:
模块上电,VL53L0X会进入Hw Standby状态,这是待机状态,功耗很低。然后拉高XSHUT引脚,让VL53L0X进入初始化启动状态,开始准备测距。

然后根据配置进入测距模式,有三种测距模式:
单次模式:收到测距开始命令后,开始进行测量,测量完成后自动退出,进入待机。
连续模式:收到测距开始命令后,就一直进行测量,直到收到测距停止命令。收到测距停止命令时,进入待机。
连续间隔模式:收到测距开始命令后,开始进行测量,完成一次测量后,等待一段时间再进行下次测量,直到收到测距停止命令,测量等待间隔时间可调。
在这里插入图片描述

七.光学盖玻片介绍

VL53L0X一般会和光学盖玻片一起结合使用。盖玻片有两个作用:提供物理保护,防止灰尘;对光进行滤波,如果只是个人实验评估使用,一般不需要加盖片。盖片如下图所示,刚好盖住整个传感器。

在这里插入图片描述

在这里插入图片描述

八.STM32单片机与VL53L0模块实现距离测量实验

1.硬件准备

STLINK接STM32F103C8T6开发板,STLINK接电脑USB口。

用5根杜邦线把模块与开发板相连:
板子3.3----模块VIN
板子A11----模块SCL
板子A12----模块SDA
板子B7-----模块XSHUT
板子G------模块GND

在这里插入图片描述

2.软件工程

打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32F103C8,再双击就创建新的工程
在这里插入图片描述
配置下载口引脚
在这里插入图片描述
配置外部晶振引脚,IIC采用GPIO模拟,所以IIC外设没有配置
在这里插入图片描述

配置系统主频
在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述
生成工程
在这里插入图片描述
用Keil5打开工程
在这里插入图片描述

添加代码

添加VL53L0驱动文件,以及OLED显示驱动文件
在这里插入图片描述

VL53L0复位引脚配置
在这里插入图片描述

VL53L0模拟IIC引脚配置

在这里插入图片描述
在这里插入图片描述
添加应用相关代码
在这里插入图片描述

在这里插入图片描述

3.软件主要代码

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();//8M外部晶振,72M主频

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
		OLED_Init();//OLED初始化  
		OLED_Clear();//清屏
	 while(vl53l0x_init(&vl53l0x_dev))//vl53l0x初始化
	 {	 
		HAL_Delay(500);
	 }
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
			vl53l0x_general_test(&vl53l0x_dev,Default_Mode);//默认模式测试
  }
  /* USER CODE END 3 */
}

//初始化vl53l0x
//dev:设备I2C参数结构体
VL53L0X_Error vl53l0x_init(VL53L0X_Dev_t *dev)
{
	GPIO_InitTypeDef GPIO_Initure;
	VL53L0X_Error Status = VL53L0X_ERROR_NONE;
	VL53L0X_Dev_t *pMyDevice = dev;
	
	__HAL_RCC_GPIOA_CLK_ENABLE();           //开启GPIOA时钟
	


	pMyDevice->I2cDevAddr = VL53L0X_Addr;//I2C地址(上电默认0x52)
	pMyDevice->comms_type = 1;           //I2C通信模式
	pMyDevice->comms_speed_khz = 400;    //I2C通信速率
	
	VL53L0X_i2c_init();//初始化IIC总线
	
  HAL_GPIO_WritePin(VL53L0X_XshutPort, VL53L0X_XshutPin, GPIO_PIN_RESET);//失能VL53L0X
	delay_ms(30);
	HAL_GPIO_WritePin(VL53L0X_XshutPort, VL53L0X_XshutPin, GPIO_PIN_SET);//使能VL53L0X,让传感器处于工作
	delay_ms(30);
	
    vl53l0x_Addr_set(pMyDevice,0x54);//设置VL53L0X传感器I2C地址
    if(Status!=VL53L0X_ERROR_NONE) goto error;
	Status = VL53L0X_DataInit(pMyDevice);//设备初始化
	if(Status!=VL53L0X_ERROR_NONE) goto error;
	delay_ms(2);
	Status = VL53L0X_GetDeviceInfo(pMyDevice,&vl53l0x_dev_info);//获取设备ID信息
    if(Status!=VL53L0X_ERROR_NONE) goto error;
	
if(Vl53l0x_data.adjustok==0xAA)//已校准
	  AjustOK=1;	
	else //没校准	
	  AjustOK=0;
	
	error:
	if(Status!=VL53L0X_ERROR_NONE)
	{
		print_pal_error(Status);//打印错误信息
		return Status;
	}
  	
	return Status;
}
//启动普通测量
//dev:设备I2C参数结构体
//mode模式配置 0:默认;1:高精度;2:长距离;3:高速
void vl53l0x_general_start(VL53L0X_Dev_t *dev,u8 mode)
{
	static char buf[VL53L0X_MAX_STRING_LENGTH];//测试模式字符串字符缓冲区
	VL53L0X_Error Status=VL53L0X_ERROR_NONE;//工作状态
	OLED_Init();			       //初始化OLED  
	OLED_Clear();            //清屏
	OLED_ShowCHinese(18,0,0);//光
	OLED_ShowCHinese(36,0,1);//子
	OLED_ShowCHinese(54,0,2);//物
	OLED_ShowCHinese(72,0,3);//联
	OLED_ShowCHinese(90,0,4);//网
	OLED_ShowString(6,3,"VL53L0X Test");
	OLED_ShowString(80,6,"mm");  
	vl53l0x_set_mode(dev,mode);//配置测量模式
	while(1)
	{
		 if(Status==VL53L0X_ERROR_NONE)
		 {
				Status = vl53l0x_start_single_test(dev,&vl53l0x_data,buf);//执行一次测量
			      if(vl53l0x_data.RangeMilliMeter<=2000)
						{
        		OLED_ShowNum(30,6,vl53l0x_data.RangeMilliMeter,4,16);//显示距离值
						}						
		 }
      	delay_ms(200);//等待200ms	
	}		
}

4.实验效果

在这里插入图片描述

九.小结

VL53L0X在激光自动对焦,测距和接近检测,深度映射和AR/VR中有广泛的应用,学会VL53L0X可以在这些应用场景可以发挥作用。

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

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

相关文章

通过PHP与API的结合,开启电商数据集成的新篇章

在数字化转型的浪潮中&#xff0c;电子商务数据的集成对于企业来说变得越来越重要。无论是在线零售商还是品牌商&#xff0c;都需要实时访问商品数据以优化库存管理、制定定价策略、提升客户体验。PHP&#xff0c;作为服务端脚本语言的佼佼者&#xff0c;为开发者提供了强大的工…

调查显示软件供应链攻击增加

OpenText 发布了《2024 年全球勒索软件调查》&#xff0c;强调了网络攻击的重要趋势&#xff0c;特别是在软件供应链中&#xff0c;以及生成式人工智能在网络钓鱼诈骗中的使用日益增多。 尽管各国政府努力加强网络安全措施&#xff0c;但调查显示&#xff0c;仍有相当一部分企…

【verilog】3_8-4_16数选器

文章目录 前言一、实验原理二、实验过程三、实验结果参考文献 前言 进行 实验 一、实验原理 二、实验过程 三、实验结果 代码 timescale 1ns/1ns module decoder_38_tb ; reg a; reg b; reg c; wire [7:0]data;decoder_38 u0 (.a(a),.b(b),.c(c),.data(data) ); init…

pandas-使用技巧

pandas-使用技巧 简单技巧 仅个人笔记使用&#xff0c;感谢点赞关注 简单技巧 pd.to_dict()&#xff1a;Dataframe格式数据转字典数据pd.dropna()&#xff1a;去nan值& | ~&#xff1a;pd逻辑运算符pd.isnan()&#xff1a;判断是否为nan值pd.concat&#xff1a;多个pd拼接…

关于武汉芯景科技有限公司的限流开关芯片XJ6241开发指南(兼容LTC4411)

一、芯片引脚介绍 1.芯片引脚 二、系统结构图 三、功能描述 1.CTL引脚控制VIN和VOUT的通断 2.CTL引脚控制STAT引脚的状态 3.输出电压高于输入电压加上–VRTO的值&#xff0c;芯片处于关断状态

揭秘Map与Set的键值奥秘与集合魅力,解锁高效数据魔法

文章目录 前言➰一、关联式容器1.1 关联式容器的概述1.2 关联式容器的工作原理1.3 关联式容器的核心特性 ➰二、键值对2.1 键值对的基本概念2.2 键值对在C中的实现 ➰三、树形结构的关联式容器3.1 树形结构的特点3.2 使用场景 ➰四、set的使用与定义4.1 set的基本特性4.2 set的…

OpenCV高级图形用户界面(11)检查是否有键盘事件发生而不阻塞当前线程函数pollKey()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 轮询已按下的键。 函数 pollKey 无等待地轮询键盘事件。它返回已按下的键的代码或如果没有键自上次调用以来被按下则返回 -1。若要等待按键被按…

软件压力测试如何进行?深圳软件测试机构分享

软件压力测试是每个重要软件测试工作的一部分&#xff0c;是一种基本的软件质量保证行为。压力测试不是在常规条件下运行手动或自动测试&#xff0c;而是在计算机数量较少或系统资源匮乏的条件下运行测试。通常要进行软件压力测试的资源包括内部内存、CPU 可用性、磁盘空间和网…

算法day-1

数组&#xfeff; 数组是存放在连续内存空间上的相同类型数据的集合。数组的下标或者索引是从0开始的. 数组的优点 快速访问&#xff1a;通过索引可以在常数时间内&#xff08;O(1)&#xff09;访问数组中的任意元素。顺序存储&#xff1a;数组中的元素在内存中是连续的&…

Codeforces 979 Div2 A-D (D. QED‘s Favorite Permutation详解)

比较开心能做出D A 原题 A. A Gift From Orangutan 思路 找到最大值最小值差值乘n - 1 即可 代码 #include <bits/stdc.h> #define int long long#define F(i, a, b) for (int i (a); i < (b); i) #define dF(i, a, b) for (int i (a); i > (b); i--)using…

C#学习笔记(一)

C#学习笔记&#xff08;一&#xff09; 简介第一章 上位机开发环境之 VS 使用和.NET 平台基础一、安装软件二、创建项目三、第一个Hello world四、解决方案与项目五、Debug 和 Release 的区别六、代码的生产过程七、CLR的其它功能 简介 C# .NET工控上位机开发 在工控领域&…

Nuxt.js 应用中的 build:before 事件钩子详解

title: Nuxt.js 应用中的 build:before 事件钩子详解 date: 2024/10/20 updated: 2024/10/20 author: cmdragon excerpt: build:before 钩子在 Nuxt.js 中是一种有力的工具,使开发者能够在应用的构建流程开始之前进行自定义处理和配置。在处理动态需求和配置时,开发者可以…

深度解析RLS(Recursive Least Squares)算法

目录 一、引言二、RLS算法的基本思想三、RLS算法的数学推导四、RLS算法的特点五、RLS算法的应用场景六、RLS算法的局限性七、总结 一、引言 在自适应滤波领域&#xff0c;LMS&#xff08;Least Mean Squares&#xff09;算法因其计算简单、实现方便而广受欢迎。然而&#xff0…

C++ 哈希桶和封装unordered_map和unordered_set

目录 哈希桶的概念 哈希桶的结构 哈希桶的结点 哈希桶的类 Insert插入函数 Find查找函数 Erase删除函数 哈希的两种仿函数(int) 和(string) 哈希表的改造 ​编辑 迭代器 改造 unordered_map和unordered_set的封装 前言 上一篇文章讲的哈希表&#xff0c;属于闭散…

解决k8s集群中安装ks3.4.1开启日志失败问题

问题 安装kubesphere v3.4.1时&#xff0c;开启了日志功能&#xff0c;部署时有三个pod报错了 Failed to pull image “busybox:latest”: rpc error: code Unknown desc failed to pull and unpack image “docker.io/library/busybox:latest”: failed to copy: httpRead…

【D3.js in Action 3 精译_034】4.1 D3 中的坐标轴的创建(中篇):定义横纵坐标轴的比例尺

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

京存助力北京某电力研究所数据采集

北京某电力研究所已建成了一套以光纤为主&#xff0c;卫星、载波、微波等多种通信方式共存&#xff0c;分层级的电力专用的网络通信架构体系。随着用电、配电对网络的要求提高&#xff0c;以及终端通信入网的迅速发展&#xff0c;迫切地需要高效的通信管理系统来应对大规模、复…

STM32传感器模块编程实践(七) MLX90614红外测温模块简介及驱动源码

文章目录 一.概要二.MLX90614主要技术指标三.模块参考原理图四.模块接线说明五.模块工作原理介绍六.模块通讯协议介绍七.STM32单片机与MLX90614模块实现体温测量实验1.硬件准备2.软件工程3.软件主要代码4.实验效果 八.小结 一.概要 一般来说&#xff0c;测温方式可分为接触式和…

大模型常见算子定义

本文将汇总大模型常用的算子定义&#xff0c;方便快速根据定义公式评估其计算量。 LayerNorm 这是在BERT、GPT等模型中广泛使用的LayerNorm&#xff1a; RMSNorm RMSNorm(root mean square)发现LayerNorm的中心偏移没什么用(减去均值等操作)。将其去掉之后&#xff0c;效果几乎…

51系列--人体身高体重BMI指数检测健康秤

本文主要介绍基于51单片机实现的人体身高体重BMI指数检测健康秤称设计&#xff08;程序、电路图、PCB以及文档说明书见文末链接&#xff09; 一、简介 本系统由STC89C52单片机、LCD1602液晶显示、按键、超声波测距、HX711称重传感器模块&#xff08;0-1000KG&#xff09;以及…