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

news2024/10/21 18:04:54

目录

    • 前言
    • 资源下载
    • 移植
    • 基本使用
      • 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.coloradmin.cn/o/2220201.html

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

相关文章

LDAP 部署手册

Centos 1. 安装openldap软件 # 安装openldap yum -y install openldap compat-openldap openldap-clients openldap-servers openldap-servers-sql openldap-devel migrationtoolscp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG chown ldap:ldap…

Leetcode 跳跃游戏 二

核心任务是找出从数组的起点跳到终点所需的最小跳跃次数。 这段代码解决的是“跳跃游戏 II”&#xff08;Leetcode第45题&#xff09;&#xff0c;其核心任务是找出从数组的起点跳到终点所需的最小跳跃次数。 class Solution {public int jump(int[] nums) {//首先处理特殊情…

“智驭医疗·未来已来“:医疗保健知识中台的搭建与应用

前言 随着科技的飞速发展&#xff0c;医疗保健领域正在经历深刻的变革。知识中台作为促进医疗行业应用智能化升级的关键底座&#xff0c;正在逐渐成为提高医疗服务质量和效率的重要工具。本文将探讨医疗保健知识中台的内容构成、应用案例以及更新与维护机制。 一、医疗保健知识…

基于ASP.NET的小型超市商品管理系统

文章目录 前言项目介绍技术介绍功能介绍核心代码数据库参考 系统效果图 前言 示 文章底部名片&#xff0c;获取项目的完整演示视频&#xff0c;免费解答技术疑问 项目介绍 小型超市商品管理系统是一款针对小型超市日常运营需求设计的软件解决方案。该系统主要内容有商品类别…

【JS】无法阻止屏幕滚动

监听滚轮事件&#xff0c;阻止默认行为&#xff0c;但未生效&#xff0c;且控制台报错。 window.addEventListener(wheel, (e) > {e.preventDefault(); })这是因为现代浏览器使用 Passive 事件监听器&#xff0c;默认启用了 passive 模式以确保性能&#xff0c;不会调用 pr…

【软件安装与配置】Redis for Windows

1. 下载 Redis Redis 官方没有直接支持 Windows 的安装程序&#xff0c;但可以使用第三方的 Windows 版本。推荐使用 Memurai 或从 Microsoft archive 提供的 Redis for Windows 下载。 2. 安装 Redis 下载适合 Windows 的安装包&#xff0c;本文以Microsoft archive安装包为…

Git_IDEA集成Git

Git_IDEA集成Git 配置 Git 忽略文件 创建忽略规则文件 引用忽略配置文件 定位 Git 程序 初始化本地库 添加到暂存区 提交到本地库 切换版本 创建分支 切换分支 合并分支 解决冲突 配置 Git 忽略文件 创建忽略规则文件 引用忽略配置文件 在 .gitconfig 文件中进行&…

[Git]一文速通

概述 Git是一个分布式版本控制工具&#xff0c;主要用于管理开发过程中的源代码文件(Java类、xml文件、html页面等, )在软件开发过程中被广泛使用 Git的作用 代码回溯版本切换多人协作远程备份 通过Git 仓库来存储和管理代码 文件&#xff0c;Git 仓库分为两种: 本地仓库: 开…

C++和OpenGL实现3D游戏编程【连载15】——着色器初步

&#x1f525;C和OpenGL实现3D游戏编程【目录】 1、本节实现的内容 上一节我们介绍了通过VBO、VAO和EBO怎样将顶点发送到GPU显存&#xff0c;利用GPU与显存之间的高效处理速度&#xff0c;来提高我们的图形渲染效率。那么在此过程中&#xff0c;我们又可以通过着色器&#xff…

webstorm 编辑器配置及配置迁移

1.下载地址 WebStorm&#xff1a;JetBrains 出品的 JavaScript 和 TypeScript IDE 其他版本下载地址 2.安装 点击下一步安装&#xff0c;可根据需要是否删除已有版本 注意&#xff1a; 完成安装后需要激活 3.设置快捷键 以下为个人常用可跳过或根据需要设置 如&#xff1a…

