激光测距芯片VL53L1CB的使用

ST的距离传感器有如下产品型号
在这里插入图片描述
今天来介绍下距离最长可以到8m的VL53L1CB。
首先需要去官网下载数据手册、API库、API使用手册:
在这里插入图片描述
在这里插入图片描述

介绍

  VL53L1CB是新型飞行时间传感器,基于意法半导体的专利型FlightSenseTM技术。该传感器的测量距离可达8m,不受目标颜色和材质的影响。意法半导体的直方图算法允许检测视野(FoV)范围内的不同目标。该算法还能抵御80cm以上的盖片串扰。 SPAD阵列区域选择支持先进的多区域扫描。 VL53L1CB还拥有可编程的视野(15°- 27°),取决于所选SPAD阵列区域的大小。

  VL53L1CB是一款先进的飞行时间传感器,丰富了意法半导体的FlightSenseTM产品阵容。它采用一体化回流焊封装,集成了SPAD(单光子雪崩二极管)阵列、物理红外滤光片和光学器件,在各种环境照明条件(带各种盖片选项)下实现最佳的测距性能。
  与传统的IR传感器不同, VL53L1CB使用ST最新一代直接ToF技术,可测量在任何目标颜色和反射率时的绝对距离。它的精确测量距离可达8m,可以在高速(60Hz)下工作,对于手势识别或工业用例等快速应用非常有用。
  凭借专利型算法和创新型模块构造,VL53L1CB能够通过深度了解以60Hz的工作频率检测视野(FoV)内的不同对象。还可以实现场景浏览和多区域检测,这是由提供连续多区域扫描的应用程序编程接口(API)支持的。
在这里插入图片描述

特点

全集成微型模块

  • 发射体:940nm不可见激光器(VCSEL)及其模拟驱动器
  • 集成透镜接收阵列
  • 运行高级数字固件的低功耗微控制器
  • 尺寸:4.9 x 2.5 x 1.56毫米

快速、准确的测距

  • 400厘米以上的探测,全视野(FoV)
  • 60赫兹测量频率范围可达300厘米
  • 通过专利算法(直接ToF)免疫覆盖玻璃的串扰和远距离指纹污迹
  • 多目标检测能力
  • 多区域扫描,可选择阵列(2x2, 3x3, 4x4,或用户通过软件定义)

轻松集成

  • Reflowable组件
  • 单电源2v8
  • 使用多种覆盖玻璃材料
  • I²C接口(高达1 MHz)
  • Xshutdown (reset)和中断GPIO
  • 全套软件驱动程序(兼容Linux和Android)
    在这里插入图片描述

系统框图

在这里插入图片描述

引脚和使用电路

在这里插入图片描述
在这里插入图片描述
XSHUT相当于是复位引脚。
GPIO1是中断输出引脚,当一次测距完成可以输出个信号通知MCU去读取数据。
XSHUT和GPIO1推荐使用10K电阻上拉。
IIC使用4.7K电阻上拉。

API库的移植

VL53L1CB通过API库来操作,要使用API库只需要把底层的IIC驱动移植好即可。
移植的方法和VL53L0X类似,参考激光测距芯片VL53L0X的使用与代码
在这里插入图片描述

测距

测距的预设模式

VL53L1CB有4种预设模式,通过API函数来选择,根据自己的应用需求选择其中的一种来使用:

  • 测距模式(Ranging mode):可以测量视野内的一个或多个(最多4个)目标的距离。(默认模式)
  • 多区域扫描模式(MultiZones scanning mode):可以在视野内设置多个分开的区域(称为ROI,ROI的个数可以为4个、9个、16个或自定义),每个区域内也可以检测多个目标。
  • 自治模式(Autonomous mode):前面两种模式,测距完成都需要等待MCU读取数据然后清除中断才能进行下一次测距,而自治模式不需要,它会自动的一直测距,还可以设置触发条件,当满足触发条件时通过GPIO1输出中断信号唤醒MCU。
  • 微测距模式(Lite ranging mode):这个模式被舍弃了。

测距的流程

在这里插入图片描述
首先需要依次调用如下3个函数来初始化。
VL53L1_WaitDeviceBooted()
VL53L1_DataInit()
VL53L1_StaticInit()
然后调用VL53L1_SetCalibrationData()函数来设置校准参数
接着调用VL53L1_SetPresetMode()函数来设置预设模式,该函数的参数:
• VL53L1_PRESETMODE_RANGING
• VL53L1_PRESETMODE_MULTIZONES_SCANNING
• VL53L1_PRESETMODE_LITE_RANGING (Obsolete)
• VL53L1_PRESETMODE_AUTONOMOUS
接着调用VL53L1_SetDistanceMode()函数来设置距离模式,距离模式有3种参数:Short、Medium、Long。
不同的预设模式,距离模式对应的效果也不同:
在这里插入图片描述
接着调用VL53L1_SetXTalkCompensationEnable()函数启用串扰补偿。
• VL53L1_SetXTalkCompensationEnable&VL53L1Dev, 0); //禁用串扰补偿。
• V53L1_SetXTalkCompensationEnable&VL53L1Dev, 1); //启用串扰补偿。
最后就可以调用VL53L1_StartMeasurement()函数开始测距了。
有3种方式知道测距完成了

  • 第一种是使用VL53L1_WaitMeasurementDataReady()函数等待测距完成,调用此函数后程序会一直停在这里,直到测距完成。
  • 第二种是使用VL53L1_GetMeasurementDataReady() 函数来查询测距是否完成,当此函数回复1说明测距完成,可以读取距离数据。
  • 第三种是使用GPIO1中断引脚,当测距完成会产生一个下降沿。
    在这里插入图片描述
    当知道了测距完成,就可以调用函数去读取测量距离了。
    自治模式使用VL53L1_GetRangingMeasurementData() 函数读取测量结果,测量结果是一个VL53L1_RangingMeasurementData_t结构体。
    测距模式和多区域扫描模式使用VL53L1_GetMultiRangingData() 函数读取测量结果,测量结果是一个VL53L1_MultipleRangingData_t结构体 。
    如果需要下一次的测量,在测距模式和多区域扫描模式下,必须要调用VL53L1_ClearInterruptAndStartMeasurement()来清除中断并开始下一次测量。
    如果不需要测量,可以调用 VL53L1_StopMeasurement()函数来停止测量。

