Hi3061M——VL53L0X激光测距(IIC)(同样适用于其他MCU)2

目录

    • 前言
    • 资源下载
    • 移植
    • 基本使用
      • IO配置
      • 调用测量
    • 总结

前言

昨晚太晚了,草草结束了上一篇,今天更新下半部分。
昨天已经讲了VL53L0X的使用流程,无非就是进行6步的效准初始化,然后配置下模式和时间,开始采样,获取数据这四个部分,都是通过调用API来实现,那么这些API哪来呢,源码呢?
这就是今天补充的内容了。

资源下载

首先要说明的是,ST提供源码包和相关资料的下载,有一丢丢麻烦,但是也还好。ST官方链接
里面包含源码和一些其他的资料。
另外你还需要一个API手册,API使用手册。
在这里插入图片描述
第一个ST官方链接打开会出现上面界面,点击get software即可跳转到下载源码的位置,可以登录下载也可以通过邮箱,发一封邮件给你提供的邮箱,然后在邮箱中点开下载链接,注意这里邮箱打开的浏览器要和你原来打开官方页面的浏览器一样,不然无法下载。
另外还要下载这个API使用手册,可以直接点API使用手册链接进行下载保存。这个链接是2022.10.25的2.0目前最新版本,后面如果有更新建议下载最新的。
此外觉得麻烦的也可以直接下载我提供的源码包。源码
里面包含2024-10-18 10:37:21下载的最新官方源码和API使用文档,以及我的移植相关代码my_vl53l0x和Hi3061M的一个使用案例。其中my_vl53l0x实现了代码的移植,基本上你只需要将这个文件添加到你的工程目录,然后修改一下vl53l0x_iic.h中的IO口配置和初始化即可,拿stm32移植举例,你需要将这个文件下的源码导入工程,当然还要配置.h,然后你需要将IIC通讯和x_shutIO口配置好初始化,和电平变化操作进行转换为stm32上的形式即可。

移植

移植主要就是放入源码, 该API适配的过程,要删删减减一些东西,不要的东西可以丢掉什么的,具体过程其实我自己也没记,反正就是删删改改,参考了正点原子的代码。
此外想要自己移植可以网上找资料看文档, 也可以看这篇文章https://blog.csdn.net/qlexcel/article/details/106154743
写的东西比较详细吧,但是感觉有点杂乱,又很长,我当时就不是很想看了,后面简单浏览了一遍,确实比我还是详细很多的,不过我这个主打一个简单高效的使用吧。

基本使用

首先下载了我提供的源码,放到gitee上了,和上面一样的。
在这里插入图片描述

IO配置

这个里面的就是相关包,放入你的工程文件,每个目录下包含inc和src,stm32需要包含头文件的分别包含进入即可。
导入文件后,需要修改vl53l0x_iic.h中的IO口配置和初始化
在这里插入图片描述
上图红框部分了,就是IIC通讯时的引脚电平设置,拿STM32举例就是改为:

//库函数
GPIO_SetBits(GPIOB,GPIO_Pin_10);//PB10 输出高
GPIO_ResetBits(GPIOB,GPIO_Pin_10);//PB10 输出低
//hal库
HAL_GPIO_WritePin(ATK_MS53L0_XSH_GPIO_PORT, ATK_MS53L0_XSH_GPIO_PIN, GPIO_PIN_SET) :
HAL_GPIO_WritePin(ATK_MS53L0_XSH_GPIO_PORT, ATK_MS53L0_XSH_GPIO_PIN, GPIO_PIN_RESET);

其他的MCU也是同样的原理,配置好这个就好。IO口的引脚电平设置,还有一个就是IO口的方向,和读取IO口的数据,这部分在IIC读和ACK读的时候是需要用到的。
另外IO口的初始化IIC两个引脚和VL53L0X_XSH复位引脚,这个IO初始化就需要自己在开始前进行初始化,上面IO口时钟和模式什么的,根据自己MCU配置。
还有IO口有关的头文件记得包含进去。

另外还有两个要修改
一个是串口打印函数,一个延时函数,us级别的

