基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(5)----驱动多个VL6180X

发布者:心灵舞者最新更新时间:2024-06-21 来源: elecfans关键字:STM32CUBEMX  VL6180X 手机看文章 扫描二维码
随时随地手机看文章

概述

在本章中,我们将探讨如何同时驱动多个VL6180传感器进行距离测量。我们将介绍如何有效地管理多个传感器之间的通信和控制,以确保它们能够同时进行准确的距离测量。此外,还将扩展我们的教程,展示如何同时驱动多个VL6180X传感器进行距离测量和光强测量。VL6180X传感器在VL6180的基础上增加了光强测量功能,这使得它们能够提供关于环境光强度的有用信息。对于那些需要考虑光照条件的应用场景,这将非常重要。我们将讨论如何使用适当的命令和配置设置,同时利用两个传感器的功能,以获取准确的距离和光强度数据。通过本章的学习,将能够了解如何利用多个VL6180X传感器的优势,为应用程序提供更全面的环境感知能力。
在这里插入图片描述

样品申请

https://www.wjx.top/vm/OhcKxJk.aspx#](https://www.wjx.top/vm/OhcKxJk.aspx#)

视频教程

https://www.bilibili.com/video/BV1mW4y1o7yY/

完整代码下载

https://download.csdn.net/download/qq_24312945/88051751

修改设备地址

在修改设备地址方面,VL6180X传感器使用I²C总线进行通信。默认情况下,每个VL6180X传感器的7位地址为0x29。然而,为了避免地址冲突并允许多个传感器共享相同的I2C总线,用户可以通过向特定寄存器写入自定义的7位地址来修改传感器的地址。
要修改传感器的地址,您需要访问寄存器I2C_SLAVE__DEVICE_ADDRESS,其地址为0x212。通过向该寄存器写入新的7位地址,您可以成功修改传感器的地址。请注意,每个传感器都需要具有唯一的地址,以确保正确的通信和识别。
在这里插入图片描述

需要注意的是,通过修改寄存器I2C_SLAVE__DEVICE_ADDRESS(地址为0x212)来修改VL6180X传感器的地址是一种临时性的设置。每次传感器上电后,地址会恢复为初始值(默认为0x29)。这意味着在每次上电后,需要重新设置传感器的地址,以确保正确的通信和操作。
在这里插入图片描述

首先,打开VL6180.h文件,该文件包含了VL6180X传感器的相关定义和配置。在该文件中,您可以找到定义设备地址的部分,并进行以下方式的地址常量定义:

#define VL6180X_DEFAULT_I2C_ADDR1 0x29  ///< The fixed I2C addres

#define VL6180X_DEFAULT_I2C_ADDR2 0x2A  ///< The fixed I2C addres

#define VL6180X_DEFAULT_I2C_ADDR3 0x2B  ///< The fixed I2C addres

#define VL6180X_DEFAULT_I2C_ADDR4 0x2C  ///< The fixed I2C addres


以上示例展示了四个设备地址常量的定义,分别表示不同的传感器。可以根据您实际使用的传感器数量和配置需求,增加或减少设备地址常量的定义。
在代码中,可以使用这些设备地址常量来指定不同传感器的地址。例如,如果想要使用第一个传感器的地址,可以使用DEVICE_ADDRESS_1来表示该地址。请注意,需要根据实际情况将这些地址常量与传感器的物理连接和配置相对应。确保将正确的地址常量分配给相应的传感器,以确保正确的通信和操作。
在进行地址常量定义时,建议参考VL6180X传感器的数据手册和相关文档,以了解更多关于传感器地址和配置的详细信息。
这里的地址值是根据实际需求和硬件连接情况选择的,确保每个设备具有唯一的地址是非常重要的。通过使用定义的设备地址常量,可以轻松地管理和操作多个VL6180X传感器。通过为每个传感器分配唯一的设备地址常量,可以在代码中使用这些常量来指定与每个传感器对应的地址。这样,可以轻松地区分不同的传感器,并发送适当的命令和配置来与每个传感器进行通信和操作。通过使用定义的设备地址常量,可以轻松管理和操作多个传感器,无需手动跟踪和设置每个传感器的地址。这提供了方便和灵活性,特别适用于需要同时使用多个VL6180X传感器的应用场景。