VL53L1_RangingMeasurementData_t结构体

• TimeStamp: 未实现
• StreamCount:这个8位整数在每次测距后递增1。取值从0开始,递增到255,再从128递增到255。
• RangingQualityLevel: 未实现
• SignalRateRtnMegaCps:表示返回的信号强度 (单位是MCPS)。这是一个16.16的定点值。为了得到一个真实的值,它应该除以65536。
• AmbientRateRtnMegaCps:这个值是返回的环境信号强度(单位MCPS)。它是一个16.16的固定点值,表示有效的测量光击中SPAD矩阵的量。为了得到一个真实的值,它应该除以65536。
• EffectiveSpadRtnCount:这是一个16位整数,返回当前范围的有效SPAD计数。为了得到一个真实的值,它应该除以256。
• SigmaMilliMeter:这个16.16固定点值是当前测距的标准偏差的估计,以毫米表示。为了得到一个真实的值,它应该除以65536。
• RangeMilliMeter:这是一个16位整数,给出了以毫米为单位的距离。
• RangeFractionalPart: 未实现
• RangeStatus:这是一个8位整数,给出当前测量的状态。Value = 0表示本次测量是有效的。
• ExtendedRange: this is a 8-bit integer indicating if the range has been unwrapped (only for long distances,using Ranging Mode)

VL53L1_MultipleRangingData_t结构体

•TimeStamp:未实现
•StreamCount:这个8位整数在每次测距后递增1。取值从0开始,递增到255,再从128递增到255。
•RoiNumber:这是一个8位整数值,它给出了与范围数据相关的ROI。
•NumberOfObjectsFound:这个8位整数值给出了在当前ROI中找到的对象的数量。
•RoiStatus:它给出了当前ROI的状态。取值为0、1或2,分别表示“invalid ROI”、“valid ROI”、“valid and last ROI”。主要用于在使用扫描模式时标记最后一个ROI进行同步。
•RangeData[VL53L1_MAX_RANGE_RESULTS]:这是一个类型为VL53L1_TargetRangeData_t的表结构,给出每个ROI的结果(更多细节参见下面的描述)。对象的最大数量由VL53L1_MAX_RANGE_RESULTS给出,默认情况下等于4个。
•HasXtalkValueChanged:这个8位整数值表示串扰值是否被更改。
•EffectiveSpadRtnCount:这是一个16位整数,返回当前范围的有效SPAD计数。为了得到一个真实的值,它应该除以256。
•DmaxMilliMeter:这是一个16位整数。当目标没有被检测到,并且测距是有效的(范围状态只有255),0和dmax之间没有对象可以被检测到。当没有找到有效的范围数据时,这个值可以帮助主机算法。
•recommeddistancemode:类型为VL53L1_DistanceModes的值。它指出了根据测距条件推荐的距离模式,以获得最好的精度,聚焦于被检测物体。

VL53L1_TargetRangeData_t结构由以下几个部分组成:
•RangingQualityLevel:未实现。
•RangeMaxMilliMeter:这是一个16位整数,提供更大的检测距离。
•RangeMinMilliMeter:这是一个16位整数,提供更小的检测距离。
•SignalRateRtnMegaCps:表示返回的信号强度 (单位是MCPS)。这是一个16.16的定点值。为了得到一个真实的值,它应该除以65536。
•AmbientRateRtnMegaCps:这个值是返回的环境信号强度(单位MCPS)。它是一个16.16的固定点值,表示有效的测量光击中SPAD矩阵的量。为了得到一个真实的值,它应该除以65536。
•SigmaMilliMeter:这个16.16固定点值是当前测距的标准偏差的估计,以毫米表示。为了得到一个真实的值,它应该除以65536。
•RangeMilliMeter:这是一个16位整数,给出了以毫米为单位的距离。
•RangeFractionalPart:未实现。
•RangeStatus:这是一个8位整数,给出当前测量的状态。Value = 0表示本次测量是有效的。

如果未检测到目标,且测量有效,则将以下值报告到VL53L1_TargetRangeData_t结构体中:
•RangeMaxMilliMeter:强制8191。
•RangeMinMilliMeter:强制8191。
•SignalRateRtnMegaCps:强制为0。
•AmbientRateRtnMegaCps:通常计算环境速率值。
•SigmaMilliMeter:强制为0。
•RangeMilliMeter:强制8191。
•RangeStatus:强制为255。

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