// 这里需要改为自己MCU相关的延时函数
#define vl53l0x_iic_delay(t) BASE_FUNC_DELAY_US(t)
// 这里需要改为自己MCU相关的延时函数
#define print_log DBG_PRINTF

调用测量

上面配置好后,我封装了一下连续测量的一个使用函数,在vl53l0x.c中,你只需要在main.c中包含vl53l0x.h,然后调用其中的函数就可以实现vl53l0x的测量了。vl53l0x.h中主要包含这四个函数:

// 初始化,包含硬件复位,芯片初次IIC通讯和设备验证,6步初始化校验,配置模式和时间。
void vl53l0x_init(void);
// 开始测量
void vl53l0x_start(void);
// 停止测量
void vl53l0x_stop(void);
// 获取测量距离,单位mm
unsigned short get_distance(void);

main函数中调用这四个函数即可实现功能,注意 配置vl53l0x初始化vl53l0x_init ,在初始化之前最好不要开中断(上面定时器中断什么的),可能会扰乱IIC通讯
因为这个初始化过程包含了IIC通讯过程,另外如果初始化成功了后面基本没问题(会有对应的输出),如果失败了那么会卡在这里,因为里面有个死循环。其他的配置可以进去vl53l0x.c在相应的函数实现中直接修改,代码有详细注释。

初始化后,调用vl53l0x_start开始测量,相当于启动按钮,这默认的模式是连续测量,一次时间66ms,vl53l0x.c中可以修改,这时候设备就会不断测量并将结果保存,你需要读取结果时调用get_distance即可得到测量结果,单位为mm。注意这里要开启了测量,因为里面有检查设备是否完成测量的循环,如果没有完成测量就会卡在循环那里,所以确保调用get_distance前,调用了vl53l0x_start。如果你想停止测量,因为是连续测量模式,可以调用vl53l0x_stop。

main.c使用样例

#include "vl53l0x.h" 
//其他相关头文件
unsigned short s_distance;
void main(){
//	注意需要先进行三个IO口的初始化
//	io_config_init();
// 	当然如果你用中断的方式,就是四个,还有一个外部中断IO口 vl53l0x_init();
//	time_start() ;定时器中断什么的最好在之后开启。vl53l0x_start() ;
//	这里就可以开启测量了,毕竟测量是芯片在做并不消耗mcu资源,
//	当然如果从功率的角度就另说 ,自行在地方调用 while(1){
//		主循环s_distance = get_distance() ;//这是轮询的方式获取测量结果 
//		printf("ranging result s_distance = %d\r\n",s_distance) ;//当然如果是中断的方式就是另外的实现了,但是要记得清除芯片中断标识 //vl53l0x.c的注释中有提到		}
}

总结

最后总结下流程:

1.下载 源码

2.将my_vl53l0x文件夹导入工程

3.修改vl53l0x_iic.h文件中的函数

4.main.c导入vl53l0x.h,参照样例调用函数,实现测量。

如何,还是很简单,很方便的吧,如果觉得还不错,点赞关注支持一下吧,哈哈~

另外附上vl53l0x.c文件源码


