在本章中,我们将介绍如何配置VL6180X传感器以测量环境光,并获取环境光的强度值。VL6180X是一种多功能、高性能的接近和环境光传感器,其环境光测量功能可以用于检测周围环境的亮度水平。
查看VL6180X手册可得知,VL6180X模块是内置了环境光感应(Ambient Light Sensing,ALS)功能的。ALS功能使得VL6180X不仅能够测量物体与传感器之间的距离,还能够检测周围环境的光照强度。
https://www.wjx.top/vm/OhcKxJk.aspx#
下图给出了vl6180x测量距离和环境光的驱动流程图,可以得知他们的测量方式是大同小异的。
需要注意的是,虽然距离测量和环境光测量的流程图在基本原理和操作步骤上是相似的,但在具体的配置和参数设置上可能存在差异。因此,在使用VL6180X进行距离测量和环境光测量时,需要根据具体的需求和应用场景,相应地配置和调整传感器的设置。
ALS动态范围是指VL6180X传感器在不同增益设置下可以测量的光线范围。在VL6180X手册的表中,展示了在有和无玻璃情况下的各个增益下可测量的光线范围。
选择适当的增益设置对于获得准确的环境光测量结果至关重要。在大多数应用中,可以使用单个增益设置来进行操作,而无需在不同的增益之间切换。这样可以简化配置和使用过程,提高系统的稳定性和可靠性。
根据实际应用的需求,可以根据表中的数据选择最合适的增益设置。根据是否使用玻璃覆盖物,以及环境光的强度范围,可以确定在哪个增益下获得最佳的测量精度和范围。
ALS动态范围是指VL6180X传感器在不同增益设置下可以测量的光线范围。在VL6180X手册的表中,展示了在有和无玻璃情况下的各个增益下可测量的光线范围。
选择适当的增益设置对于获得准确的环境光测量结果至关重要。在大多数应用中,可以使用单个增益设置来进行操作,而无需在不同的增益之间切换。这样可以简化配置和使用过程,提高系统的稳定性和可靠性。
根据实际应用的需求,可以根据表中的数据选择最合适的增益设置。根据是否使用玻璃覆盖物,以及环境光的强度范围,可以确定在哪个增益下获得最佳的测量精度和范围。
可以通过设置SYSALS__ANALOGUE_GAIN(0x03F)来配置模拟增益。根据实际需求和环境条件,选择适当的增益值非常重要。建议在调整增益时进行实际测试,以找到最佳的平衡点,以获得所需的性能和图像质量。记住,过高的增益可能会引入噪声,对测量产生不利影响。
具体流程如下所示:
“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;
}
初始化配置如下所示。
/* 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%X\n",ii);
VL6180x_UpscaleSetScaling(VL6180X_DEFAULT_I2C_ADDR4,3);//缩放x3
id=VL6180X_Read_ID(VL6180X_DEFAULT_I2C_ADDR4);
printf("VL6180_4 id=%d\n",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%X\n",ii);
VL6180x_UpscaleSetScaling(VL6180X_DEFAULT_I2C_ADDR3,3);//缩放x3
id=VL6180X_Read_ID(VL6180X_DEFAULT_I2C_ADDR3);
printf("VL6180_3 id=%d\n",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=%dmm\n",VL6180_L4*3);
lux_L3=VL6180X_Read_Lux(VL6180X_DEFAULT_I2C_ADDR3,VL6180X_ALS_GAIN_40);
printf("lux=%lf\n",lux_L3);
VL6180_L3=VL6180X_Read_Range(VL6180X_DEFAULT_I2C_ADDR3);
printf("VL6180_L3=%dmm\n",VL6180_L3*3);
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
设置VL6180X_ALS_GAIN_40读取,给强光情况下读数如下所示。
是符合手册给出的范围的。