字幕怎么自动生成?教你5种视频加字幕方法

在这个短视频时代&#xff0c;视频内容已成为传播信息、娱乐大众的重要载体。而字幕作为视频不可或缺的一部分&#xff0c;不仅能够提升观众的观看体验&#xff0c;还能跨越语言障碍&#xff0c;让所有观众都能享受视频的魅力。但怎么给视频加上字幕呢&#xff1f;下面给大家分…

vulnhub靶场之JOY

一.环境搭建 1.靶场描述 Does penetration testing spark joy? If it does, this machine is for you. This machine is full of services, full of fun, but how many ways are there to align the stars? Perhaps, just like the child in all of us, we may find joy in …

Java最全面试题->Java基础面试题->JavaSE面试题->异常面试题

异常 下边是我自己整理的面试题&#xff0c;基本已经很全面了&#xff0c;想要的可以私信我&#xff0c;我会不定期去更新思维导图 哪里不会点哪里 1.说一下Java中的异常体系&#xff1f; 2.Error和Exception的区别 Error&#xff1a;系统错误,编译时出现的错误,Exception&…

宝兰德加入华为鸿蒙生态,共谱智能运维新篇章

近日&#xff0c;华为HarmonyOS NEXT系统&#xff08;又称“纯血鸿蒙”&#xff09;正式开启公测&#xff0c;标志着国产操作系统的发展迈入了新的阶段。作为华为紧密的战略合作伙伴&#xff0c;宝兰德依托其在IT监控运维可观测性领域的技术优势&#xff0c;正式成为华为鸿蒙Ha…

RFC2616 超文本传输协议 HTTP/1.1

一、URL-俗称“网址” HTTP 使用 URL(Uniform Resource Locator&#xff0c;统一资源定位符)来定位资源&#xff0c;它是 URI(Uniform Resource Identifier&#xff0c;统一资源标识符)的子集&#xff0c;URL 在 URI 的基础上增加了定位能力 URI 除了包含 URL&#xff0c;还包…

gitee建立/取消关联仓库

目录 一、常用指令总结 二、建立关联具体操作 三、取消关联具体操作 一、常用指令总结 首先要选中要关联的文件&#xff0c;右击&#xff0c;选择Git Bash Here。 git remote -v //查看自己的文件有几个关联的仓库git init //初始化文件夹为git可远程建立链接的文件夹…

c语言基础程序——经典100道实例。

c语言基础程序——经典100道实例 001&#xff0c; 组无重复数字的数002&#xff0c;企业发放的奖金根据利润提成003&#xff0c;完全平方数004&#xff0c;判断当天是这一年的第几天005&#xff0c;三个数由小到大输出006&#xff0c;输出字母C图案007&#xff0c;特殊图案008&…

前端一键复制解决方案分享

需求背景 用户需要对流水号进行复制使用&#xff0c;前端的展示是通过样式控制&#xff0c;超出省略号表示&#xff0c;鼠标悬浮展示完整流水号。此处的鼠标悬浮展示采用的是:title&#xff0c;这样就无法对文本进行选中。 下面是给出一键复制的不同的解决方案&#xff0c;希望…

1.计算机网络_基本知识

基本知识 计算机网络的类别&#xff1a; 1、按作用范围来分类 2、按网络的使用者来分类 什么是计算机网络&#xff1a; 计算机网络由若干个节点和链接这些节点的链路组成&#xff0c;节点可以是计算机、集线器、交换机、路由器等。互联网络是多个网络通过路由器连接在了一起…

【zookeeper】集群配置

zookeeper 数据结构 zookeeper数据模型结构&#xff0c;就和Linux的文件系统类型&#xff0c;看起来是一颗树&#xff0c;每个节点称为一个znode.每一个Znode默认的存储1MB的数据&#xff0c;每个Znode都有唯一标识&#xff0c;可以通过命令显示节点的信息每当节点有数据变化…