stm32模块使用之vl53测距模块

Posted thesoch

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32模块使用之vl53测距模块相关的知识,希望对你有一定的参考价值。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文主要做一下如何使用vl53的说明倾向于使用轮询方式。

一、vl53通信方式?

vl53模块和stm32可以通过管脚模拟I2C方式进行通信。
I2C具体方式为四根线,两根电源线接5v、GND,剩下两根一根是时序线SCL,另一根为数据线SDA.
这里我们通常选取两个本来不用的管脚去模拟SDL、SDA两根线。

二、具体使用方式

1. 初始化

VL53L1_Error VL53L1Init(VL53L1_Dev_t* pDev)
{

			VL53L1_Error Status = VL53L1_ERROR_NONE;
			pDev->I2cDevAddr=0x52;//默认地址
			pDev->comms_type=1;//默认通信模式
			pDev->comms_speed_khz = 400;//通信速率(可到400hz)
			pDev->Devnumber = 0;
	    VL53L1_GetDeviceInfo(pDev,&info_X);
			Status = VL53L1_WaitDeviceBooted(pDev);//启动设备,如在这一步出错,请检查线路连接是否正常,特别是电源线是否连接
	   // times_X = 0;//设置读取错误次数为0
			if(Status!=VL53L1_ERROR_NONE)
		{
			printf("Wait device Boot failed!\\r\\n");
			return Status;
		}
		else printf("device Boot success!");
		 HAL_Delay(2);

		Status = VL53L1_DataInit(pDev);//device init
		if(Status!=VL53L1_ERROR_NONE) 
		{
			printf("datainit failed!\\r\\n");
			return Status;
		}
  	else printf("device datainit success!");
		HAL_Delay(2);
		Status = VL53L1_StaticInit(pDev);
		if(Status!=VL53L1_ERROR_NONE) 
		{
			printf("static init failed!\\r\\n");
			return Status;
		}
		HAL_Delay(2);
		Status = VL53L1_SetDistanceMode(pDev, VL53L1_DISTANCEMODE_LONG);	//short,medium,long
		if(Status!=VL53L1_ERROR_NONE) 
		{
			printf("set discance mode failed!\\r\\n");
			return Status;
		}
		Status = VL53L1_StartMeasurement(pDev);
	if(Status!=VL53L1_ERROR_NONE) 
	{
		printf("start measurement failed!\\r\\n");
		return Status;
	}
	else printf("measurement success!");

		HAL_Delay(2);
		return Status;

}

2. 设置使用模式

VL53L1_Error VL53InitParam(VL53L1_Dev_t* pDev,uint8_t mode)
{

		VL53L1_Error status = VL53L1_ERROR_NONE;
    //4个限制
    status = VL53L1_SetLimitCheckEnable(pDev,VL53L1_CHECKENABLE_SIGMA_FINAL_RANGE,1);//sigma--standard deviation, enable SIGMA limit check
	if(status!=VL53L1_ERROR_NONE) 
		return status;
    HAL_Delay(2);
	status = VL53L1_SetLimitCheckEnable(pDev,VL53L1_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,1);//signal--amplitude of the signal-
																																												//-reflected. enable signal rate limit check
	if(status!=VL53L1_ERROR_NONE) 
		return status;
	
	
	HAL_Delay(2);
	status = VL53L1_SetLimitCheckValue(pDev,VL53L1_CHECKENABLE_SIGMA_FINAL_RANGE,Mode_data[mode].sigmaLimit);//set SIGMA limit
	if(status!=VL53L1_ERROR_NONE) 
		return status;
	
	
	HAL_Delay(2);
	status = VL53L1_SetLimitCheckValue(pDev,VL53L1_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,Mode_data[mode].signalLimit);//set signal rate limit
	if(status!=VL53L1_ERROR_NONE) 
		return status;
    //4个限制值设置完成
    
    
    status = VL53L1_SetMeasurementTimingBudgetMicroSeconds(pDev,Mode_data[mode].timingBudget);//set the max interval for a whole diatance test
	if(status!=VL53L1_ERROR_NONE) 
		return status;
	HAL_Delay(2);
	status = VL53L1_SetInterMeasurementPeriodMilliSeconds(pDev, 300);
	if(status!=VL53L1_ERROR_NONE) 
	{
		printf("SetInterMeasurementPeriodMilliSeconds failed!\\r\\n");
		return status;
	}
	HAL_Delay(2);
	status = VL53L1_StartMeasurement(pDev);//更关键的是这一步,启动测量模式
	if(status!=VL53L1_ERROR_NONE) 
	{
		printf("start measurement failed!\\r\\n");
		return status;
	}
	else printf("measurement success!");
    return status; 

}

3. 获取距离

VL53L1_Error getDistance(VL53L1_Dev_t* pDev)
{
   
		VL53L1_Error status = VL53L1_ERROR_NONE;
    uint8_t isDataReady=1;
//    status = VL53L1_WaitMeasurementDataReady(pDev);
	 const Drive_times* chassis_time = get_chassis_times_Point(); 

    status = VL53L1_GetMeasurementDataReady(pDev,&isDataReady);//等待测量的数据准备好
    if(status!=VL53L1_ERROR_NONE) 
	{
		printf("Wait too long!\\r\\n");
//		times_X++;
		return status;
	}
//	else printf("Wait success!");
    if(!isDataReady)
    {
        flag++;
        return -7;
    }
    status = VL53L1_GetRangingMeasurementData(pDev, &result_data_X);
    distance = result_data_X.RangeMilliMeter;//得到距离测量值
		
    status = VL53L1_ClearInterruptAndStartMeasurement(pDev);
    return status;
	
}

4.问题

1.vl53是测量一个面,要搞清楚自己对于测距的真正需求
2.使用I2C就要保证vl53和板子要能在同时序下进行信息交互,所以要做好I2C_delay设置,即以下代码中的i的初值设定。

static void IIC_delay(void)
{
    uint16_t i=7;//针对168Mhz主频运行速率的延时
   while(i)
   {
     i--;
   }
}

总结

这里的vl53只是粗浅的使用,希望大家指正。

以上是关于stm32模块使用之vl53测距模块的主要内容,如果未能解决你的问题,请参考以下文章

stm32模块使用之vl53测距模块

stm32模块使用之vl53测距模块

stm32+VL53L0x-激光测距实验工程(工程还在完善需要的话在下方评论处留下邮箱)

[激光原理与应用-43]:《光电检测技术-10》- 激光测距原理方案与案例分析:TOF VL53L0X模块

STM32F103实现激光测距传感器测距WT-VL53L0 L1

STM32F103实现激光测距传感器测距WT-VL53L0 L1