概述
在本章中,我們將介紹如何配置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)來配置模擬增益。根據實際需求和環境條件,選擇適當的增益值非常重要。建議在調整增益時進行實際測試,以找到最佳的平衡點,以獲得所需的性能和圖像質量。記住,過高的增益可能會引入噪聲,對測量產生不利影響。
測量流程
具體流程如下所示:
- 開始單次環境光測量:應用調諧設置后,將值0b100寫入寄存器的位[5:3](寄存器0x0014),以啟動單次環境光測量。
- 等待測量完成:等待測量完成。您可以根據實際需求決定等待的時間。
- 從寄存器0x0040讀取數據,并清除位[0],然后將值0x31寫入寄存器0x0041。
- 將值0b1(二進制)寫入寄存器0x0038的位[0]。
- 從寄存器0x004F的位[5:3]中讀取數值,并且該數值為0b100跳出循環,否則等待。
- 從寄存器0x0050讀取2個字節的數值,這個數值代表環境光強度的測量結果。
- 將值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讀取,給強光情況下讀數如下所示。
是符合手冊給出的范圍的。
審核編輯:湯梓紅
-
傳感器
+關注
關注
2561文章
52198瀏覽量
761678 -
模塊
+關注
關注
7文章
2771瀏覽量
49040 -
TOF
+關注
關注
9文章
493瀏覽量
36977 -
stm32cubemx
+關注
關注
5文章
286瀏覽量
15850
發布評論請先 登錄
相關推薦
基于STM32CUBEMX驅動TOF模塊VL6180與VL6180X(2)----修改測量范圍

基于STM32CUBEMX驅動TOF模塊VL6180與VL6180X(3)----修改設備地址

基于STM32CUBEMX驅動TOF模塊VL6180與VL6180X(5)----驅動多個VL6180X

VL6180x單次測量范圍測量后的系統錯誤代碼
尋找手冊中引用的F401和VL6180板的mbed資源
VL6180X包含多少個傳感器?
VL6180X操作如何測量距離
VL6180X:什么是線性誤差率?
VL6180X范圍偏移怎么更改
VL6180X增加了范圍
近距離測量VL6180X錯誤
請問VL6180X的基本功能有哪些?
Vl6180x 官方蓋玻片模型的使用
使用VL6180X ToF傳感器與Particle Argon控制伺服器

基于STM32CUBEMX驅動TOF模塊VL6180與VL6180X(1)----單模塊距離獲取的最佳實踐

評論