#include "vl53l0x.h"
#include "vl53l0x_iic.h"
#include "vl53l0x_api.h"#define CUSTOM_DEV_IIC_ADDDR  (VL53L0X_IIC_ADDR)               /*自定义IICַ地址*/
#define DEMO_DEVICE_MODE    VL53L0X_DEVICEMODE_CONTINUOUS_RANGING   /* 连续测量模式 */
#define DEMO_BUDGET_TIME    (66*1000)                               /* 测量时间 *//* VL53L0X设备结构体 */
static VL53L0X_Dev_t demo_dev = {.I2cDevAddr = VL53L0X_IIC_ADDR,                              /* 上电默认IIC通讯地址ַ*/
};static void device_detect(VL53L0X_DEV dev, uint8_t iic_addr)
{uint16_t module_id = 0;VL53L0X_Error status;/*** 获取设备ID,身份鉴别* 另外可以相当于一次通讯验证,IIC是否可以正常通讯* */status = VL53L0X_RdWord(dev, VL53L0X_REG_IDENTIFICATION_MODEL_ID, &module_id);// DBG_PRINTF("ATK-MS53L0 ID: %d,status: %d\r\n",module_id,status);if (module_id != VL53L0X_MODULE_ID){print_log("ATK-MS53L0 Detect Failed!\r\n");while (1){// 如果通讯失败,就会卡在这个死循环中。}}   /*** 改变IIC设备地址* 如果你想改变IIC设备地址,有多个设备使用时,可用此API* 上电默认的地址是0x29,可以自己设置IIC地址   */if (iic_addr != dev->I2cDevAddr){VL53L0X_SetDeviceAddress(dev, iic_addr << 1);dev->I2cDevAddr = iic_addr;print_log("Change IIC address success! IIC Address: 0x%x\r\n",iic_addr);}else{print_log("Default IIC Address: 0x%x\r\n",iic_addr);}   
}/*** 设备配置:效准和初始化* 根据手册在测量前有一系列初始化和效准过程,保证测量精度*/
static void device_init(VL53L0X_DEV dev)
{uint8_t vhvsettings;uint8_t phasecal;uint32_t refspadcount;uint8_t isaperturespads;// 设备初始化 VL53L0X_DataInit(dev);// 加载特殊配置VL53L0X_StaticInit(dev);// Spad(单光子雪崩二极管)效准,用来对返射会的IR光进行测量的VL53L0X_PerformRefSpadManagement(dev, &refspadcount, &isaperturespads);/*温度效准*/// VL53L0X_PerformRefCalibration(dev, &vhvsettings, &phasecal);   /*偏移效准*/// VL53L0X_PerformOffsetCalibration();/*串扰效准*/// VL53L0X_PerformXTalkCalibration();/**设置工作模式* 有三种工作模式* 单次测量         0* 连续测量         1* 连续延时测量     3*/VL53L0X_SetDeviceMode(dev, DEMO_DEVICE_MODE);/**设置测量时间* 默认时间是33ms,最小的时间是20ms* 这个会涉及到准确率,太快,准确率会有所下降* 增加测量时间会提高准确率* 测量时间增加到2倍,测量的标准差减少到根号2*/VL53L0X_SetMeasurementTimingBudgetMicroSeconds(dev, DEMO_BUDGET_TIME);
}/***/
void vl53l0x_init(void)
{uint8_t ret;VL53L0X_RangingMeasurementData_t data;vl53l0x_hw_reset();                           //使能,设置 XSHUT引脚为高电平(低电平表示关闭)device_detect(&demo_dev, CUSTOM_DEV_IIC_ADDDR);  /*首次通讯验证和设备验证*/device_init(&demo_dev);                      /*设备初始化-会设置测试时间(精确相关)和设备工作模式*/print_log("VL53L0X init Succedded!\r\n");// /*开始测量*/// VL53L0X_StartMeasurement(&demo_dev);// while (1)// {//     /*检查是否完成一次测量*///     do {//         VL53L0X_GetMeasurementDataReady(&demo_dev, &ret);//     } while (ret != 1);       //     /**清除中断//      * 如果使用中断的方式,通过连接中断引脚进行判断,进入中断后需要清除中断//      * 这里使用的是轮询的方式,所以可以不需要//     *///     // VL53L0X_ClearInterruptMask(&demo_dev, 0);//     /*获取测量结果*///     VL53L0X_GetRangingMeasurementData(&demo_dev, &data);//     /*输出测量结果(单位mm)*///     DBG_PRINTF("Distance: %dmm\r\n", data.RangeMilliMeter);// }
}
// 开始测量
void vl53l0x_start(void){/*开始测量*/VL53L0X_StartMeasurement(&demo_dev);print_log("VL53L0X start ranging!\r\n");
}
// 停止测量---连续测量模式下
void vl53l0x_stop(void){/*开始测量*/VL53L0X_StopMeasurement(&demo_dev);print_log("VL53L0X stop ranging!\r\n");
}
// 获取测量结果 单位mm
unsigned short get_distance(void){uint8_t ret;VL53L0X_RangingMeasurementData_t data;/*检查是否完成一次测量*/do {VL53L0X_GetMeasurementDataReady(&demo_dev, &ret);} while (ret != 1);/*获取测量结果*/VL53L0X_GetRangingMeasurementData(&demo_dev, &data);return data.RangeMilliMeter;
} 

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

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