初始化参考程序

VL53L1_Error VL53L1x_Init(VL53L1_Dev_t *dev)
{
	u8 i;
	VL53L1_Error Status = VL53L1_ERROR_NONE;
	
	dev->I2cDevAddr = 0x52;        //I2C地址(上电默认0x52)
	dev->comms_type = 1;           //I2C通信模式
	dev->comms_speed_khz = 400;    //I2C通信速率
	
	VL53L0X_IIC_Init();
	
	XSHUT_LOW;
	delay_ms(30);
	XSHUT_HIGH;
	delay_ms(30);	

	Status = VL53L1_WaitDeviceBooted(dev);
	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_GetCalibrationData(dev,&Cali_Data);  
	if(Status!=VL53L1_ERROR_NONE) { return Status; }	
	
	Status = VL53L1_SetCalibrationData(dev,&Cali_Data);
	if(Status!=VL53L1_ERROR_NONE) { return Status; }
	
	Status = VL53L1_SetPresetMode(dev,VL53L1_PRESETMODE_RANGING);  
	if(Status!=VL53L1_ERROR_NONE) { return Status; }	

	Status = VL53L1_SetDistanceMode(dev,VL53L1_DISTANCEMODE_LONG);  //VL53L1_DISTANCEMODE_MEDIUM 测量过程中会自动推荐模式
	if(Status!=VL53L1_ERROR_NONE) { return Status; }	
	
//	Status = VL53L1_SetMeasurementTimingBudgetMicroSeconds(dev,66000);
//	if(Status!=VL53L1_ERROR_NONE) { return Status; }	
	
	Status = VL53L1_SetXTalkCompensationEnable(dev, 1);               //启用串扰补偿功能
	if(Status!=VL53L1_ERROR_NONE) { return Status; }

//	Status = VL53L1_SmudgeCorrectionEnable(dev, VL53L1_SMUDGE_CORRECTION_CONTINUOUS); //使能持续串扰矫正,可从HasXtalkValueChanged知道串扰是否被矫正
//	if(Status!=VL53L1_ERROR_NONE) { return Status; }
	
	Status = VL53L1_StartMeasurement(dev);
	if(Status!=VL53L1_ERROR_NONE) { return Status; }
	
	return Status;
}

其他功能

ROI设置

若要设置ROI,可以通过调用VL53L1_SetROI()函数,ROI默认为16x16。ROI是一个正方形或矩形区域,由左上和右下两个角定义:
•TopLeftX
•TopLeftY
•BotRightX
•BotRightY
这4个值,在VL53L1_UserROI_t结构体中。用户必须在结构体中定义ROI坐标值,并调用驱动函数来应用ROI的改动。最小ROI是4x4。下图给出了一个ROI设置的示例。
在这里插入图片描述

实景和SPAD阵列上成像的关系

上下颠倒,左右颠倒。
在这里插入图片描述

多区域扫描模式设置多个ROI

当使用多区域扫描方式时,用户可以设置多个ROI。VL53L1对这个列表的管理如下:它开始对第一个ROI进行测距,引发中断,移动到下一个ROI,并重新启动列表,直到用户调用stop函数。当最后一个ROI被激活时,将标志ROIStatus设置为2,那么下一个ROI将位于数组的第一个位置(参见上面MultiRangingData结构)。

测距数据是可用的,必须在中断触发时由用户读取。ROIs的最大数量由参数VL53L1_MAX_USER_ZONES定义。默认值为16(可设置为169)。

为了节省内存,用户可以将最大roi数减少到最终应用程序中编程的实际最大ROI数。

不能动态修改roi集合。用户需要停止测距、修改ROIs、重启。

结构VL53L1_RoiConfig_t在API中定义:
•NumberOfRoi: 8位整数,定义roi的数量
•UserRois[VL53L1_MAX_USER_ZONES]:包含ROI坐标的VL53L1_UserRoi_t表结构。

VL53L1_UserRoi_t结构包含ROI的坐标:
•TopLeftX:给出左上角x坐标(0-15)的8位整数
•toplety: 8位整数,给出左上角的y坐标(0-15)
•BotRightX: 8位整数,给出右下角的x坐标(0-15)
•BotRightY: 8位整数,给出右下角的y坐标(0-15)
设置2个ROI的示例如下:

VL53L1_RoiConfig_t roiConfig;
roiConfig.NumberOfRoi = 2;
roiConfig.UserRois[0].TopLeftX = 0;
roiConfig.UserRois[0].TopLeftY = 5;
roiConfig.UserRois[0].BotRightX = 5;
roiConfig.UserRois[0].BotRightY = 0;
roiConfig.UserRois[1].TopLeftX = 9;
roiConfig.UserRois[1].TopLeftY = 13;
roiConfig.UserRois[1].BotRightX = 14;
roiConfig.UserRois[1].BotRightY = 10;
status = VL53L1_SetROI(&VL53L1Dev, &roiConfig);

时间预算

时间预算是用户分配给执行一次范围测量的时间。
使用VL53L1_SetMeasurementTimingBudgetMicroSeconds()函数来设置。比如设置为66ms:status = VL53L1_SetMeasurementTimingBudgetMicroSeconds(&VL53L1Dev, 66000 )
使用VL53L1_GetMeasurementTimingBudgetMicroSeconds()来获取设置值。
最小值和最大值的设置范围:
在这里插入图片描述
当预设模式是测距模式时,默认的时间预算(执行VL53L1_DataInit()函数后)是33ms。
当使用多个ROI时,每个区域测距是一个单独的测距操作,每个区域测距都需要时间预算。

