基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

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

概述

VL6180X是基于ST FlightSense™专利技术的最新产品。作为一项突破性技术,它实现了独立于目标反射率的绝对距离测量。传统的测量方法通过测量反射光的光量来估算距离,然而这种方法存在一个主要缺点,即被测物体的颜色和表面特性对测量精度产生很大影响。VL6180X采用了一种全新的方法,它精确测量了光线从传感器照射到最近物体,并在反射回传感器所需的时间(即飞行时间),从而准确计算出两者之间的距离。

在这里插入图片描述

VL6180X模块集成了一个红外发射器、一个红外传感器和一个环境光传感器,全部封装在一个便于集成的三合一回流焊封装中。这种设计使终端产品制造商能够减少光学和机械设计的优化过程,并降低相关成本。 该模块具备低功耗操作的特点。测距和环境光感应(ALS)测量可以在用户定义的时间间隔内自动执行。此外,它支持多种门限和中断方案,以最大程度地减少主机操作的需要。 主机控制和结果读取是通过I2C接口实现的,方便快捷。此外,VL6180X还提供两个可编程的GPIO引脚,用于可选的附加功能,例如测量准备和门限中断。 通过以上的优化和扩写,文案更加详细地描述了VL6180X模块的工作原理、集成设计的优势以及支持的功能和接口。这些信息可以帮助读者更好地了解该模块的特性和应用价值。 最近在弄ST和瑞萨RA的课程,需要样片的可以加群申请:6_15061293 。

在这里插入图片描述

视频教程

