基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(4)----测量环境光

描述

概述

在本章中,我们将介绍如何配置VL6180X传感器以测量环境光,并获取环境光的强度值。VL6180X是一种多功能、高性能的接近和环境光传感器,其环境光测量功能可以用于检测周围环境的亮度水平。
最近在弄ST和瑞萨RA的课程,需要样片的可以加群申请:6_15061293 。
模块
查看VL6180X手册可得知,VL6180X模块是内置了环境光感应(Ambient Light Sensing,ALS)功能的。ALS功能使得VL6180X不仅能够测量物体与传感器之间的距离,还能够检测周围环境的光照强度。
模块

样品申请

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

视频教程

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

video(video-xBRvtoF6-1689419585615)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=913388199)(image-https://img-blog.csdnimg.cn/img_convert/24f308bcc28d55fb5395548d0a23231c.jpeg)(title-基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(4)----测量环境光)

完整代码下载

https://download.csdn.net/download/qq_24312945/88051751

VL6180X传感器的测量流程

下图给出了vl6180x测量距离和环境光的驱动流程图,可以得知他们的测量方式是大同小异的。
需要注意的是,虽然距离测量和环境光测量的流程图在基本原理和操作步骤上是相似的,但在具体的配置和参数设置上可能存在差异。因此,在使用VL6180X进行距离测量和环境光测量时,需要根据具体的需求和应用场景,相应地配置和调整传感器的设置。
模块

ALS动态范围

ALS动态范围是指VL6180X传感器在不同增益设置下可以测量的光线范围。在VL6180X手册的表中,展示了在有和无玻璃情况下的各个增益下可测量的光线范围。
选择适当的增益设置对于获得准确的环境光测量结果至关重要。在大多数应用中,可以使用单个增益设置来进行操作,而无需在不同的增益之间切换。这样可以简化配置和使用过程,提高系统的稳定性和可靠性。
根据实际应用的需求,可以根据表中的数据选择最合适的增益设置。根据是否使用玻璃覆盖物,以及环境光的强度范围,可以确定在哪个增益下获得最佳的测量精度和范围。
模块

ALS动态范围

ALS动态范围是指VL6180X传感器在不同增益设置下可以测量的光线范围。在VL6180X手册的表中,展示了在有和无玻璃情况下的各个增益下可测量的光线范围。
选择适当的增益设置对于获得准确的环境光测量结果至关重要。在大多数应用中,可以使用单个增益设置来进行操作,而无需在不同的增益之间切换。这样可以简化配置和使用过程,提高系统的稳定性和可靠性。
根据实际应用的需求,可以根据表中的数据选择最合适的增益设置。根据是否使用玻璃覆盖物,以及环境光的强度范围,可以确定在哪个增益下获得最佳的测量精度和范围。
模块

可以通过设置SYSALS__ANALOGUE_GAIN(0x03F)来配置模拟增益。根据实际需求和环境条件,选择适当的增益值非常重要。建议在调整增益时进行实际测试,以找到最佳的平衡点,以获得所需的性能和图像质量。记住,过高的增益可能会引入噪声,对测量产生不利影响。
模块

测量流程

具体流程如下所示:

  1. 开始单次环境光测量:应用调谐设置后,将值0b100写入寄存器的位[5:3](寄存器0x0014),以启动单次环境光测量。
  2. 等待测量完成:等待测量完成。您可以根据实际需求决定等待的时间。
  3. 从寄存器0x0040读取数据,并清除位[0],然后将值0x31写入寄存器0x0041。
  4. 将值0b1(二进制)写入寄存器0x0038的位[0]。
  5. 从寄存器0x004F的位[5:3]中读取数值,并且该数值为0b100跳出循环,否则等待。
  6. 从寄存器0x0050读取2个字节的数值,这个数值代表环境光强度的测量结果。
  7. 将值0b111(二进制)写入寄存器0x0015的位[2:0]。
    以上是获取光强的简要概述,根据您的实际需求,可能需要更详细的代码和配置。请参考VL6180X传感器的相关文档和手册,以获取更多详细的信息和编程指南。
    模块

光强计算公式

"ALS count to lux conversion" 指的是将环境光传感器的输出值(一个16位计数值)转换为光照强度(单位为勒克斯)的过程,由上一步的流程进行获取。
工厂校准的ALS光照分辨率是0.32(lux/count),适用于模拟增益为1且积分时间为100毫秒的情况(在无玻璃覆盖的条件下进行校准)。计算公式如下所示。
模块
读取lux代码参考如下所示。

float VL6180X_Read_Lux(uint8_t add,uint8_t Gain)
{
	float lux;
	static uint8_t reg;
	reg = VL6180X_ReadByte(add,VL6180X_REG_SYSTEM_INTERRUPT_CONFIG);
	reg &= ~0x38;		//[5:3]清0
	reg |= (0x4< < 3);	//开启转换New sample ready	开启转换
	
	VL6180X_WriteByte(add,VL6180X_REG_SYSALS_INTEGRATION_PERIOD_HI,0);
	VL6180X_WriteByte(add,VL6180X_REG_SYSALS_INTEGRATION_PERIOD_LO,100);	//101ms
	if (Gain > VL6180X_ALS_GAIN_40)
	{
		Gain = VL6180X_ALS_GAIN_40;
	}
	VL6180X_WriteByte(add,VL6180X_REG_SYSALS_ANALOGUE_GAIN, 0x40 | Gain);
	VL6180X_WriteByte(add,VL6180X_REG_SYSALS_START, 0x1);	//连续模式
	// New Sample Ready threshold event 新样本就绪
	while (4 != ((VL6180X_ReadByte(add,VL6180X_REG_RESULT_INTERRUPT_STATUS_GPIO) > > 3) & 0x7));
	
	lux = VL6180X_Read_HalfWold(add,VL6180X_REG_RESULT_ALS_VAL);
	VL6180X_WriteByte(add,VL6180X_REG_SYSTEM_INTERRUPT_CLEAR,0x07);	//0111b 清除了三种中断标志
	//矫正增益算法
	lux *= 0.32f; // calibrated count/lux
	switch(Gain) { 
	case VL6180X_ALS_GAIN_1: 
	break;
	case VL6180X_ALS_GAIN_1_25: 
	lux /= 1.25f;
	break;
	case VL6180X_ALS_GAIN_1_67: 
	lux /= 1.67f;
	break;
	case VL6180X_ALS_GAIN_2_5: 
	lux /= 2.5f;
	break;
	case VL6180X_ALS_GAIN_5: 
	lux /= 5;
	break;
	case VL6180X_ALS_GAIN_10: 
	lux /= 10;
	break;
	case VL6180X_ALS_GAIN_20: 
	lux /= 20;
	break;
	case VL6180X_ALS_GAIN_40: 
	lux /= 40;
	break;
	}
	lux *= 100;
	lux /= 100; // integration time in ms
	return lux;
}

配置vl6180x

在对应的demo板子中,使用U6进行光强读取。
模块

初始化配置如下所示。

/* USER CODE BEGIN 2 */

	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);	
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);	

	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);	
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);	

	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);	
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);	
	
	
//VL6180_4
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);	
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
uint8_t ii;
uint8_t id;
	HAL_Delay(1);

