0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

VL53L1CB TOF开发(2)----多区域扫描模式

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2024-10-09 10:38 次阅读

概述

多区域扫描模式是 VL53L1 飞行时间 (Time-of-Flight, ToF) 传感器的一项高级功能,允许用户同时对多个区域进行距离测量。该模式通过划分视场(Field of View, FoV)为多个感兴趣区域(Region of Interest, ROI),并对每个区域分别进行测距,为需要广域监控和多目标检测的应用提供了理想的解决方案。 在多区域扫描模式下,VL53L1 传感器可以最多支持 16 个区域的并行测量,用户还可以根据需求将区域数量扩展到 169 个。每个区域的测量结果会独立报告,这使得该模式特别适合于需要监测大面积区域或精确跟踪多个目标的场景,例如投影机梯形校正、多点距离检测和环境映射等。

该模式支持最多 16 个区域的并行测量,用户还可以根据需求扩展到 169 个区域。这使得多区域扫描模式成为投影机梯形校正应用的理想选择,能够有效应对复杂的角度调整和多点校正需求。

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

视频教学

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

样品申请

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

源码下载

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

硬件准备

首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
主控为STM32WB55RGV6,TOF为VL53L1。

主要特点

● 多区域检测:支持对投影图像的多个区域进行独立测距,有助于精确的梯形校正。
高精度与灵活性:用户可以根据投影需求自定义 ROI 的数量和大小,实现更精细的图像调整。
● 应用场景:除了投影机梯形校正,该模式还适用于需要多点距离测量的其他应用,如机器人导航和环境映射。

生成STM32CUBEMX

用STM32CUBEMX生成例程,这里使用MCU为STM32WB55RG。

配置时钟树,配置时钟为32M。

串口配置

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

配置串口。

IIC配置

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

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

XSHUT

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

GPIO1

在VL53L1X传感器中,GPIO1(通用输入输出引脚1)通常用于中断信号输出。

配置如下所示。

X-CUBE-TOF1

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

堆栈设置

若无法正常运行需要修改优化等级。

函数说明

