概述
當使用VL6180傳感器進行測距時,可以通過修改縮放因子來改變可測量的距離范圍。VL6180是一種基于飛行時間原理的傳感器,通過測量光信號的往返時間來確定物體與傳感器之間的距離。
最近在弄ST和瑞薩RA的課程,需要樣片的可以加群申請:615061293 。
默認情況下,VL6180傳感器的測距范圍約為0至200毫米。然而,通過調整縮放因子,您可以擴展或縮小該范圍,以適應不同的應用需求。
縮放因子是一個乘法因子,用于調整傳感器的測量范圍。較小的縮放因子可以擴展測距范圍,使傳感器能夠測量更遠的距離,而較大的縮放因子可以縮小測距范圍,使傳感器適用于更近的測量。
要修改縮放因子,需要使用VL6180傳感器的控制接口與其進行通信。通過發送適當的命令和參數,您可以設置所需的縮放因子值。具體的命令和參數取決于您使用的特定控制接口和驅動程序。
下面溫度可以得知,主要有3種縮放,測量距離分別到20cm、40cm、60cm。
視頻教程
https://www.bilibili.com/video/BV1Mj411S7p3/
樣品申請
https://www.wjx.top/vm/OhcKxJk.aspx#
完整代碼下載
[https://download.csdn.net/download/qq_24312945/87945856
修改縮放因子
在ST提供的en.STSW-IMG003.zip壓縮包中,可以找到一個名為CodeSamples_UM.pdf的文檔。在該文檔中,有一個案例展示了如何修改縮放方式。通過調用函數VL6180x_UpscaleSetScaling(myDev, 2),您可以將縮放因子設置為2,實現將測量范圍擴大兩倍的效果。這個案例為您提供了一個具體的示例,可以幫助您了解如何在編程中使用該函數來修改縮放因子。
VL6180x_UpscaleSetScaling
在ST提供的en.STSW-IMG003.zip壓縮包中,vl6180x_api.c文件包含了VL6180x_UpscaleSetScaling函數,這個函數是用來設置設備的測距縮放因子的。
當設備進行測量時,測距縮放因子會應用于設備測得的原始距離,以擴大測量范圍,但會犧牲一定的精度。
需要注意的是,在設備處于固件待機狀態(自由運行)以外的狀態下修改縮放因子是不安全的。這可能導致誤報中斷、測距范圍錯誤等問題。
為了簡化和優化原始函數,并提供更清晰和易于理解的代碼結構。去除不相關的部分,由于原始函數中的某些操作在新的函數中沒有被使用到,這些部分被去除以提高代碼的清晰度和可讀性。
修改后的代碼具有更簡潔、易讀和易于維護的結構,同時仍然保留了修改縮放因子所需的核心操作。這種修改的目的是使代碼更易于理解和實現,并提供更好的可擴展性和可重用性。
修改為所需要的函數,如下所示:
uint8_t scaling;
// RANGE_SCALER values for 1x, 2x, 3x scaling - see STSW-IMG003 core/src/vl6180x_api.c (ScalerLookUP[])
static uint16_t const ScalerValues[] = {0, 253, 127, 84};
void VL6180x_UpscaleSetScaling(uint8_t add,uint8_t new_scaling)
{
uint8_t const DefaultCrosstalkValidHeight = 20; // default value of SYSRANGE__CROSSTALK_VALID_HEIGHT
// do nothing if scaling value is invalid
if (new_scaling < 1 || new_scaling > 3)
{ return; }
scaling = new_scaling;
VL6180X_WriteByte_16Bit(add,RANGE_SCALER,ScalerValues[scaling]);
// apply scaling on part-to-part offset
VL6180X_WriteByte(add,SYSRANGE__PART_TO_PART_RANGE_OFFSET,ptp_offset / scaling);
// apply scaling on CrossTalkValidHeight
// writeReg(VL6180X::SYSRANGE__CROSSTALK_VALID_HEIGHT, DefaultCrosstalkValidHeight / scaling);
VL6180X_WriteByte(add,SYSRANGE__CROSSTALK_VALID_HEIGHT, DefaultCrosstalkValidHeight / scaling);
// This function does not apply scaling to RANGE_IGNORE_VALID_HEIGHT.
// enable early convergence estimate only at 1x scaling
// uint8_t rce = readReg(VL6180X::SYSRANGE__RANGE_CHECK_ENABLES);
// writeReg(VL6180X::SYSRANGE__RANGE_CHECK_ENABLES, (rce & 0xFE) | (scaling == 1));
uint8_t rce=VL6180X_ReadByte(add,SYSRANGE__RANGE_CHECK_ENABLES);
VL6180X_WriteByte(add,SYSRANGE__CROSSTALK_VALID_HEIGHT, DefaultCrosstalkValidHeight / scaling);
}
主函數
修改后的函數如下所示,修改縮放因子為x2。
/* USER CODE BEGIN 2 */
printf("111");
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_5, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
HAL_Delay(1);
VL6180X_Init(VL6180X_DEFAULT_I2C_ADDR1);
VL6180x_UpscaleSetScaling(VL6180X_DEFAULT_I2C_ADDR1,2);//縮放x2
uint8_t id=VL6180X_Read_ID(VL6180X_DEFAULT_I2C_ADDR1);
printf("id=%d",id);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
VL6180_L1=VL6180X_Read_Range(VL6180X_DEFAULT_I2C_ADDR1);
printf("VL6180_L1=%dmmn",VL6180_L1*2);
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
測試結果
測試距離為20cm結果如下所示。
審核編輯:湯梓紅
-
傳感器
+關注
關注
2553文章
51407瀏覽量
756631 -
測距
+關注
關注
2文章
105瀏覽量
19741 -
TOF
+關注
關注
9文章
485瀏覽量
36479 -
stm32cubemx
+關注
關注
5文章
284瀏覽量
15006
發布評論請先 登錄
相關推薦
評論