距离模式自动推荐功能

在测距模式和多区域扫描模式下,驱动程序会监控测距条件并提供距离模式的建议,使用更合适的距离模式提供对检测对象范围更好的准确性。这个建议是作为VL53L1_MultiRangingData_t结构的一部分无条件提供的。由应用程序来监视这个值,检查它是否与编程的距离模式不同,并决定是忽略还是遵循建议。如果申请决定按照建议更改距离模式,则必须按以下步骤进行:

  1. VL53L1_StopMeasurement()
  2. VL53L1_SetDistanceMode(RecommendedDistanceMode)
  3. VL53L1_StartMeasurement()
    在自治模式下,驱动程序不会监控,没有距离模式推荐功能。

Inter-measurement周期

在自治模式下,可以配置Inter-measurement周期,使测距频率降低:确保在两个连续的测距测量之间有inter-measurement周期。在inter-measurement周期内,设备处于低功耗互测状态。
建议将inter-measurement周期设置为大于Timing budget。
此参数在测距模式和多区域扫描模式中被忽略。
默认情况下,每次测距都向主机报告测距数据,所以每个测量周期。可以使用中断来生成报告。
使用VL53L1_SetInterMeasurementPeriodMilliSeconds()来设置,比如设置为1秒:status = VL53L1_SetInterMeasurementPeriodMilliSeconds(&VL53L1Dev, 1000 )
使用VL53L1_GetInterMeasurementPeriodMilliSeconds()函数来获取,默认值是100ms。

自治模式条件触发功能

在自治模式下,设备可以配置为只有当测距数据与配置的一组条件匹配时才向主机报告测距。
检测模式
是否过滤报告给主机取决于检测方式的配置。
报告过滤条件:
0:没有过滤器(所有的范围生成一个报告给主机)
•1:只过滤距离条件
•2:只对信号速率标准进行滤波
•3:结合两个条件进行过滤
•4:根据一个或其他条件进行过滤
缺省情况下,该过滤器处于关闭状态。
距离模式
距离模式定义了如何定义距离标准:
•0:低于某个距离(如果对象距离大于配置的距离或没有对象,则没有报告)。
•1:超出一定的距离
•2:在距离范围内(最小/最大)
•3:超出距离范围(最小/最大)
距离低
最小距离,以毫米为单位。
距离高
最大距离以毫米为单位。
信号率模式
类似于距离模式,但是是使用信号强度。
信号强度低
MCPS中的最小信号强度
信号强度高
MCPS中的最大信号强度
没有目标
如果没有检测到目标,如果没有设置“无目标”条件(默认),就不会产生中断。如果用户想要被通知某个对象超出了最大距离(例如,一个太远而无法检测到的对象不会产生中断),建议设置此值。
VL53L1_SetThresholdConfig()是要使用的函数。
例如,对设备编程,只在10厘米到1米范围内检测到物体时报告测距:

detectionConfig.DetectionMode = 1
detectionConfig.Distance.CrossMode = 2
detectionConfig.Rate.CrossMode = 0
detectionConfig.IntrNoTarget = 0
detectionConfig.Distance.High = 1000
detectionConfig.Distance.Low = 100
detectionConfig.Rate.High = 0
detectionConfig.Rate.Low = 0
status = VL53L1_SetThresholdConfig(&VL53L1Dev, &detectionConfig );

函数VL53L1_GetThresholdConfig()获取编程的报告过滤/阈值配置。

实时串扰矫正功能

串扰(xtalk)被定义为由于在模块顶部添加了盖玻片,SPAD阵列上接收到盖玻片反射的VCSEL光的信号量。
VL53L1嵌入了一个可以动态测量串扰值的功能,并应用新的串扰修正值。
此功能可用于确保串扰值始终是正确的。这是有用的,特别是当污迹添加到盖玻璃。
用户可以通过调用VL53L1_SmudgeCorrectionEnable()来启用/禁用此功能。
该功能可以设置三个选项:
• VL53L1_SMUDGE_CORRECTION_NONE 禁用矫正
• VL53L1_SMUDGE_CORRECTION_CONTINUOUS 使能持续串扰矫正
• VL53L1_SMUDGE_CORRECTION_SINGLE 使能开始测距后进行单次矫正

