STM32F103驱动VL53L0X激光测距模块 您所在的位置:网站首页 激光测距流程图片 STM32F103驱动VL53L0X激光测距模块

STM32F103驱动VL53L0X激光测距模块

2023-12-02 13:02| 来源: 网络整理| 查看: 265

STM32F103驱动VL53L0X激光测距模块 简介引脚定义STM32F103ZET6开发板与VL53L0X模块接线测试代码实验结果

简介

TOF 是飞行时间(Tlme of Flight)技术的缩写,即传感器发出经过调制的近红外光,遇到物体后反射,传感器通过计算光线发射和反射时间差或相位差,来换算被测量物体的距离。 VL53L0X是新一代飞行时间(ToF)激光测距模块,无论目标反射率如何,都能提供精确的距离测量。它可以测量2m的绝对距离,为测距性能等级设定了新的基准。VL53L0X集成了一个领先的SPAD阵列(单光子雪崩二极管),并内嵌ST的第二代FlightSense™专利技术。 VL53L0X的940nm VCSEL发射器(垂直腔面发射激光器)完全不为人眼所见,加上内置的物理红外滤光片,使其测距距离更长,对环境光的免疫性更强,对盖片的光学串扰具有更好的稳定性。 VL53L0X 传感器提供了 4 种测量模式。分别为默认测量模式、高精度测量模式、长距离测量模式以及高速测量模式。根据 ST 官方提供的 4 种不同的精度模式的特点,具体参数如下表所示。

精度模式S测量时间(ms)测距性能(m)默认301.2高精度2001.2精度 vl53l0x_test(); } }

代码清单2 VL53L0X 传感器测试(VL53L0X.c 文件)在测试函数中先是对 VL53L0X 传感器进行了初始化设置,当初始化成功则退出 while循环函数进入激光测距过程(第 16 行代码)。

1 /** 2 * @brief VL53L0X 主测试程序 3 * @param 无 4 * @retval 无 5 */ 6 void vl53l0x_test(void) 7 { 8 /*vl53l0x 初始化*/ 9 while (vl53l0x_init(&vl53l0x_dev)) { 10 printf("初始化失败\r\n"); 11 printf("请检查连接\r\n"); 12 } 13 printf("初始化成功\r\n"); 14 15 while (1) { 16 vl53l0x_general_test(&vl53l0x_dev); 17 } 18 }

代码清单 3 VL53L0X 工作模式测试函数(VL53L0X.c 文件)在 test 函数中,第 8 行使用 scanf 函数,使开发板获取来自串口调试助手发出的控制指令。当开发板接收到的指令字符 ch 为有效指令时(0 13 scanf("%d",&ch); 14 printf("接收到字符:%d\r\n",ch); 15 16 if ((ch>=0) && (ch 20 /*如果不是指定指令字符,打印提示信息*/ 21 printf("请输入合法指令!\r\n"); 22 Show_GenTask_Message(); 23 } 24 } 25 }

代码清单 4 VL53L0X 测量模式配置函数(VL53L0X.c 文件)在测量模式配置函数中,由于频繁切换精度模式容易导致采集距离数据不准 ,所以在使用之前先对 VL53L0X 传 感 器 进 行 复 位 处 理 ( 第 18 行 代 码 ) , 然 后 使 用VL53L0X_StaticIni()函数对传感器参数恢复为默认。另外,精度模式的配置是根据函数参数 mode 变量决定的,mode 值对应 0:默认,1:高精度 2:长距离,3:高速,根据全局数组 Mode_data[]变量的写入,从而实现不同精度模式的配置。

