VL53L8CX TOF开发(1)----驱动TOF进行区域检测

107 篇文章 56 订阅
63 篇文章 3 订阅

概述

VL53L8CX是一款8x8多区域ToF测距传感器,它在环境光下能够在降低功耗的同时增强性能。该传感器基于意法半导体的FlightSense技术设计,能够提供最高400 cm的精确测距,并具有65°对角线视场。
VL53L8CX集成了功能强大的新一代VCSEL,以及两个先进的超表面镜头。硬件封装在创新的“一体化”模块中。这使得它能够适用于更广泛的高性能应用场景,如低功耗系统激活、手势识别、机器人SLAM、液位监控等多种用途。
VL53L8CX采用意法半导体的专利算法,可以检测和跟踪视场内的多个目标,具有64区域深度测量能力。意法半导体的直方图确保盖片玻璃串扰抗扰度超过60 cm。
与所有基于意法半导体FlightSense技术的ToF传感器一样,VL53L8CX能够测量绝对距离,不受目标颜色和反射率的影响。
VL53L8CX支持SPI和I²C接口,确保高频帧率和短启动时间。
VL53L8CX的VCSEL发射940 nm的完全不可见红外光。这种VCSEL具有1级认证,对眼睛是安全的。使用VL53L8CP可以进行场景浏览和多区域检测。这归因于软件可定制的检测阵列。它能快速且低功耗地检测到人体存在。此类检测被称为微深度图。

最近在弄ST的课程,需要样片的可以加群申请:615061293 。

在这里插入图片描述

视频教学

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

VL53L8CX TOF开发(1)----驱动TOF进行区域检测(原稿)

样品申请

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

源码下载

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

主要特点

新一代多区域飞行时间 (ToF) 传感器的功耗较低,提高了距离测距性能

  • 可以使用4x4或8x8独立区域测量功能进行多区域距离测量
  • 自主低功耗模式,通过可编程中断阈值唤醒主机
  • 增强了环境光条件下的性能,测量距离可达400 cm
  • 在每个区域均可进行多目标检测和测距
  • 直方图处理和算法补偿可最大程度减少甚至消除盖片串扰的影响
  • 每个区域都配有运动指示器,用于显示目标是否以及如何移动
  • 60 Hz帧速率能力

完全集成的微型模块,具有宽视野 (FoV)

  • 新一代大功率发射器:940 nm不可见光VCSEL(垂直腔面发射激光器)集成式模拟驱动器
  • 65°对角线方形视场,发射器和接收器采用衍射光学元件 (DOE)
  • 单光子雪崩二极管 (SPAD) 接收阵列
  • 运行固件的低功耗微控制器
  • 尺寸:6.4 x 3.0 x 1.75 mm

可轻松集成

  • 单回流焊元件
  • 需要1.8 V核心电源和3.3 V AVDD电源
  • 可选1.2 V或1.8 V IOVDD接口电压等级
  • I²C(可达1 MHz)或SPI(可达3 MHz)接口
  • 兼容多种盖片材料
  • 可隐藏在深色盖片之后

在这里插入图片描述

硬件准备

首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
在这里插入图片描述

技术规格

在这里插入图片描述

系统框图

在这里插入图片描述

应用示意图

IIC模式下应用示意图。
在这里插入图片描述

SPI模式下应用示意图。

在这里插入图片描述

区域映射

VL53L8CX支持4x4模式的区域映射和8x8模式的区域映射。
下图显示了4x4模式下的区域定义。总共有16个区域,它们沿着一行递增,然后再开始新的一行。物理视图是从设备顶部朝向镜头。如下图所示,每个区域的编号对应于传感器返回的ZoneIDs。

在这里插入图片描述

下图显示了8x8模式下的区域定义。总共有64个区域,它们沿着一行递增,然后再开始新的一行。物理视图是从设备顶部朝向镜头。如下图所示,每个区域的编号对应于传感器返回给主机的ZoneIDs。