实时串扰检测在每次测距时运行。满足以下条件时,计算新的串扰值:
•80厘米以下无异物
•环境光水平低于阈值
•串扰值高于0.4 KCPS
环境电平的阈值是一个调优参数(#32900)。该参数的格式为16.16,编码值默认为57671680 (Encoded value = 880)。如果ambient rate在此阈值以上测量,则不应用污迹校正。当高环境信号存在时,这降低了噪声对计算模糊值的影响。
将这个参数设置为一个较高的值(例如115343360)将允许在更强的环境光条件下获得模糊功能报告新的串扰值。可能的缺点是串扰值不准确。

如果用户设置了实时串扰校正,串扰值将被校正,并设置标志HasXtalkValueChanged。该标志在下一个范围自动清除。
默认情况下,污点校正是禁用的。

测距增益

为了减少可能的测距误差,必须对设备施加测距增益。这个增益是直接应用于最终测距的一个因素。下表给出了默认值。
在这里插入图片描述

如果需要,用户可以更改这些默认值。客户可以执行全面的测距扫描,监视测距数据,并计算测距误差。根据结果,客户决定是否必须更改默认值。
这个测距增益因子可通过设置/获取校准数据功能
函数VL53L1_GetCalibrationData()允许接收所有校准数据。返回的结构VL53L1_CalibrationData_t包含另一个名为VL53L1_gain_calibration_data_t的结构,它包含两个可能的偏移增益值:
•standard_ranging_gain_factor
•histogram_ranging_gain_factor

最大增益值为7。设置较高的值会产生不正确的范围值。
如果用户将增益设置为0.5,则驱动器报告的最终距离将乘以0.5。
用户可以通过调用VL53L1_SetCalibrationData()来设置测距增益因子。

光学中心坐标

由于装配公差,设备的光学中心可以变化。每个部件的光中心都被测量。光中心坐标存储在设备NVM中。
用户可以通过调用VL53L1_GetCalibrationData()访问光中心坐标。返回的结构体VL53L1_CalibrationData_t包含另一个类型为VL53L1_optical_centre_t的结构体,它包含两个坐标:
•x_centre
•y_centre
主机可以使用这两个坐标更好地将ROI对准光中心。
在这里插入图片描述

校准

为了从设备的全面性能中获益,VL53L1驱动程序包括校准功能,在客户生产线上运行一次。
必须运行校准程序来补偿可能影响设备性能的零件之间的参数。
存储在主机中的校准数据必须在每次启动时使用专用的驱动函数加载到VL53L1中。
需要三种校正: refSPAD, crosstalk, and offset。
偏移校准也允许校准dmax值。
校准函数的调用顺序很重要。它们应按下列顺序调用:
refSPAD
crosstalk
offset
这三种校准功能可以按顺序进行,也可以单独进行。当单独运行时,必须在运行校准前加载前一步的数据。
串扰校准部分对部分校准可以用实时串扰校准功能代替。此功能在上面实时串扰校准功能中描述。

RefSPAD校准

在ST进行最后的模块测试时,对SPADs的数量进行校准。这个部件对部件的值存储在NVM中,并在启动过程中自动加载到设备中。
这种校准允许SPADs的数量来优化设备的动态进行调整。然而,在模块顶部添加一个覆盖玻璃可能会影响此校准。ST建议客户在最终产品应用中再次进行这种校准。
当调用该函数时,将应用在FMT上运行的相同算法。该算法搜索三种可能的SPAD类型:
•1(非衰减SPAD)
•2 (SPAD衰减5倍)
•3 (SPAD衰减10倍)
选择SPAD的数量和类型以避免内部信号饱和。

RefSPAD校准函数

该操作需要一个专门的函数:VL53L1_PerformRefSpadManagement(VL53L1_DEV Dev)
注意:此函数必须在校准过程中首先调用。
该函数输出以下三条警告消息:
•VL53L1_WARNING_REF_SPAD_CHAR_NOT_ENOUGH_SPADS
少于五个好的spad可用,输出无效
•VL53L1_WARNING_REF_SPAD_CHAR_RATE_TOO_HIGH
当搜索参考率大于40.0 Mcps时,范围稳定性可能会降低。
•VL53L1_WARNING_REF_SPAD_CHAR_RATE_TOO_LOW
当搜索参考速率小于10.0 Mcps时,范围稳定性可能会降低。

RefSPAD校准过程

这种校准不需要遵循任何特殊条件,执行这个校准的时间是几毫秒。
应该在VL53L1_DataInit()和VL53L1_StaticInit()函数被调用后调用该函数。

获取refSPAD校准的结果

函数VL53L1_GetCalibrationData()允许接收所有校准数据。返回的结构VL53L1_CalibrationData_t包含另一个名为VL53L1_customer_nvm_managed_t的结构,它包含以下八个refSPAD校准参数:
•ref_spad_man__num_requested_ref_spads:该值介于5到44之间。它给出所选spad的数量。
•ref_spad_man__ref_location:取值为1、2、3。给出了SPAD区域的类型。
(1-(非衰减SPAD) 2- (SPAD衰减5倍) 3- (SPAD衰减10倍))
•6个附加参数给出所选位置的正确SPAD地图。
——global_config__spad_enables_ref_0
——global_config__spad_enables_ref_1
——global_config__spad_enables_ref_2
——global_config__spad_enables_ref_3
——global_config__spad_enables_ref_4
——global_config__spad_enables_ref_5

设置refSPAD校准数据

在每次启动时,在初始引导之后,客户字段应用程序可以使用VL53L1_SetCalibrationData()在调用VL53L1_DataInit()和VL53L1_StaticInit()函数后加载refSPAD校准数据。
最好通过以下方法得到整个校准数据结构:
1、调用VL53L1_GetCalibrationData ()
2、修改6.1.3获取refSPAD校准结果中的8个参数
3、调用VL53L1_SetCalibrationData ()

串扰校准

串扰被定义为由于VCSEL光在模块顶部的保护窗(遮罩玻璃)内反射而在返回阵列上接收的信号量。
根据覆盖玻璃的质量,这个信号会影响设备的性能。在VL53L1中,这种现象由内置的校正功能来补偿。
根据使用的预置模式和目标距离,VL53L1对串扰免疫。下表给出了设备功能的概述。
在这里插入图片描述

串扰校准用于估计补偿模块上加盖玻璃的影响所需的校正量。
校准程序是独特的,适用于所有预设模式。
VL53L1新增加的一个重要因素是由于SPAD阵列上的透镜而产生的不一致的串扰。这解释了为什么需要串扰的平面适配模型而不是上一代产品。因此,串扰的输出包含许多定义平面模型的参数,而以前的产品生成只有一个参数。
串扰由以下几个参数组成:
•x gradient(x梯度)
•y gradient(y梯度)
•offset and crosstalk shape(偏移和串扰形状)

串扰校准函数

该操作有专门的数:VL53L1_PerformXTalkCalibration(&VL53L1Dev,CalibrationType);
注意:此函数必须在校准过程的第二位置,在refSPAD校准完成后,在offset校准之前调用。
有两种校准类型:
•标准串扰校准。要选择此校准,请使用
CalibrationType =VL53L1_XTALKCALIBRATIONMODE_NO_TARGET。此串扰校准是为高串扰罩玻璃(串扰超过5kcps)而优化的。
•全ROI串扰校准。要选择此校准,请使用
CalibrationType =VL53L1_XTALKCALIBRATIONMODE_FULL_ROI。这种串扰校准速度更快,并针对低串扰覆盖眼镜(串扰低于5kcps)进行了优化。

标准串扰校准过程

在串扰校准过程中,客户必须确保设备视场(FoV)小于80cm的范围内没有目标。
串扰校准应在无红外干扰的黑暗环境中进行。
注意:如果在设备视场80cm以下存在目标或物体,则校准结果将不正确,影响测距性能。
注意:如果检测到最近的目标(覆盖玻璃)在50毫米以上,串扰将失效。
在VL53L1_StaticInit()、VL53L1_DataInit()和VL53L1_PerformRefSpadManagement()函数被调用后,必须调用一个专用的校准函数: VL53L1_PerformXTalkCalibration(&VL53L1Dev, 0);
当调用这些函数时,将执行标准串扰校准,默认情况下将应用串扰校正。

全ROI串扰校准过程

为了进行全roi串扰校准,必须将一个灰色目标(17%的反射率)放置在距设备600毫米的距离。
串扰校准应在无红外干扰的黑暗环境中进行。
VL53L1_PerformXTalkCalibration (&VL53L1Dev 2);是专用的校准函数,在调用VL53L1_StaticInit()、VL53L1_DataInit()、L53L1_PerformRefSpadManagement()函数后必须调用。
当调用这些函数时,执行全ROI串扰校准,默认使用串扰校正。

通用形状串扰校准

通用形状串扰校正是消除零件间串扰校正的一种方法。
此方法仅对测距模式和多区域扫描模式有效。
其原理如下:
•用户在最终的应用程序中使用一套遮罩眼镜描述串扰。所选的盖玻片应该代表整个生产范围,以便在分析中包含所有可能的串扰值。串扰数据被发送到ST,然后通用形状被计算并发送回客户。要使用通用形状串音校准,客户必须使用VL53L1_SetCalibrationData()函数将其加载到校准结构的串扰字段中。
•在零件之间的校准过程中,用户必须:
-执行refSPAD校准
-加载通用形状数据
-执行偏移校准
•在标准操作过程中,用户必须:
-载荷校准数据,包括通用形状
-启用实时串扰检测
-开始测距

获取串扰校准的结果

校准结果包括应用于SPAD阵列的一系列值。该系列值包含一个偏移量和两个坐标以及一个直方图结构体。
函数VL53L1_GetCalibrationData()允许接收所有校准数据。返回的结构VL53L1_CalibrationData_t包含另外两个结构体。第一个名为VL53L1_customer_nvm_managed_t,包含三个串扰校准结果:
•algo_crosstalk_compensation_plane_offset_kcps是一个7.9编码的定点值。它要除以512才能得到实际的数。
•algo_crosstalk_compensation_x_plane_gradient_kcps是一个固定点5.11编码值。要除以2048才能得到实际的数字。
•algo_crosstalk_compensation_y_plane_gradient_kcps是一个固定点5.11编码值。要除以2048才能得到实际的数字。
返回的另一个结构体名为VL53L1_xtalk_histogram_data_t。
该结构体包含重要的额外数据,如形状相位位置,因此串扰校正可以正确地重新调整形状,以满足不同的相位校准结果。
这种结构体,结合偏移量,x和y梯度,允许为ranging和multizone scanning模式生成串扰直方图。

设置串扰校准数据

客户可以在调用VL53L1_DataInit()和VL53L1_StaticInit()函数后通过VL53L1_SetCalibrationData()函数加载串扰校准数据。
最好先调用VL53L1_GetCalibrationData(),然后修改如下参数:
•algo__crosstalk_compensation_plane_offset_kcps
•algo__crosstalk_compensation_x_plane_gradient_kcps
•algo__crosstalk_compensation_y_plane_gradient_kcps
•xtalkhisto.xtalk_shape.zone_id
•xtalkhisto.xtalk_shape.time_stamp
•xtalkhisto.xtalk_shape.first_bin
•xtalkhisto.xtalk_shape.buffer_size
•xtalkhisto.xtalk_shape.number_of_bins
•xtalkhisto.xtalk_shape.bin_data [0]
•xtalkhisto.xtalk_shape.bin_data [1]
•xtalkhisto.xtalk_shape.bin_data [2]
•xtalkhisto.xtalk_shape.bin_data [3]
•xtalkhisto.xtalk_shape.bin_data [4]
•xtalkhisto.xtalk_shape.bin_data [5]
•xtalkhisto.xtalk_shape.bin_data [6]
•xtalkhisto.xtalk_shape.bin_data [7]
•xtalkhisto.xtalk_shape.bin_data [8]
•xtalkhisto.xtalk_shape.bin_data [9]
•xtalkhisto.xtalk_shape.bin_data [10]
•xtalkhisto.xtalk_shape.bin_data [11]
•xtalkhisto.xtalk_shape.phasecal_result__reference_phase
•xtalkhisto.xtalk_shape.phasecal_result__vcsel_start
•xtalkhisto.xtalk_shape.cal_config__vcsel_start
•xtalkhisto.xtalk_shape.vcsel_width
•xtalkhisto.xtalk_shape.fast_osc__frequency
•xtalkhisto.xtalk_shape.zero_distance_phase
在结构的值被修改之后,用户必须调用VL53L1_SetCalibrationData()。

使能串扰补偿

使能串扰补偿的函数为:VL53L1_SetXTalkCompensationEnable()。
调用VL53L1_SetXTalkCompensationEnable&VL53L1Dev, 0);禁用串扰补偿。
调用V53L1_SetXTalkCompensationEnable&VL53L1Dev, 1);启用串扰补偿。
注意:此函数不执行任何校准或串扰数据加载,它只是启用补偿功能而已。
注:校准或加载校准数据功能必须与启用/禁用功能分开调用。
注意:串扰补偿在默认情况下是禁用的。