1 /** 2 * @brief VL53L0X 测量模式配置 3 * @param dev:设备 I2C 参数结构体 4 * @param mode: 0:默认;1:高精度;2:长距离 5 * @retval 状态信息 6 */ 7 VL53L0X_Error vl53l0x_set_mode(VL53L0X_Dev_t *dev,uint8_t mode) 8 { 9 VL53L0X_Error status = VL53L0X_ERROR_NONE; 10 uint8_t VhvSettings; 11 uint8_t PhaseCal; 12 uint32_t refSpadCount; 13 uint8_t isApertureSpads; 14 15 /*复位 vl53l0x(频繁切换工作模式容易导致采集距离数据不准,需加上这一代码)*/ 18 vl53l0x_reset(dev); 19 status = VL53L0X_StaticInit(dev); 20 21 /*已校准好了,写入校准值*/ 22 if (AjustOK!=0) { 23 /*设定 Spads 校准值*/ 24 status= VL53L0X_SetReferenceSpads(dev,Vl53l0x_data.refSpadCount, 25 Vl53l0x_data.isApertureSpads); 26 if (status!=VL53L0X_ERROR_NONE) goto error; 27 delay_ms(2); 28 29 /*设定 Ref 校准值*/ 30 status= VL53L0X_SetRefCalibration(dev,Vl53l0x_data.VhvSettings, 31 Vl53l0x_data.PhaseCal); 32 if (status!=VL53L0X_ERROR_NONE) goto error; 33 delay_ms(2); 34 35 /*中间省略代码*/ 36 ....... 37 38 39 /*设定 VCSEL 脉冲周期*/ 40 status = VL53L0X_SetVcselPulsePeriod(dev, 41 VL53L0X_VCSEL_PERIOD_PRE_RANGE, Mode_data[mode].preRangeVcselPeriod); 43 if (status!=VL53L0X_ERROR_NONE) goto error; 44 delay_ms(2); 45 46 /*设定 VCSEL 脉冲周期范围*/ 47 status = VL53L0X_SetVcselPulsePeriod(dev, VL53L0X_VCSEL_PERIOD_FINAL_RANGE, Mode_data[mode].finalRangeVcselPeriod); 50 51 error:/*错误信息*/ 52 if (status!=VL53L0X_ERROR_NONE) { 53 print_pal_error(status); 54 return status; 55 } 56 return status; 57}

代码清单 5 VL53L0X 单次距离测量函数(VL53L0X.c 文件)在该函数中,通过调用 VL53L0X_PerformSingleRangingMeasurement ()函数启动单次测量(第 15 行代码),该函数为阻塞函数,当测量结束后,测量的数据将被保存到 pdata 测量数据结构体上, 最后将获取测量结构体的测量数据赋值给 Distance_data 全局变量(第24 行代),通过读取 Distance_data 变量的值我们就可以知道测量距离了。

1 /** 2 * @brief VL53L0X 单次距离测量函数 3 * @param dev:设备 I2C 参数结构体 4 * @param pdata:保存测量数据结构体 5 * @retval 状态信息 6 */ 7 VL53L0X_Error vl53l0x_start_single_test(VL53L0X_Dev_t *dev, VL53L0X_RangingMeasurementData_t *pdata, 9 char *buf) 10 { 11 VL53L0X_Error status = VL53L0X_ERROR_NONE; 12 uint8_t RangeStatus; 13 14 /*执行单次测距并获取测距测量数据*/ 15 status = VL53L0X_PerformSingleRangingMeasurement(dev, pdata); 16 if (status !=VL53L0X_ERROR_NONE) return status; 17 18 /*获取当前测量状态*/ 19 RangeStatus = pdata->RangeStatus; 20 memset(buf,0x00,VL53L0X_MAX_STRING_LENGTH); 21 /*根据测量状态读取状态字符串*/ 22 VL53L0X_GetRangeStatusString(RangeStatus,buf); 23 /*保存最近一次测距测量数据*/ 24 Distance_data = pdata->RangeMilliMeter; 25 26 return status; 27 } 实验结果

在串口助手软件输入对应测距模式的编号后,激光测距传感器获取感应信息,将结果通过开发版 usart1 串口输给串口调试助手软件显示出来。 在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有