[https://docs.ros.org/en/melodic/api/vl53l1x/html/group__VL53L1__parameters__group.html]

初始化设置

UM2371文档是关于使用X-CUBE-53L1A1软件扩展包在STM32Cube平台上实现VL53L1X传感器应用的入门指南。它详细介绍了如何配置和使用VL53L1X传感器进行测距,并将测量数据传输到PC。

预设模式 (Preset mode)

在 UM2133 文档的第 3.2.4 节中,描述了 VL53L1 传感器的预设模式选择功能。以下是该部分的主要内容:
● 功能: VL53L1_SetPresetMode() 函数用于选择一个预设的测距模式。使用当前的驱动程序版本,可以选择以下几种预设模式:
● VL53L1_PRESETMODE_RANGING: 标准测距模式,用于获取单个或多个(最多 4 个)目标的测距数据。
● VL53L1_PRESETMODE_MULTIZONES_SCANNING: 多区域扫描模式,允许用户定义的多个感兴趣区域(ROI)进行连续扫描,并逐一报告每个区域的测距值。默认最多支持 16 个区域,最高可扩展到 169 个区域。
● VL53L1_PRESETMODE_LITE_RANGING: 简化测距模式(已废弃),最初设计用于降低主机的处理负担。
● VL53L1_PRESETMODE_AUTONOMOUS: 自主测距模式,在该模式下,传感器可以定期进行测量,而无需主机干预,适合低功耗应用。
● 默认模式: 默认的预设模式为 VL53L1_PRESETMODE_RANGING。

VL53L1_SetPresetMode

VL53L1_SetPresetMode() 是 VL53L1 传感器的一个API函数,用于将设备设置为一个新的预设模式(Preset Mode)。该函数定义了传感器的工作模式,比如高速测距或多目标检测。
函数描述:
● 作用: 这个函数设置设备的操作模式,比如高速测距或多对象检测等。它通过修改测量的时间预算和测量间隔来实现不同的模式。
● 注意事项:
○ 这个函数并不会直接访问设备,而是修改了相关的配置参数
○ 使用该函数后,时间预算会被设定为 16 ms,测量间隔被设定为 1000 ms,且距离模式被设定为 VL53L1_DISTANCEMODE_LONG。

将 VL53L1 传感器的预设模式设置为 VL53L1_PRESETMODE_MULTIZONES_SCANNING(多区域扫描模式)。

/*VL53L1_SetPresetMode function is mandatory to be called even if default PresetMode is the VL53L1_PRESETMODE_RANGING */
  status = VL53L1_SetPresetMode(&VL53L1CBObj1, VL53L1_PRESETMODE_MULTIZONES_SCANNING);

VL53L1_SetDistanceMode

VL53L1_SetDistanceMode() 是 VL53L1 传感器的一个API函数,用于设置传感器的测距模式。该函数允许用户选择适合具体应用场景的测距范围,以优化测量精度。不同的测距模式在不同的距离范围内提供最佳的测量结果。

根据不同的预设模式(Preset mode),用户可以选择适合的距离模式来优化测量的准确性和设备的性能。表格中的内容解释了每种距离模式的可能选项及其优点或注意事项。

status = VL53L1_SetDistanceMode(&VL53L1CBObj1, VL53L1_DISTANCEMODE_LONG);

时间预算

VL53L1_SetMeasurementTimingBudgetMicroSeconds() 是一个用于设置 VL53L1 传感器测距时间预算的 API 函数。通过这个函数,用户可以定义设备在当前模式下(如测距、直方图模式等)完成一次完整测距序列所允许的最大时间。

VL53L1_ERROR_INVALID_PARAMS: 如果传入的时间参数不被支持,会返回此错误。计算出的时间预算最大值为10秒,最小值则取决于所选择的预设模式。
时间预算值(表格): 表格中列出了不同预设模式下的时间预算的最小值、典型值和最大值:
● Ranging(测距模式):
○ 最小值: 8毫秒
○ 典型值: 16毫秒
○ 最大值: 500毫秒
● MultiZone scanning(多区域扫描模式):
○ 最小值: 8毫秒
○ 典型值: 16毫秒
○ 最大值: 500毫秒
● Autonomous(自主模式):
○ 最小值: 20毫秒
○ 典型值: 40毫秒
○ 最大值: 1000毫秒

status = VL53L1_SetMeasurementTimingBudgetMicroSeconds(&VL53L1CBObj1, 500000);

单个ROI(Single ROI)设置

● 默认设置: VL53L1传感器的默认ROI大小是16x16 SPAD(单光子雪崩二极管)矩阵。
● 自定义ROI: 用户可以调用 VL53L1_SetROI() 函数来设置与默认16x16不同的ROI。ROI是由两个角点(左上角和右下角)定义的正方形或矩形区域。
● 四个坐标:
● TopLeftX: 左上角X坐标。
● TopLeftY: 左上角Y坐标。
● BotRightX: 右下角X坐标。
● BotRightY: 右下角Y坐标。
● 结构体: 这些坐标是 VL53L1_UserROI_t 类型的结构体的一部分。用户需要在结构体中定义这些ROI坐标值,然后调用驱动函数应用ROI更改。
● 最小ROI尺寸: 最小的ROI尺寸是4x4 SPAD矩阵。

设置完毕之后使用 VL53L1_StartMeasurement 启动测量。

VL53L1_MultiRangingData_t MultiRangingData;
    VL53L1_MultiRangingData_t *pMultiRangingData = &MultiRangingData;
    uint8_t NewDataReady = 0;
    uint8_t NumROI = 16, RoiNumber=0, RoiStatus=0;
    int no_of_object_found = 0, j, k;
    VL53L1_RoiConfig_t pRoiConfig;

    pRoiConfig.NumberOfRoi=NumROI;

  printf("Start set Roi");
  for(k=0;k< 4;k++)
      for(j=0;j< 4;j++)
      {
          pRoiConfig.UserRois[k*4+j].TopLeftX=j*4;
          pRoiConfig.UserRois[k*4+j].TopLeftY=k*4+3;
          pRoiConfig.UserRois[k*4+j].BotRightX=j*4+3;
          pRoiConfig.UserRois[k*4+j].BotRightY=k*4;
          printf("set Roi %dnrx: %d-%d    y: %d-%dnr",k*4+j,j*4,j*4+3,k*4,k*4+3);
      }    

  /* VL53L1_SetROI must be called after VL53L1_SetPresetMode */
  status = VL53L1_SetROI(&VL53L1CBObj1, &pRoiConfig);
  if (!status){
    status = VL53L1_StartMeasurement(&VL53L1CBObj1);
  }
  else{
    printf("VL53L1_SetROI failed: error =%dnr", status);
    while(1){};
  };    
  if(status){
    printf("VL53L1_StartMeasurement failed: error = %d nr", status);
    while(1);
  }

主程序

● 数据检查:
● VL53L1_GetMeasurementDataReady(&VL53L1CBObj1, &NewDataReady);:这个函数检查传感器的测量数据是否准备好。如果有数据可用,NewDataReady 会被设置为非零值。
● HAL_Delay(1);:插入一个1毫秒的延迟,避免在轮询过程中占用过多的CPU时间。
● 数据获取:
● 如果测量数据已经准备好,代码会调用 VL53L1_GetMultiRangingData(&VL53L1CBObj1, pMultiRangingData); 获取多区域测距数据。
● RoiNumber 和 RoiStatus 从 pMultiRangingData 中提取,表示当前ROI的编号和状态。
● RangeMilliMeter 是从 pMultiRangingData->RangeData[0] 中提取的测量距离(以毫米为单位)。
● 数据输出:
● printf 语句将获取到的数据(ROI编号、状态、测量距离)输出到控制台或串口。
● 数据格式为:RoiNumber, RoiStatus, RangeMilliMeter,每次测量后输出一行。
● 中断清除与新测量开始:
● 如果成功获取到数据并处理完,代码调用 VL53L1_ClearInterruptAndStartMeasurement(&VL53L1CBObj1); 清除中断并启动新的测量。

do{ // polling mode
      status = VL53L1_GetMeasurementDataReady(&VL53L1CBObj1, &NewDataReady);
      HAL_Delay(1);
      if((!status)&&(NewDataReady!=0)){
        status = VL53L1_GetMultiRangingData(&VL53L1CBObj1, pMultiRangingData);
        RoiNumber=pMultiRangingData- >RoiNumber;
        RoiStatus=pMultiRangingData- >RoiStatus;

        printf("%1d,", RoiNumber);
        printf("%1d,", RoiStatus);
        printf("%d", pMultiRangingData- >RangeData[0].RangeMilliMeter);
        printf ("nr");
        if (status==0){
          status = VL53L1_ClearInterruptAndStartMeasurement(&VL53L1CBObj1);
        }
      }
    }
    while (1);

数据说明

RoiNumber: 8 位整数,表示与该测量数据相关的ROI编号。

RoiStatus: 当前ROI的状态,可能的值为 0, 1 或 2,分别表示“无效ROI”、“有效ROI”和“最后一个ROI”。

如果未检测到目标且测量有效,所有的距离值会被强制设置为最大值,并且其他返回值会设置为默认值(如0或8191)。

测试结果

VL53L1对着天花板测量数据如下所示,2个数据之间相处时间约为500ms。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2550

    文章

    51035

    浏览量

    753053
  • 扫描
    +关注

    关注

    0

    文章

    197

    浏览量

    24800
  • TOF
    TOF
    +关注

    关注

    9

    文章

    482

    浏览量

    36331
收藏 人收藏

    评论

    相关推荐

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

    VL53L5CX是一款先进的飞行感应(FlightSense)产品系列的飞行时间(ToF区间测距传感器。封装在微型的可回流焊盘封装内,它集成了SPAD阵列、物理红外滤光片和衍射光学元件(DOE),以在不同的环境光照条件和各种
    的头像 发表于 12-01 16:26 775次阅读
    <b class='flag-5'>VL53L</b>5CX驱动<b class='flag-5'>开发</b>(<b class='flag-5'>1</b>)----驱动<b class='flag-5'>TOF</b>进行<b class='flag-5'>区域</b>检测

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

    VL53L4CD适用于接近测量和短距离测量,可实现从仅仅1 mm到1300 mm的超精准距离测量。新一代激光发射器具有18°视场 (FoV),提高了环境光下的性能,其测距速度高达100Hz
    的头像 发表于 05-17 14:54 926次阅读
    <b class='flag-5'>VL53L</b>4CD <b class='flag-5'>TOF</b><b class='flag-5'>开发</b>(<b class='flag-5'>1</b>)----驱动<b class='flag-5'>TOF</b>进行测距

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

    VL53L8CX是一款8x8区域ToF测距传感器,它在环境光下能够在降低功耗的同时增强性能。该传感器基于意法半导体的FlightSense技术设计,能够提供最高400 cm的精确测距
    的头像 发表于 05-20 09:42 867次阅读
    <b class='flag-5'>VL53L</b>8CX <b class='flag-5'>TOF</b><b class='flag-5'>开发</b>(<b class='flag-5'>1</b>)----驱动<b class='flag-5'>TOF</b>进行<b class='flag-5'>区域</b>检测

    VL53L4CD TOF开发(2)----修改测量频率

    VL53L4CD是一款高度集成的飞行时间(ToF)传感器,广泛应用于距离测量和接近检测。为了满足不同应用场景的需求,合理调整传感器的测量频率至关重要。本文旨在介绍如何在VL53L4CD传感器上修改
    的头像 发表于 06-19 14:50 1147次阅读
    <b class='flag-5'>VL53L</b>4CD <b class='flag-5'>TOF</b><b class='flag-5'>开发</b>(<b class='flag-5'>2</b>)----修改测量频率

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

    VL53L1传感器,可以实现对物体的快速、准确测距,最高测量距离可达800厘米。该传感器支持I2C接口,具备多种预设模式(如测距模式
    的头像 发表于 10-09 10:16 1394次阅读
    <b class='flag-5'>VL53L1CB</b> <b class='flag-5'>TOF</b><b class='flag-5'>开发</b>(<b class='flag-5'>1</b>)----驱动<b class='flag-5'>TOF</b>进行测距

    新一代ToF 激光测距模块VL53L0X

    距离可长达 2 m,精度高达 3%,具体取决于所选功耗与精度的平衡。图 1VL53L0X 框图。如图 1 所示,VL53L0X 集成了人眼
    发表于 04-06 14:03

    VL53L1X简介

    一、VL53L1X简介VL53L1X属于STMicroelectronics即常说的意法半导体(ST)公司推出的FlightSense™ 产品系列ToF(Time of flight)激光测距传感器
    发表于 08-06 07:54

    VL53L5CX #高达 8x8 区域测距和 63°对角线宽视场 飞行时间区域测距传感器

    意法半导体 – VL53L5CX 飞行时间传感器高达 8x8 区域测距和 63°对角线宽视场意法半导体VL53L5CX是一款先进的飞行时间 (To
    发表于 09-01 10:10

    RT-Thread VL53L0X TOF传感器驱动设计资料实现

    1、RT-Thread VL53L0X TOF传感器驱动实现  Time of flight(TOF),中文翻译为“飞行时间”。飞行时间技术在广义上可理解为通过测量物体、粒子或波在固定
    发表于 09-15 17:08

    ST的飞行时间传感器产品以及哪些传感器具有哪些功能

    0x - 25o FOV,测距传感器中的基本型号。单一区域,单一目标vl53l1 - 27o FOV,区域(可调 FoV)vl53l1x
    发表于 12-07 11:55

    VL53L1的门传感器的功耗有低?

    不清楚基于 VL53L1 的门传感器的功耗有低,例如,所以我可以确定电池寿命?此外,哪种模式、设置和采样方法等可以理想地提供中断驱动的连续门感应功能,同时功耗最低?
    发表于 12-09 06:38

    我可以使用API VL53LX去支持VL53L1CB吗?

    使用 STM32CubeMX 重新制定项目。但是我找不到合适的软件支持,无论是在 X-CUBE-TOF1 库还是 X-CUBE-53L1A2 中,它似乎不支持自定义硬件的裸驱动程序 API。您认为我可以使用 VL53L3 父 A
    发表于 12-16 06:24

    如何区分VL53L1CBVL53L1CX?

    VL53L1 数据表中报告并且无法与 VL53L1X 值进行比较。要将已处于生产阶段的产品从 VL53L1CX 切换到 VL53L1CB,这是一个需要了解的关键要素。
    发表于 12-30 08:11

    为什么无法在VL53L1上进行测距和区域扫描

    我有一个传感器部件号 VL53L1CBV0FY/1 我使用驱动程序版本 6.6.1。GetDeviceInfo 报告:名称:VL53L1 cut1.0型号:VL53L1产品类型:0主要
    发表于 01-11 07:35

    区飞行时间(ToF)传感器的特点

    ‍‍‍‍‍‍‍‍ VL53L5、VL53L7、VL53L8都是基于ST的FlightSense技术的区飞行时间(ToF)传感器。
    的头像 发表于 02-25 09:41 1132次阅读
    <b class='flag-5'>多</b>区飞行时间(<b class='flag-5'>ToF</b>)传感器的特点