VL53L4CX TOF开发(1)----驱动TOF进行测距

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

概述

VL53L4CX 是一款先进的激光距离传感器,专为长距离和多目标测量设计,能够在最长6米的范围内提供非常精确的距离测量,尤其在短距离上效果显著,这得益于新一代18°视场角的激光发射器和出色的环境光性能。
得益于ST的专利算法和创新的模块结构,VL53L4CX还能在视场范围内检测到多个物体,并理解深度信息。ST的直方图算法确保了超过80厘米的距离覆盖玻璃的串扰免疫,并对80厘米以下的目标提供动态污渍补偿。
最近在弄ST和瑞萨RA的课程,需要样片的可以加群申请:615061293 。
在这里插入图片描述

视频教学

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

VL53L4CX TOF开发(1)----驱动TOF进行测距

样品申请

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

完整代码下载

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

主要特点

快速,精确测距

  1. 基于直方图技术
  2. 测量距离0mm - 6m
  3. 线性短距离低至10 mm
  4. 在所有亮度等级下对所有目标的远程测距性能有重大改进
  5. 18°视野(FoV)
  6. 多目标检测能力
  7. 距离超过80cm的目标不受盖片玻璃和污迹造成的串扰影响

VL53L4CX是完全集成的小型化模块

  1. 发射器:940 nm不可见激光(VCSEL)及其模拟驱动器
  2. 运行高级数字固件的低功耗微控制器
  3. 尺寸:4.4 x 2.4 x 1 mm
  4. 与VL53L0X、VL53L1X、VL53L1CB、VL53L3CX和VL53L4CD引脚兼容

在这里插入图片描述

硬件准备

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

技术规格

在这里插入图片描述

系统框图

在这里插入图片描述
在这里插入图片描述

应用示意图

在这里插入图片描述

生成STM32CUBEMX

选择MCU

测试版所用的MCU为STM32G431CB。

在这里插入图片描述

串口配置

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

在这里插入图片描述

配置串口。

在这里插入图片描述

IIC配置

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

在这里插入图片描述

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

在这里插入图片描述

XSHUT

XSHUT引脚是由主机连接和控制的,这种设计优化了功耗,因为设备在不使用时可以被完全关闭,然后通过主机使用XSHUT引脚来唤醒。当AVDD存在且XSHUT为低电平时,设备处于硬件待机模式(HW Standby mode)。如果XSHUT引脚不由主机控制,而是通过上拉电阻连接到AVDD,那么设备在固件启动(FW BOOT)后会自动进入软件待机(SW STANDBY),而不会进入硬件待机。

在这里插入图片描述

X-CUBE-TOF1

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

在这里插入图片描述

演示结果

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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、付费专栏及课程。

余额充值