相关文章

Yolov10训练的餐盘菜品目标检测软件(包含源码及数据集)

本文摘要 摘要&#xff1a;本文主要使用YOLOV10深度学习框架自训练了一个“餐盘菜品目标检测模型”&#xff0c;基于此模型使用PYQT5实现了一款界面软件用于功能演示。让您可以更好的了解和学习&#xff0c;该软件支持图片、视频以及摄像头进行目标检测&#xff0c;本系统所涉…

【python】OpenCV—Fun Mirrors

文章目录 1、准备工作2、原理介绍3、代码实现4、效果展示5、参考 1、准备工作 pip install vacm2、原理介绍 在OpenCV中&#xff0c;VCAM 库是一个用于简化创建三维曲面、定义虚拟摄像机、设置参数以及进行投影任务的工具。它特别适用于实现如哈哈镜等图像变形效果。 一、VC…

AI自动生成PPT哪个软件好?智能生成PPT不再熬夜做课件

大概这世上&#xff0c;都是职场牛马对“PPT”这三个字母的头痛反应最大吧&#xff01; 是的&#xff0c;就连各个年级段的老师也是很头痛——愁着怎样能在排版整齐的情况下&#xff0c;将必考知识点都呈现在PPT每一张幻灯片页面里...... 近期打听到用人工智能生成ppt课件&am…

React 项目热更新失效问题的解决方案和产生的原因

背景和意义 在修复React项目热更新失效的问题时&#xff0c;经过一系列问题排查和依赖升级&#xff0c;最终成功修复了问题并为后续开发规避了类似的问题。 依赖升级 Vite版本升级 原React项目Vite版本升级到^4.4.5 Vite 4 在构建和开发服务器的性能上进行了优化&#xff…

R01 vue+springboot 高考志愿推荐AI问答大数据平台

可以查看本文系统对应的视频讲解&#xff1a; vuespringboot 高考推荐AI问答志愿推荐大数据 R01 带增删改查、大屏、支持爬虫 1 系统背景 近年来&#xff0c;高考作为中国教育体系中最重要的考试之一&#xff0c;承载了无数考生和家庭的梦想。随着信息技术的迅猛发展&#xff…

直击工博会|可靠的数据传输与洞察,助力工业设备实现灵活互联

2024 年 9 月 24 日&#xff0c;第 25 届中国国际工业博览会在国家会展中心&#xff08;上海&#xff09;隆重开幕。今年&#xff0c;HMS 工业网络再度强势出击&#xff0c;携多款创新解决方案亮相于 6.1H-B112 展位。特别值得一提的是&#xff0c;HMS 旗下的红狮控制&#xff…

UDP/TCP协议详解

目录 一,自定义应用层协议: 1)xml 2),JSON 3),yml 4),google protobuffer 二,传输层UDP/TCP: UDP协议: TCP协议: TCP的核心机制一:确认应答 TCP核心机制二:超时重传 TCP核心机制三:连接管理 TCP核心机制四:滑动窗口 TCP核心机制五:流量控制 TCP核心机制六:拥塞控制…

HT6881 4.7W防削顶单声道音频功率放大器

1 特性 ● 防削顶失真功能(Anti-Clipping Function,ACF) ● AB类/D类切换 ● 优异的全带宽EMI抑制性能 ● 免滤波器数字调制&#xff0c;直接驱动扬声器 ● 输出功率 1.4W (VDD3.6V, RL4Ω, THDN10%, Class D) 2.8W(VDD5.0V,RL4Ω, THDN10%, ClassD) 4.7W(VDD6.5V,RL4Ω, THDN…

Maven--简略

简介 Apache旗下的一款开源项目&#xff0c;用来进行项目构建&#xff0c;帮助开发者管理项目中的jar及jar包之间的依赖&#xff0c;还拥有项目编译、测试、打包的功能。 管理方式 统一建立一个jar仓库&#xff0c;把jar上传至统一的仓库&#xff0c;使用时&#xff0c;配置…