[https://www.bilibili.com/video/BV1tX4y1q7Zj/]

样品申请

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

完整代码下载

[https://download.csdn.net/download/qq_24312945/87945855]

所有功能

  • 三合一智能光学模块

    • 接近传感器

    • 环境光传感器

    • VCSEL光源

  • 快速,精确测距

    • 绝对测量范围从0到超过10 cm(10cm以上的测距取决于具体情况)

    • 不受目标反射率影响

    • 环境光抑制

    • 盖片的串扰补偿

  • 盖片的串扰补偿

    • 主机系统可以用距离和信号电平实现手势识别

    • 可用演示系统:P-NUCLEO-6180X1 评估板

  • 环境光传感器

    • 高动态范围

    • 精确/超低光敏感

    • 校准输出值(以勒克斯为单位)

  • 方便集成

    • 单回流焊元件

    • 无附加光学元件

    • 单电源

    • 用于器件控制和数据的I2C接口

    • 提供一个文档化的C可移植 API(应用程序接口)

  • 两个可编程GPIO

    • 测距和ALS的窗口和门限功能

在这里插入图片描述

技术规范

该模块的供电要求为2.8V,适合于低电压应用场景。它通过I2C接口进行主机控制和数据通信,方便与其他设备的集成。支持最大快速模式速率,达到400k,确保高效的数据传输。 此外,VL6180X模块具备出色的光照强度检测能力,覆盖了广泛的光照强度范围。从微弱的1 Lux到高达100 kLux的光照强度,该模块能够准确测量环境的光照水平。这使得它在需要实时监测光照条件的应用中非常有用,例如室内照明控制、自动调节显示亮度等。 最后,VL6180X模块具有一个默认地址为0x29的设备地址,这样在多个I2C设备共享同一总线时,可以轻松管理和区分不同的模块。

在这里插入图片描述

接口

vl6180模块接口的示意图如下所示。

在这里插入图片描述

接口说明

在这里插入图片描述

最小系统图

在这里插入图片描述

生成STM32CUBEMX

用STM32CUBEMX生成例程,这里使用MCU为STM32G030C8。 配置时钟树,配置时钟为64M。

在这里插入图片描述

串口配置

查看原理图,PA9和PA10设置为开发板的串口。

在这里插入图片描述

配置串口。

在这里插入图片描述

IIC配置

在这个应用中,VL6180模块通过I2C(IIC)接口与主控器通信。具体来说,VL6180模块的I2C引脚连接到主控器的PB6(引脚B6)和PB7(引脚B7)两个IO口。 这种连接方式确保了模块与主控器之间的可靠数据传输和通信。PB6作为I2C总线的串行数据线(SDA),负责数据的传输和接收。而PB7则充当I2C总线的串行时钟线(SCL),用于同步数据传输的时序。

在这里插入图片描述

配置IIC为快速模式,速度为400k。

在这里插入图片描述

串口重定向

打开魔术棒,勾选MicroLIB

在这里插入图片描述

在main.c中,添加头文件,若不添加会出现 identifier 'FILE' is undefined报错。

/* USER CODE BEGIN Includes */

#include 'stdio.h'

/* USER CODE END Includes */

函数声明和串口重定向:


/* USER CODE BEGIN PFP */

int fputc(int ch, FILE *f){

    HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);

    return ch;

}

/* USER CODE END PFP */


模块片选

根据提供的表格信息,我们可以得知VL6180模块的GPIO0/CE引脚用作片选脚(Chip Enable),在需要使用该功能时,需要给该引脚一个高电平信号。 确保在使用GPIO0/CE引脚时,正确设置引脚的电平状态,并按照VL6180模块的规格和要求进行相应的配置和操作。这将确保模块按照预期工作,并满足特定的功能需求。

在这里插入图片描述

下面为模块启动时序图。

在这里插入图片描述

模块地址

VL6180模块的默认设备地址为0x29。设备地址是用来识别和通信特定设备的标识符。通过将VL6180模块的设备地址设置为0x29,您可以确保与该模块进行正常的通信和控制。

在这里插入图片描述

虽然VL6180模块的默认设备地址为0x29,但可以通过使用I2C_SLAVE__DEVICE_ADDRESS {0x212}来修改模块的设备地址。 通过修改设备地址,可以为VL6180模块指定一个与默认地址不同的唯一地址。这种灵活性使您能够在同一I2C总线上连接多个VL6180X模块或与其他设备进行通信,而无需担心地址冲突的问题。

在这里插入图片描述

读写位

在I2C总线上,由于可能连接多个设备,主设备在传输有效数据之前需要指定从设备的地址。大多数从设备使用7位地址,而一些设备支持10位地址寻址。主设备在需要发送或接收数据时,首先发送所需从设备的地址,并匹配总线上挂载的从设备的地址。然后,主设备可以将数据发送到SDA数据线上。 紧随地址的第8位是数据方向位(R/W),其中'0'表示发送(写入),'1'表示请求数据(读取)。 对于VL6180模块,默认的7位地址是0x29(二进制为010 1001),加上写位后为0x52(二进制为0101 0010),加上读位后为0x53(二进制为0101 0011)。 这意味着当主设备与VL6180模块进行通信时,要发送0x52地址字节进行写操作,或发送0x53地址字节进行读取操作。

在这里插入图片描述

extern I2C_HandleTypeDef hi2c1;


void VL6180X_WriteByte(uint8_t add,uint16_t reg,uint8_t data)

{

    HAL_I2C_Mem_Write(&hi2c1 ,(add< < 1)|0,reg,I2C_MEMADD_SIZE_16BIT,&data,1,0xffff);


}

void VL6180X_WriteByte_16Bit(uint8_t add,uint16_t reg,uint16_t data)

{

    uint8_t data2[2]={0,0};

    data2[0]=data > >8;

    data2[1]=data;

    HAL_I2C_Mem_Write(&hi2c1 ,(add< < 1)|0,reg,I2C_MEMADD_SIZE_16BIT,data2,2,0xffff);


}


uint8_t VL6180X_ReadByte(uint8_t add,uint16_t reg)

{

    uint8_t data=0;

    HAL_I2C_Mem_Read(&hi2c1 ,(add< < 1)|1,reg,I2C_MEMADD_SIZE_16BIT,&data,1,0xffff);

    return data;

}



uint16_t VL6180X_ReadBytee_16Bit(uint8_t add,uint16_t reg)

{

    uint16_t data=0;

    uint8_t data2[2];

    HAL_I2C_Mem_Read(&hi2c1 ,(add< < 1)|1,reg,I2C_MEMADD_SIZE_16BIT,data2,2,0xffff);

    data=data2[0];

    data=data< < 8;

    data+=data2[1];


    return data;




}

模块寄存器

对于VL6180,模块寄存器的地址是16位的,不是8位的。VL6180模块使用16位的寄存器地址来访问和配置各种功能和参数。这种扩展的地址空间提供了更大的灵活性和更多的寄存器选项,以满足不同的应用需求。 在与VL6180模块进行通信时,主设备需要发送16位的寄存器地址,以指定所需的操作和寄存器位置。这样可以确保主设备与模块之间的正确数据交换和通信。

在这里插入图片描述

所以对于vl6180模块,读写代码如下所示。

void VL6180X_WriteByte(uint8_t add,uint16_t reg,uint8_t data)

{

    HAL_I2C_Mem_Write(&hi2c1 ,(add< < 1)|0,reg,I2C_MEMADD_SIZE_16BIT,&data,1,0xffff);


}

void VL6180X_WriteByte_16Bit(uint8_t add,uint16_t reg,uint16_t data)

{

    uint8_t data2[2]={0,0};

    data2[0]=data > >8;

    data2[1]=data;

    HAL_I2C_Mem_Write(&hi2c1 ,(add< < 1)|0,reg,I2C_MEMADD_SIZE_16BIT,data2,2,0xffff);


}



uint8_t VL6180X_ReadByte(uint8_t add,uint16_t reg)

{

    uint8_t data=0;

    HAL_I2C_Mem_Read(&hi2c1 ,(add< < 1)|1,reg,I2C_MEMADD_SIZE_16BIT,&data,1,0xffff);

    return data;

}





uint16_t VL6180X_ReadBytee_16Bit(uint8_t add,uint16_t reg)

{

    uint16_t data=0;

    uint8_t data2[2];

    HAL_I2C_Mem_Read(&hi2c1 ,(add< < 1)|1,reg,I2C_MEMADD_SIZE_16BIT,data2,2,0xffff);

    data=data2[0];

    data=data< < 8;

    data+=data2[1];


    return data;




}


初始化

在这里插入图片描述

首先需要检查寄存器SYSTEM__FRESH_OUT_OF_RESET {0x16}是否为0x01.

在这里插入图片描述

可以通过读取SYSTEM__FRESH_OUT_OF_RESET {0x16}进行判断设备是否准备好,之后进行6180初始化。 初始化如下所示。

在这里插入图片描述

在这里插入图片描述

uint8_t ptp_offset;

uint8_t VL6180X_Init(uint8_t add)

{

    ptp_offset=VL6180X_ReadByte(add,VL6180X_REG_SYSTEM_FRESH_OUT_OF_RESET);

    printf('ptp_offset=%dn',ptp_offset);

//    if(VL6180X_Read_ID(add) == VL6180X_DEFAULT_ID)

    if(ptp_offset==0x01)

    {    

        VL6180X_WriteByte(add,0x0207, 0x01);

        VL6180X_WriteByte(add,0x0208, 0x01);

        VL6180X_WriteByte(add,0x0096, 0x00);

        VL6180X_WriteByte(add,0x0097, 0xfd);

        VL6180X_WriteByte(add,0x00e3, 0x00);

        VL6180X_WriteByte(add,0x00e4, 0x04);

        VL6180X_WriteByte(add,0x00e5, 0x02);

        VL6180X_WriteByte(add,0x00e6, 0x01);

        VL6180X_WriteByte(add,0x00e7, 0x03);

        VL6180X_WriteByte(add,0x00f5, 0x02);

        VL6180X_WriteByte(add,0x00d9, 0x05);

        VL6180X_WriteByte(add,0x00db, 0xce);

        VL6180X_WriteByte(add,0x00dc, 0x03);

        VL6180X_WriteByte(add,0x00dd, 0xf8);

        VL6180X_WriteByte(add,0x009f, 0x00);

        VL6180X_WriteByte(add,0x00a3, 0x3c);

        VL6180X_WriteByte(add,0x00b7, 0x00);

        VL6180X_WriteByte(add,0x00bb, 0x3c);

        VL6180X_WriteByte(add,0x00b2, 0x09);

        VL6180X_WriteByte(add,0x00ca, 0x09);

        VL6180X_WriteByte(add,0x0198, 0x01);

        VL6180X_WriteByte(add,0x01b0, 0x17);

        VL6180X_WriteByte(add,0x01ad, 0x00);

        VL6180X_WriteByte(add,0x00ff, 0x05);

        VL6180X_WriteByte(add,0x0100, 0x05);

        VL6180X_WriteByte(add,0x0199, 0x05);

        VL6180X_WriteByte(add,0x01a6, 0x1b);

        VL6180X_WriteByte(add,0x01ac, 0x3e);

        VL6180X_WriteByte(add,0x01a7, 0x1f);

        VL6180X_WriteByte(add,0x0030, 0x00);


        // Recommended : Public registers - See data sheet for more detail

        VL6180X_WriteByte(add,0x0011, 0x10);       // Enables polling for 'New Sample ready'

                                    // when measurement completes

        VL6180X_WriteByte(add,0x010a, 0x30);       // Set the averaging sample period

                                    // (compromise between lower noise and

                                    // increased execution time)

        VL6180X_WriteByte(add,0x003f, 0x46);       // Sets the light and dark gain (upper

                                    // nibble). Dark gain should not be

                                    // changed. !上半字节要写入0x4    默认增益是1.0

        VL6180X_WriteByte(add,0x0031, 0xFF);       // sets the # of range measurements after

                                    // which auto calibration of system is

                                    // performed

        VL6180X_WriteByte(add,0x0041, 0x63);       // Set ALS integration time to 100ms

        VL6180X_WriteByte(add,0x002e, 0x01);       // perform a single temperature calibration

                                    // of the ranging sensor


        // Optional: Public registers - See data sheet for more detail

        VL6180X_WriteByte(add,0x001b, 0x09);    //测量间隔    轮询模式

                                    // period to 100ms    每步10ms- >0-10ms

        VL6180X_WriteByte(add,0x003e, 0x31);      //测量周期    ALS模式

                                    // to 500ms        

[1] [2]
关键字:STM32CUBEMX  VL6180X 引用地址:基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(1)----单模块距离获取的最佳实践

上一篇:基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(5)----驱动多个VL6180X
下一篇:STM32CUBEMX开发GD32F303(16)----移植兆易创新SPI Nor Flash之GD25Q64Flash

推荐阅读最新更新时间:2024-11-12 23:39

STM32CubeMX GPIO模拟I2C读写M24C64
一、先了解一下硬件的连接,I2C_SDA和I2C_SCL分别接STM32的PB9、PB6 二、粗阅一下M24C64的数据手册,得知器件地址和存储器地址,器件地址是8bit,而存储器地址是16bit 三、下面是M24C64的写时序 四、下面是M24C64的读时序 五、下面是程序编写流程 六、看看时序参数 七、好啦!需要的知识点差不多都提到了开始搬砖 1、用STM32CubeMX配置生成工程,并打开工程。(具体怎么用这个软件这里不讲) 2、在我的工程里是这样配置的 《1》配置USART3,用打印读出来的数据与写入的是否一致 《2》配置PB6、PB9为开漏输出模式,配置如下: void MX_GPIO_Init(void)
[单片机]
<font color='red'>STM32CubeMX</font> GPIO模拟I2C读写M24C64
STM32Cubemx编程及Jlink下载
1.stm32cubemx安装 STM32CubeMX是 ST 意法半导体 近几年来大力推荐STM32 芯片图形化配置工具。它是一个单独的软件,直接安装到一个目录下即可。 2.开发环境搭建 安装Java,然后打开软件:help-updater Settings,这里是指定cube包的目录,可以在st官网上面下载cube包,在stm32cubemx的同一级目录下面建立repository,里面放入cube包,目录直接指到repository就行。 3.建立工程 新建工程,选择芯片后双击,此时会出现芯片的引脚图,首先对RCC进行配置-外部时钟,然后将clock configuration中的时钟图里面的进行填写。
[单片机]
<font color='red'>STM32Cubemx</font>编程及Jlink下载
STM32CubeMX中FreeRTOS系统CPU使用率监测测试
1.测试描述: 使用STM32CubeMX自动配置的工程,对其提供的FreeRTOS系统的CPU使用率进行监测,并通过串口打印。 2.测试环境: (1)软件环境:STM32CubeMX-4.22.0,IAR-7.5,串口调试工具 (2)硬件环境:原子战舰V3开发板 3.测试准备: (1)STM32CubeMX软件主要配置: 管脚和其他外设的配置直接省略了,具体的可查看源码文件里的ioc文件。下面贴出主要的系统方面配置图: 首先是Configuration界面,从图中可以看出测试工程使用的东西并不多; 点击中间层的FREERTOS进入系统配置界面,主要注意下图中红色标注的部分;
[单片机]
<font color='red'>STM32CubeMX</font>中FreeRTOS系统CPU使用率监测测试
STM32CUBEMX】 I2C Slave 实现
#背景 最近,在使用 STM32F030C8T6 做 I2C Slave 设备接口。在网上查了好多的资料,使用 STM32 硬件 I2C 的例程少之又少,对 STM32 硬件 I2C 的批判巨多,只能硬着头皮,自己一步一步摸索。 实际上,在这次硬件 I2C 调试之前,其实我已经通过 IO 模拟的方式实现了 I2C,但速率仅能实现 Standard-mode(up to 100 kbit/s)。对于 Fast-mode(up to 400 kbit/s),IO 模拟方式简直是无能为力。同时,由于 IO 模拟 I2C 时并没有充分的考虑架构,最终的实现结果是功能单一,客户满意度不好。 #I2C 实现方式 经过多次纠结和考虑,我决定采用
[单片机]
【<font color='red'>STM32CUBEMX</font>】 I2C Slave 实现
STM32CubeMX系列教程04_STM32CubeMX各窗口界面描述
一、写在前面 上一篇文章让你入门STM32CubeMX,你可能还是会觉得心里摸不到底。本文就从另外一个角度带你了解STM32CubeMX。 本文讲述STM32CubeMX各主要界面内容,让你对STM32CubeMX这个工具有一个比较直观的认识。 二、主界面 打开STM32CubeMX,呈现的界面大致如下图,界面比较简洁。我把它划分为六大板块。 1.菜单 STM32CubexMX V4版本(前面老版本)有很多功能做在菜单里面,但V5版本优化(删减)菜单,把一些常用功能做在相应界面里面了。 菜单内容后面会单独详细讲述。 2.社交链接 facebook(脸书)、youtube、twitter(推特)以及ST社区、官
[单片机]
<font color='red'>STM32CubeMX</font>系列教程04_STM32CubeMX各窗口界面描述
stm32cubemx配置编码器
首先打开timer2的encoder模式: 配置系统时钟。 配置具体定时器的参数: 选择的encoderMode是 TI1和TI2模式。这种模式下,AB两相的上升沿和下降沿都会计数,所以计数值是实际值的4倍,需要做分频。也就是第一个参数,分频值设为3,实际上是3+1=4分频。 还有个地方需要解释一下,我刚开始的时候就是把这里的设置没搞清楚,看Polarity参数设置的是Rising Edge。这个参数的意思是在检测到上升沿的时候就触发encoder捕获AB相的值,而并不是这里设置的是上升沿就只检测AB相的上升沿,下降沿还是同样会计数的。 Input Filter滤波值是从1-15,看情况设定,是用来滤除一些杂波的。
[单片机]
<font color='red'>stm32cubemx</font>配置编码器
STM32CubeMX系列 | FATFS文件系统
1. FATFS文件系统简介 文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构(即在存储设备上组织文件的方法)。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统;不带文件系统的SD卡仅能实现简单的读写扇区操作,要真正应用SD卡必须要使用文件系统 FATFS文件存储原理(以FAT32为例),下图为FAT32文件系统布局: 簇是文件存储的最小单元,FAT32分区大小与对应簇空间大小关系如下表示: 分区空间大小 簇空间大小 每个簇包含的扇区数 8GB 4KB 8 ; //磁盘是否初始化 Diskio_drvTypeDef *drv ; //磁盘的驱动 uint8_t
[单片机]
【STM32】HAL库 STM32CubeMX教程六----定时器中断
前言: 今天我们来学习定时器,32的定时器有着非常丰富的功能, 输入捕获/输出比较,PWM,中断等等。是我们学习STM32最频繁使用到的外设之一,所以一定要掌握好,这节我们讲解定时器中断,本系列教程将对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1、芯片: STM32F407ZET6/STM32F103ZET6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、STM32F1xx/STM32F4xxHAL库 5 知识概括: 通过本篇博客您将学到: SMT32定时器原理 STM32CubeMX创建定时器例程 HAL库TIM定时器函数库 定时器
[单片机]
【STM32】HAL库 <font color='red'>STM32CubeMX</font>教程六----定时器中断
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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