串扰校准错误-22

如果系统未能找到有效的串扰值,则可能在校准后发出错误-22。
当使用标准串扰校准(针对高串扰的盖玻片)但是盖玻片却是低串扰的(高于5kcps),通常会出现这种错误。
在这种情况下,强烈建议使用全roi串扰校准。
如果不能进行完整的roi串扰校准,则不应应用串扰数据。
在出现错误的情况下,串音校准数据结构没有修改,可能包含错误数据。
建议用户将串扰校准数据设置为零,以确保虚假校准数据不影响测距。

偏移校准

将设备焊接到客户板上或添加盖板玻璃可以在测距距离中引入偏移。这种零件间的偏移量必须在偏移校准期间测量。
在偏移校准期间,dmax也自动校准。为偏置校准所建议的校准条件对于dmax校准也是最优的。

偏移校准函数

有三个函数可用于偏移校准:
•VL53L1_PerformOffsetCalibration (Dev,CalDistanceMilliMeter,CalReflectancePerCent)
仅适用于Autonomous或MultiZones scanning的预置模式
•VL53L1_PerformOffsetSimpleCalibration (Dev,CalDistanceMilliMeter)
只适用于Ranging预设模式
•VL53L1_PerformOffsetPerVCSELCalibration (Dev,CalDistanceMilliMeter)
给出最准确的结果,如果使用了几个距离模式,但只适用于Ranging模式。
函数的参数分别是目标距离(以毫米为单位)和反射率(以百分比为单位)。