期货外盘行情源7个市场CTP推送式服务说明

在期货交易领域&#xff0c;及时、准确的市场行情信息是投资者做出决策的重要依据。为了满足广大期货投资者对国际期货市场信息的迫切需求&#xff0c;我们特别推出了“期货外盘行情源2千每月7个市场CTP推送式”服务。本服务旨在通过高效、稳定的技术手段&#xff0c;为投资者提…

基于SpringBoot设计模式之结构型设计模式·桥接模式

文章目录 介绍开始架构图定义类的功能定义类的实现 测试样例 总结 介绍 将抽象部分与它的实现部分分离&#xff0c;使他们都可以独立地发生变化。 Bridge的意思是桥梁。就像在现实世界中&#xff0c;桥梁的功能是将河流的两侧连接起来一样, Bridge模式的作用也是将两样东西连接…

鸿蒙网络编程系列3-TCP客户端通讯示例

1. TCP简介 TCP协议是传输层最重要的协议&#xff0c;提供了可靠、有序的数据传输&#xff0c;是多个广泛使用的表示层协议的运行基础&#xff0c;相对于UDP来说&#xff0c;TCP需要经过三次握手后才能建立连接&#xff0c;建立连接后才能进行数据传输&#xff0c;所以效率差了…

Go_Parser部署、使用与原理分析

文章目录 前言1、概述2、安装与使用2.1、源码安装2.1.1、部署系统依赖组件2.1.1.1、部署IDA Pro 7.5 SP32.1.1.2、部署Python 3.9.132.1.1.3、部署Go 1.13.1 2.1.2、使用源码安装系统 2.2、使用方法2.2.1、准备测试程序2.2.2、创建IDA Pro项目2.2.3、使用Go_Parser解析二进制程…

植物大战僵尸杂交版游戏分享

植物大战僵尸杂交版游戏下载&#xff1a;夸克网盘分享 无捆绑之类的隐形消费&#xff0c;下载即玩

电力调度控制中心在电力系统中的作用

在庞大而复杂的电力系统中&#xff0c;电力调度控制中心犹如一颗智慧的心脏&#xff0c;扮演着不可或缺的角色。它不仅是电力输送与分配的指挥官&#xff0c;更是确保电网安全、稳定、高效运行的守护者。关于电力调度控制中心在电力系统中的作用&#xff0c;我们具体了解一下。…

全新子比主题7.9.2开心版 子比主题最新版源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 wordpress zibll子比主题7.9.2开心版 修复评论弹授权 可做付费下载站 含wordpress搭建视频教程zibll子比主题安装视频教程支付配置视频教程&#xff0c;视频都是语音讲解&#xff0c;…

AI产品经理:从入门到精通,一篇文章带你入门!(附学习资料)

一、AI产品经理工作全流程概览 AI产品经理工作全流程中与普通产品经理的区别主要是多了算法模型部分&#xff0c;包括模型预研、数据准备、模型构建、模型宣讲、模型验收&#xff0c;协作的对象相对普通产品经理也多了算法工程师。 二、需求定义 需求定义主要要定义清楚以下几…

Ubuntu系衍生版手动修改配置网卡的配置总结

一、Ubuntu系的IP地址配置文件的目录&#xff1a; sudo vim /etc/network/interfaces 二、以DHCP方式配置网卡&#xff1a; 在以上配置文件中添加以下两行&#xff1a; auto enp3s0 iface enp3s0 inet dhcp 三、为网卡配置静态IP地址&#xff1a; 在以上配置文件中添…

探索迷宫的奥秘:用 C++ 打造你的迷宫游戏之旅!

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

面试官:重量级锁的8连问,你能接住几个?

前言 接上一篇偏向锁的十连问&#xff0c;继续升级到重量级锁的进阶版&#xff0c;检验一下自己离精通重量级锁还有多远。建议在读之前了解下Java中重量级锁的实现原理。 重量级锁的ObjectMonitor和JUC中的AQS有什么异同 为什么ObjectMonitor需要cxq和entryList两个等待队列 …