配置vl6180x

在对应的demo板子中,管脚图如下所示。
在这里插入图片描述
在下面代码中,展示了对多个VL6180X传感器进行初始化和配置的过程。每个传感器通过不同的管脚连接到主板上,并通过控制GPIO引脚的电平来选择对应的传感器进行操作。
以下是对代码的扩展说明:

  1. 首先,通过控制GPIO引脚的电平,将相应的引脚设置为RESET状态,以准备初始化对应的传感器。具体来说,对于每个传感器,通过控制两个GPIO引脚,即片选,将它们设置为RESET状态。

  2. 然后,通过控制GPIO引脚的电平,将相应的引脚设置为SET状态,以选择对应的传感器进行操作。对于每个传感器,通过控制两个GPIO引脚,即片选,将它们设置为SET状态。

  3. 在每次切换传感器之后,添加了一段延时,以确保引脚状态的切换稳定。这段延时的长度可以根据实际需求进行调整。
    对每个传感器执行以下操作:
    a. 初始化传感器,使用VL6180X_Init函数,将传感器的地址作为参数传递。
    b. 通过VL6180X_WriteByte函数,修改传感器的地址,使用VL6180X_DEFAULT_I2C_ADDR1作为源地址,将自定义地址写入0x0212寄存器。
    c. 使用VL6180X_ReadByte函数读取修改后的地址,并进行打印输出,以确认地址修改成功。
    d. 使用VL6180x_UpscaleSetScaling函数设置传感器的缩放因子。
    e. 使用VL6180X_Read_ID函数读取传感器的ID,并进行打印输出,以确认传感器正常工作。
    通过代码,可以初始化和配置多个VL6180X传感器,并根据需要选择不同的传感器进行操作。请注意,以上代码示例仅为参考,您需要根据自己的硬件连接和需求进行相应的修改和调整。确保参考VL6180X传感器的文档和数据手册,以了解更多关于初始化、配置和操作传感器的详细信息。


/* USER CODE BEGIN 2 */

//VL6180_1

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);

//VL6180_3

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);

//VL6180_2

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);

//VL6180_4

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);

uint8_t ii;

uint8_t id;

HAL_Delay(1);


/************修改VL6180_4地址为VL6180X_DEFAULT_I2C_ADDR4(0x2C)*********************/

VL6180X_Init(VL6180X_DEFAULT_I2C_ADDR1);

VL6180X_WriteByte(VL6180X_DEFAULT_I2C_ADDR1,0x0212,VL6180X_DEFAULT_I2C_ADDR4);

// HAL_Delay(100);

ii=VL6180X_ReadByte(VL6180X_DEFAULT_I2C_ADDR4,0x0212);

printf('VL6180_4地址为=0x%Xn',ii);

VL6180x_UpscaleSetScaling(VL6180X_DEFAULT_I2C_ADDR4,3);//缩放x3

id=VL6180X_Read_ID(VL6180X_DEFAULT_I2C_ADDR4);

printf('VL6180_4 id=%dn',id);


/************修改VL6180_3地址为VL6180X_DEFAULT_I2C_ADDR3(0x2B)*********************/

//VL6180_3

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);

HAL_Delay(1);

VL6180X_Init(VL6180X_DEFAULT_I2C_ADDR1);

VL6180X_WriteByte(VL6180X_DEFAULT_I2C_ADDR1,0x0212,VL6180X_DEFAULT_I2C_ADDR3);

ii=VL6180X_ReadByte(VL6180X_DEFAULT_I2C_ADDR3,0x0212);

printf('VL6180_3地址为=0x%Xn',ii);

VL6180x_UpscaleSetScaling(VL6180X_DEFAULT_I2C_ADDR3,3);//缩放x3

id=VL6180X_Read_ID(VL6180X_DEFAULT_I2C_ADDR3);

printf('VL6180_3 id=%dn',id);


/************修改VL6180_2地址为VL6180X_DEFAULT_I2C_ADDR2(0x2A)*********************/