偏移校准过程

客户必须使用校准图表,放置在给定的距离,以允许偏移校准。下表给出了建议设置的详细信息。
在这里插入图片描述

偏移校准选项

在自治模式或多区域扫描预设模式下,用户可以使用VL53L1_SetOffsetCalibrationMode()函数选择偏移校准选项。
该函数有以下选项:
•标准校准。这是默认设置。
•Pre-range。过时了。不应使用此模式。
•多区域校准。这使得multizones scanning模式下的测距精度得到提高。
注意,在调用校准函数之前,必须先设置roi。对给定的ROI配置进行校准。在测距过程中也必须使用相同的配置。

Offset correction options

在多区域扫描模式下,可以通过使用每个区域校准来改善偏移校正。
如果使用此选项进行校准,用户可以通过调用:
VL53L1_SetOffsetCorrectionMode()。
两种可能的选择是:
•VL53L1_OFFSETCORRECTIONMODE_STANDARD(默认)
•VL53L1_OFFSETCORRECTIONMODE_PERZONE

获取偏移校准的结果

函数VL53L1_GetCalibrationData()允许接收所有校准数据。返回的结构体VL53L1_CalibrationData_t包含另一个名为VL53L1_customer_nvm_managed_t的结构,它包含三个偏置校准的结果:
•algo__part_to_part_range_offset_mm
•mm_config__inner_offset_mm
•mm_config__outer_offset_mm
6.3.6 Setting offset calibration data
客户可以在调用VL53L1_DataInit()和VL53L1_StaticInit()函数后,通过使用VL53L1_SetCalibrationData()加载偏移校准数据。
最好是
1、调用VL53L1_GetCalibrationData ()
2、修改偏移校正选项中描述的三个参数和获取dmax校准结果中描述的参数
3、调用VL53L1_SetCalibrationData()。

校准的参考程序