在这里插入图片描述

生成STM32CUBEMX

选择MCU

测试版所用的MCU为STM32G431CB。
在这里插入图片描述

串口配置

查看原理图,PA9和PA10设置为开发板的串口。
在这里插入图片描述

配置串口。
在这里插入图片描述

IIC配置

在这个应用中,VL53L8CX模块通过I2C(IIC)接口与主控器通信。具体来说,VL53L8CX模块的I2C引脚连接到主控器的PA8和PB5两个IO口。

在这里插入图片描述

在这里插入图片描述

配置IIC为快速模式,速度为400k。
在这里插入图片描述

LPn 设置

若进行IIC通讯,LPn设置为高电平状态。

在这里插入图片描述
这里对应管脚为PA12。

在这里插入图片描述

配置为PA12。

在这里插入图片描述

X-CUBE-TOF1

本节介绍在不需要使用样例应用时如何使用STM32CubeMX将X-CUBE-TOF1软件包添加到项目中。有了这样的设置,就只配置了驱动层。

在这里插入图片描述

串口重定向

打开魔术棒,勾选MicroLIB在这里插入图片描述

代码配置

在custom_ranging_sensor.c代码中,有IO口驱动VL53L8CX进行复位的代码,由于没有配置对应的IO,所以需要注释掉。

在这里插入图片描述

Tera Term配置

打开Tera Term并使用以下设置进行配置。
在这里插入图片描述
在这里插入图片描述

演示结果

配置完成侯可以在Tera Term下查看结果,如下是4*4的显示。
在这里插入图片描述

可以切换到8*8显示。

在这里插入图片描述

  • 26
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于VL53L1x TOF激光测距模块,可以使用STM32的I2C总线进行控制和通信。下面是基于HAL库的VL53L1x驱动代码: ```c #include "vl53l1x.h" // 初始化VL53L1x模块 VL53L1_Error VL53L1x_Init(VL53L1_Dev_t *dev) { VL53L1_Error status = VL53L1_ERROR_NONE; uint8_t sensor_state = 0; uint32_t refSpadCount; uint8_t isApertureSpads; uint8_t VhvSettings; uint8_t PhaseCal; uint32_t sequence_config_timeout_us; // 打开I2C总线 HAL_I2C_MspInit(dev->I2cHandle); // 软复位 status = VL53L1_software_reset(dev); if (status != VL53L1_ERROR_NONE) { return status; } // 等待传感器初始化完成 while (sensor_state == 0) { status = VL53L1_RdByte(dev, 0x010F, &sensor_state); if (status != VL53L1_ERROR_NONE) { return status; } } // 设备版本号 uint8_t version[3]; status = VL53L1_GetVersion(dev, version); if (status != VL53L1_ERROR_NONE) { return status; } // 设备参数配置 status = VL53L1_DataInit(dev); if (status != VL53L1_ERROR_NONE) { return status; } status = VL53L1_StaticInit(dev); if (status != VL53L1_ERROR_NONE) { return status; } // 设备校准 status = VL53L1_PerformRefSpadManagement(dev, &refSpadCount, &isApertureSpads); if (status != VL53L1_ERROR_NONE) { return status; } status = VL53L1_PerformRefCalibration(dev, &VhvSettings, &PhaseCal); if (status != VL53L1_ERROR_NONE) { return status; } // 设备配置 status = VL53L1_SetXTalkCompensationEnable(dev, 0); if (status != VL53L1_ERROR_NONE) { return status; } status = VL53L1_SetOffsetCalibrationDataMicroMeter(dev, 0); if (status != VL53L1_ERROR_NONE) { return status; } // 设备开始测距 status = VL53L1_SetDistanceMode(dev, VL53L1_DISTANCEMODE_LONG); if (status != VL53L1_ERROR_NONE) { return status; } status = VL53L1_SetMeasurementTimingBudgetMicroSeconds(dev, 50000); if (status != VL53L1_ERROR_NONE) { return status; } sequence_config_timeout_us = (uint32_t)VL53L1_calc_timeout_us(dev, 2000); status = VL53L1_SetSequenceStepTimeout(dev, VL53L1_SEQUENCESTEP_TCC, sequence_config_timeout_us); if (status != VL53L1_ERROR_NONE) { return status; } status = VL53L1_SetSequenceStepTimeout(dev, VL53L1_SEQUENCESTEP_DSS, sequence_config_timeout_us); if (status != VL53L1_ERROR_NONE) { return status; } status = VL53L1_SetSequenceStepTimeout(dev, VL53L1_SEQUENCESTEP_MSRC, sequence_config_timeout_us); if (status != VL53L1_ERROR_NONE) { return status; } status = VL53L1_SetSequenceStepTimeout(dev, VL53L1_SEQUENCESTEP_PRE_RANGE, sequence_config_timeout_us); if (status != VL53L1_ERROR_NONE) { return status; } status = VL53L1_SetSequenceStepTimeout(dev, VL53L1_SEQUENCESTEP_FINAL_RANGE, sequence_config_timeout_us); if (status != VL53L1_ERROR_NONE) { return status; } status = VL53L1_SetInterMeasurementPeriodMilliSeconds(dev, 100); if (status != VL53L1_ERROR_NONE) { return status; } status = VL53L1_SetGPIOConfig(dev, 0, VL53L1_GPIOFUNCTIONALITY_NEW_MEASURE_READY, VL53L1_INTERRUPTPOLARITY_LOW); if (status != VL53L1_ERROR_NONE) { return status; } return status; } // 触发一次测量 VL53L1_Error VL53L1x_StartMeasurement(VL53L1_Dev_t *dev) { VL53L1_Error status = VL53L1_ERROR_NONE; uint8_t measurement_mode; uint8_t system_health; uint8_t measurement_device_ready; // 获取测量模式 status = VL53L1_GetMeasurementMode(dev, &measurement_mode); if (status != VL53L1_ERROR_NONE) { return status; } // 如果设备未准备好,则等待 if (measurement_mode == VL53L1_DEVICEREADY_WAIT_FOR_MEASURE_VALID) { status = VL53L1_WaitDeviceBooted(dev); if (status != VL53L1_ERROR_NONE) { return status; } } // 触发测量 status = VL53L1_StartMeasurement(dev); if (status != VL53L1_ERROR_NONE) { return status; } // 等待测量完成 do { status = VL53L1_GetMeasurementDataReady(dev, &measurement_device_ready); if (status != VL53L1_ERROR_NONE) { return status; } status = VL53L1_GetSystemHealth(dev, &system_health); if (status != VL53L1_ERROR_NONE) { return status; } } while ((measurement_device_ready == 0) && (system_health == 0)); return VL53L1_ERROR_NONE; } // 读取测量距离 VL53L1_Error VL53L1x_ReadMeasurement(VL53L1_Dev_t *dev, uint16_t *distance) { VL53L1_Error status = VL53L1_ERROR_NONE; VL53L1_RangingMeasurementData_t ranging_data; // 读取测量数据 status = VL53L1_GetRangingMeasurementData(dev, &ranging_data); if (status != VL53L1_ERROR_NONE) { return status; } // 检查数据是否有效 if (ranging_data.RangeStatus != 0) { return VL53L1_ERROR_RANGE_ERROR; } // 保存测量距离 *distance = ranging_data.RangeMilliMeter; return VL53L1_ERROR_NONE; } ``` 使用时,可以调用VL53L1x_Init()函数初始化设备,然后使用VL53L1x_StartMeasurement()函数触发一次测量,最后使用VL53L1x_ReadMeasurement()函数读取测量距离。需要注意的是,VL53L1x模块的I2C地址为0x29,可以在VL53L1x_Init()函数中进行配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记帖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值