//VL6180_2

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);

HAL_Delay(1);

VL6180X_Init(VL6180X_DEFAULT_I2C_ADDR1);

VL6180X_WriteByte(VL6180X_DEFAULT_I2C_ADDR1,0x0212,VL6180X_DEFAULT_I2C_ADDR2);

// HAL_Delay(100);

ii=VL6180X_ReadByte(VL6180X_DEFAULT_I2C_ADDR2,0x0212);

printf('VL6180_2地址为=0x%Xn',ii);

VL6180x_UpscaleSetScaling(VL6180X_DEFAULT_I2C_ADDR2,3);//缩放x3

id=VL6180X_Read_ID(VL6180X_DEFAULT_I2C_ADDR2);

printf('VL6180_2 id=%dn',id);

/************修改VL6180_1地址为VL6180X_DEFAULT_I2C_ADDR3(0x29)*********************/

//VL6180_1

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);

HAL_Delay(1);

VL6180X_Init(VL6180X_DEFAULT_I2C_ADDR1);

// VL6180X_WriteByte(VL6180X_DEFAULT_I2C_ADDR1,0x0212,VL6180X_DEFAULT_I2C_ADDR1);

ii=VL6180X_ReadByte(VL6180X_DEFAULT_I2C_ADDR1,0x0212);

printf('VL6180_1地址为=0x%Xn',ii);

VL6180x_UpscaleSetScaling(VL6180X_DEFAULT_I2C_ADDR1,3);//缩放x3

id=VL6180X_Read_ID(VL6180X_DEFAULT_I2C_ADDR1);

printf('VL6180_1 id=%dn',id);


  /* USER CODE END 2 */

主程序

在代码中,展示了如何在主程序中循环读取4个VL6180X传感器的数据。以下是代码的扩展说明:


在主程序的while循环中,首先使用VL6180X_Read_Range函数从VL6180X传感器4(设备地址为VL6180X_DEFAULT_I2C_ADDR4)读取距离数据,并将其乘以3(根据缩放因子)以得到准确的距离值。然后,使用printf函数打印输出距离值。

接下来,使用VL6180X_Read_Lux函数从VL6180X传感器3(设备地址为VL6180X_DEFAULT_I2C_ADDR3)读取光强度数据,并使用printf函数打印输出光强度值。请注意,此处使用了指定的增益参数(VL6180X_ALS_GAIN_40),您可以根据实际需求选择适当的增益值。

然后,使用VL6180X_Read_Range函数从VL6180X传感器2(设备地址为VL6180X_DEFAULT_I2C_ADDR2)读取距离数据,并将其乘以3(根据缩放因子)以得到准确的距离值。然后,使用printf函数打印输出距离值。

接下来,使用VL6180X_Read_Lux函数从VL6180X传感器1(设备地址为VL6180X_DEFAULT_I2C_ADDR1)读取光强度数据,并使用printf函数打印输出光强度值。同样地,使用指定的增益参数(VL6180X_ALS_GAIN_40),您可以根据实际需求选择适当的增益值。

最后,在每次循环迭代之间添加适当的延时,例如使用HAL_Delay函数延时1秒。

请注意,代码示例仅为参考,您需要根据您的实际硬件配置、VL6180X库和应用需求进行相应的修改和调整。确保参考VL6180X传感器的文档和数据手册,以了解更多关于数据读取和解析的详细信息。

/* USER CODE BEGIN WHILE */

  while (1)

  {

VL6180_L4=VL6180X_Read_Range(VL6180X_DEFAULT_I2C_ADDR4);

printf('VL6180_L4=%dmmn',VL6180_L4*3);

lux_L3=VL6180X_Read_Lux(VL6180X_DEFAULT_I2C_ADDR3,VL6180X_ALS_GAIN_40);

printf('lux=%lfn',lux_L3);

VL6180_L3=VL6180X_Read_Range(VL6180X_DEFAULT_I2C_ADDR3);

printf('VL6180_L3=%dmmn',VL6180_L3*3);

VL6180_L2=VL6180X_Read_Range(VL6180X_DEFAULT_I2C_ADDR2);

printf('VL6180_L2=%dmmn',VL6180_L2*3);

lux_L1=VL6180X_Read_Lux(VL6180X_DEFAULT_I2C_ADDR1,VL6180X_ALS_GAIN_40);

printf('lux=%lfn',lux_L1);

VL6180_L3=VL6180X_Read_Range(VL6180X_DEFAULT_I2C_ADDR1);

printf('VL6180_L1=%dmmn',VL6180_L1*3);

HAL_Delay(1000);

    /* USER CODE END WHILE */


    /* USER CODE BEGIN 3 */

  }

  /* USER CODE END 3 */