//refSPAD, crosstalk, and offset
VL53L1_Error VL53L1x_Ref(VL53L1_Dev_t *dev)   //校准函数
{
	u8 i;
	VL53L1_Error Status = VL53L1_ERROR_NONE;
	
	LED_R_ON;
	LED_Y_ON;
	
	Status = VL53L1_WaitDeviceBooted(dev);
	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; }

	/* refSPAD校准 */
	Status = VL53L1_PerformRefSpadManagement(dev);                
	if(Status!=VL53L1_ERROR_NONE) { return Status; }
	
	/* crosstalk校准
	高串扰盖玻片使用VL53L1_XTALKCALIBRATIONMODE_NO_TARGET,低串扰盖玻片使用VL53L1_XTALKCALIBRATIONMODE_FULL_ROI 
	VL53L1_XTALKCALIBRATIONMODE_NO_TARGET:在无红外干扰的黑暗环境中进行,必须确保视场(FoV)小于80cm的范围内没有目标,盖玻片距离镜头小于50mm 
	VL53L1_XTALKCALIBRATIONMODE_FULL_ROI :在无红外干扰的黑暗环境中进行,将一个灰色目标(17%的反射率)放置在距设备600mm的距离*/
	Status = VL53L1_PerformXTalkCalibration(dev,VL53L1_XTALKCALIBRATIONMODE_FULL_ROI); 
	if(Status!=VL53L1_ERROR_NONE) { return Status; }

	/* offset校准
	在无红外干扰的黑暗环境中进行,将一个灰色目标(17%的反射率)放置在距设备140mm的距离*/	
	Status = VL53L1_PerformOffsetSimpleCalibration(dev,140); 
	if(Status!=VL53L1_ERROR_NONE) { return Status; }	

	Status = VL53L1_GetCalibrationData(dev,&Cali_Data);  
	if(Status!=VL53L1_ERROR_NONE) { return Status; }	
	
	Status = VL53L1_SetPresetMode(dev,VL53L1_PRESETMODE_RANGING);  
	if(Status!=VL53L1_ERROR_NONE) { return Status; }	

	Status = VL53L1_SetDistanceMode(dev,VL53L1_DISTANCEMODE_LONG);  //测量过程中会自动推荐模式
	if(Status!=VL53L1_ERROR_NONE) { return Status; }	
	
//	Status = VL53L1_SetXTalkCompensationEnable(dev, 1);               //启用串扰补偿功能
//	if(Status!=VL53L1_ERROR_NONE) { return Status; }
	
	Status = VL53L1_StartMeasurement(dev);
	if(Status!=VL53L1_ERROR_NONE) { return Status; }
	
	return Status;
}
  • 18
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
[UV2] ORGANIZATION="Microsoft" NAME="Microsoft", "ALIENTEK" EMAIL="277038235@qq.com" ARMSEL=1 BOOK0=UV3\RELEASE_NOTES.HTM("uVision Release Notes",GEN) [ARM] PATH="F:\\STM32MDK\\ARM\\" VERSION=3.80a PATH1="C:\Program Files\CodeSourcery\Sourcery G++ Lite\" CPUDLL0=SARM.DLL(TDRV0,TDRV5,TDRV6,TDRV8) # Drivers for ARM7/9 devices CPUDLL1=SARMCM3.DLL(TDRV1,TDRV3,TDRV4,TDRV5,TDRV7,TDRV8) # Drivers for Cortex-M devices BOOK0=HLP\RELEASE_NOTES.HTM("Release Notes",GEN) BOOK1=HLP\ARMTOOLS.chm("Complete User's Guide Selection",C) BOOK2=HLP\RL_RELEASE_NOTES.HTM("RTL-ARM Release Notes",GEN) BOOK3=HLP\RVI.chm("RV Compiler Introduction",GEN) BOOK4=C:\Program Files\CodeSourcery\Sourcery G++ Lite\share\doc\arm-2007q3-53-arm-none-eabi\pdf\gcc\gcc.pdf("GNU C Compiler",GEN) BOOK5=C:\Program Files\CodeSourcery\Sourcery G++ Lite\share\doc\arm-2007q3-53-arm-none-eabi\pdf\as.pdf("GNU Assembler",GEN) BOOK6=C:\Program Files\CodeSourcery\Sourcery G++ Lite\share\doc\arm-2007q3-53-arm-none-eabi\pdf\ld.pdf("GNU Linker",GEN) BOOK7=C:\Program Files\CodeSourcery\Sourcery G++ Lite\share\doc\arm-2007q3-53-arm-none-eabi\pdf\binutils.pdf("GNU Binary Utilities",GEN) TDRV0=BIN\UL2ARM.DLL("ULINK ARM Debugger") TDRV1=BIN\UL2CM3.DLL("ULINK Cortex Debugger") TDRV2=BIN\AGDIRDI.DLL("RDI Interface Driver") TDRV3=BIN\ABLSTCM.dll("Altera Blaster Cortex Debugger") TDRV4=BIN\lmidk-agdi.dll("Luminary Eval Board") TDRV5=Signum\SigUV3Arm.dll("Signum Systems JTAGjet") TDRV6=Segger\JLTAgdi.dll("J-LINK / J-TRACE") TDRV7=Segger\JL2CM3.dll("Cortex-M3 J-LINK") TDRV8=STLink\ST-LINKIII-KEIL.dll ("ST-Link Debugger") LIC0=EXJEV-PGITZ-RXIUD-8A562-3JTCY-2C6VU [ARMADS] PATH="F:\\STM32MDK\\ARM\\" PATH1="BIN40\"

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

【ql君】qlexcel

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

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

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

打赏作者

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

抵扣说明:

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

余额充值