/************修改VL6180_4地址为VL6180X_DEFAULT_I2C_ADDR4(0x2C)*********************/
	VL6180X_Init(VL6180X_DEFAULT_I2C_ADDR1);
	VL6180X_WriteByte(VL6180X_DEFAULT_I2C_ADDR1,0x0212,VL6180X_DEFAULT_I2C_ADDR4);
//	HAL_Delay(100);
	ii=VL6180X_ReadByte(VL6180X_DEFAULT_I2C_ADDR4,0x0212);	
	printf("VL6180_4地址为=0x%Xn",ii);		
	VL6180x_UpscaleSetScaling(VL6180X_DEFAULT_I2C_ADDR4,3);//缩放x3
	id=VL6180X_Read_ID(VL6180X_DEFAULT_I2C_ADDR4);
	printf("VL6180_4 id=%dn",id);	

/************修改VL6180_3地址为VL6180X_DEFAULT_I2C_ADDR3(0x2B)*********************/
//VL6180_3
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);	
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);
	HAL_Delay(1);
	VL6180X_Init(VL6180X_DEFAULT_I2C_ADDR1);
	VL6180X_WriteByte(VL6180X_DEFAULT_I2C_ADDR1,0x0212,VL6180X_DEFAULT_I2C_ADDR3);
	ii=VL6180X_ReadByte(VL6180X_DEFAULT_I2C_ADDR3,0x0212);	
	printf("VL6180_3地址为=0x%Xn",ii);		
	VL6180x_UpscaleSetScaling(VL6180X_DEFAULT_I2C_ADDR3,3);//缩放x3
	id=VL6180X_Read_ID(VL6180X_DEFAULT_I2C_ADDR3);
	printf("VL6180_3 id=%dn",id);

  /* USER CODE END 2 */

循环读取代码如下所示。

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		VL6180_L4=VL6180X_Read_Range(VL6180X_DEFAULT_I2C_ADDR4);
		printf("VL6180_L4=%dmmn",VL6180_L4*3);
			
		lux_L3=VL6180X_Read_Lux(VL6180X_DEFAULT_I2C_ADDR3,VL6180X_ALS_GAIN_40);
		printf("lux=%lfn",lux_L3);				
		VL6180_L3=VL6180X_Read_Range(VL6180X_DEFAULT_I2C_ADDR3);
		printf("VL6180_L3=%dmmn",VL6180_L3*3);			
		
		HAL_Delay(1000);			

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

测试结果

测试距离和光强结果如下所示。
模块

设置VL6180X_ALS_GAIN_40读取,给强光情况下读数如下所示。

模块

是符合手册给出的范围的。

模块

审核编辑:汤梓红

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分