测试结果

测试结果如下所示。
在这里插入图片描述


关键字:STM32CUBEMX  VL6180X 引用地址:基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(5)----驱动多个VL6180X

上一篇:工程师笔记|如何理解 RAMECC FAR 寄存器的值
下一篇:基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

推荐阅读最新更新时间:2026-03-25 11:30

基于STM32CUBEMX驱动TOF模块VL6180VL6180X(2)----修改测量范围
概述 当使用VL6180传感器进行测距时,可以通过修改缩放因子来改变可测量的距离范围。VL6180是一种基于飞行时间原理的传感器,通过测量光信号的往返时间来确定物体与传感器之间的距离。 默认情况下,VL6180传感器的测距范围约为0至200毫米。然而,通过调整缩放因子,您可以扩展或缩小该范围,以适应不同的应用需求。 缩放因子是一个乘法因子,用于调整传感器的测量范围。较小的缩放因子可以扩展测距范围,使传感器能够测量更远的距离,而较大的缩放因子可以缩小测距范围,使传感器适用于更近的测量。 要修改缩放因子,需要使用VL6180传感器的控制接口与其进行通信。通过发送适当的命令和参数,您可以设置所需的缩放因子值。具体的命令和参数取决于
[单片机]
基于<font color='red'>STM32CUBEMX</font>驱动<font color='red'>TOF</font><font color='red'>模块</font><font color='red'>VL6180</font>与<font color='red'>VL6180X</font>(2)----修改测量范围
基于STM32CUBEMX驱动TOF模块VL53l0x(1)----单模块距离获取的最佳实践
概述 VL53L0X是新一代飞行时间(ToF)激光测距模块(不同于传统技术),采用目前市场上最小的封装,无论目标反射率如何,都能提供精确的距离测量。它可以测量2m的绝对距离,为测距性能等级设定了新的基准,为各种新应用打开了大门。 VL53L0X集成了一个领先的SPAD阵列(单光子雪崩二极管),并内嵌ST的第二代FlightSense™专利技术。 VL53L0X的940nm VCSEL发射器(垂直腔面发射激光器)完全不为人眼所见,加上内置的物理红外滤光片,使其测距距离更长,对环境光的免疫性更强,对盖片的光学串扰具有更好的稳定性。 ! 视频教学 样品申请 源码下载 ( 所有功能 ● 完全集成的小型化模块 ○ 940
[单片机]
基于<font color='red'>STM32CUBEMX</font>驱动<font color='red'>TOF</font><font color='red'>模块</font>VL53l0x(1)----单<font color='red'>模块</font>距离获取的最佳实践
多核技术与迈来芯开发出全新人脸识别AI算法模块 使用ToF摄像头
据外媒报道,美国算法与并行计算方案提供商多核技术公司(MulticoreWare)与迈来芯(Melexis)合作开发AI算法,通过使用迈来芯EVK75027 ToF传感器开发出人脸识别算法模块,例如人脸检测、人脸识别、睡意/分心检测和反欺骗检测。 (图片来源:MulticoreWare) 通过使用距离图像来标记精确的面部关键点,多核技术公司增强了内部数据注释工具。通过使用这些信息,该公司创建出一个自定义的带注释的数据集,并用于训练神经网络以进行人脸识别。该系统能够在不同照明设置下准确可靠地运行。 此次合作表明,AI使用ToF摄像头可在大量车内应用领域(例如驾驶员身份验证、睡意检测、驾驶员注意力等)表现出稳健性能。
[汽车电子]
多核技术与迈来芯开发出全新人脸识别AI算法<font color='red'>模块</font> 使用<font color='red'>ToF</font>摄像头
Keil5安装+STM32CubeMX安装+VSCode辅助开发教程
本文介绍STM32相关开发工具的安装,包括: Keil5安装 STM32CubeMX安装 VSCode辅助开发 所有需要使用到的安装包下载链接:通过百度网盘分享的文件:embedded-packge.rar 链接:https://pan.baidu.com/s/1XW72C96-WjeZ6hGhTgJ56A?pwd=4jfh 提取码:4jfh 注意:如果你想用VSCode来辅助Keil5开发,网上有很多教程叫你把原来的软件卸载掉,其实没有必要!!!我们只是把VSCode当作代码编辑器,调试和编译交仍然给keil来完成! 视频教程链接: Keil5安装教程_哔哩哔哩_bilibilihttps://www.bilibil
[单片机]
配置CLion + STM32CubeMX开发环境
0.前言 由于本人对Keil的编译环境不太满意,故在网上搜寻了各种代替方法,最终选定了CLoin的IDE,它可以支持从STM32CubeMX生成的代码直接编译,节省了大量时间去配置初始化代码,以下只作为本人的一次环境搭建的踩坑记录,希望对正在解决问题的你有所帮助。 本次配置参考了如下几位大佬的说明 配置CLion用于STM32开发【优雅の嵌入式开发】 - 哔哩哔哩 (bilibili.com) 使用Clion优雅开发STM32 _哔哩哔哩_bilibili Clion实现Stm32标准库开发 - 哔哩哔哩 (bilibili.com) 网页链接 1.环境所需配置搭建 首先确保已经安装了stlink的驱动,如使用的是
[单片机]
基于STM32CUBEMX驱动低压步进器电机驱动器STSPIN220(3)----定时器中断产生指定数量脉
概述 在步进电机控制过程中,为了实现精确的位置和速度控制,经常需要输出指定数量的脉冲。这就需要使用定时器功能来生成PWM脉冲信号。 本文将详细介绍如何利用STM32CUBEMX配置定时器以输出指定数量的PWM脉冲。 定时器是STM32微控制器的一个重要功能模块,可用于生成各种定时和计数操作。通过合理配置定时器的参数和模式,我们可以实现精确的脉冲输出。 样品申请 https://www.wjx.top/vm/PpC1kRR.aspx 视频教学 https://www.bilibili.com/video/BV1k94y1C7Gw/ 完整代码下载 https://download.csdn.net/download/qq_
[单片机]
STM32CubeMX学习笔记(5)——基本定时器接口使用
一、定时器简介 STM32F1 系列中,除了互联型的产品,共有 8 个定时器,分为基本定时器,通用定时器和高级定时器。 基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部 IO。 通用定时器 TIM2/3/4/5 是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,每个定时器有四个外部 IO。 高级定时器 TIM1/8 是一个 16 位的可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,还可以有三相电机互补输出信号,每个定时器有 8 个外部 IO。 二、新建工程 1. 打开 STM32CubeMX 软件,点击“新建工程” 2.
[单片机]
STM32CubeMX学习笔记(12)——WWDG窗口看门狗使用
一、WWDG简介 看门狗其实就是一个定时器,从功能上说它可以让微控制器在程序发生意外(程序进入死循环或跑飞)的时候,能重新回复到系统刚上电状态,以保障系统出问题的时候可以重启一次。说的复杂一点,看门狗就是能让程序出问题是能重新启动系统。 STM32 有两个看门狗,一个是独立看门狗,一个是窗口看门狗。我们知道独立看门狗的工作原理就是一个递减计数器不断的往下递减计数,当减到 0 之前如果没有喂狗的话,产生复位。窗口看门狗跟独立看门狗一样,也是一个递减计数器不断的往下递减计数,当减到一个固定值 0X40 时还不喂狗的话,产生复位,这个值叫窗口的下限,是固定的值,不能改变。这个是跟独立看门狗类似的地方,不同的地方是窗口看门狗的计数器的值
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved