概述
當(dāng)使用VL6180傳感器進(jìn)行測距時,可以通過修改縮放因子來改變可測量的距離范圍。VL6180是一種基于飛行時間原理的傳感器,通過測量光信號的往返時間來確定物體與傳感器之間的距離。
最近在弄ST和瑞薩RA的課程,需要樣片的可以加群申請:615061293 。
默認(rèn)情況下,VL6180傳感器的測距范圍約為0至200毫米。然而,通過調(diào)整縮放因子,您可以擴(kuò)展或縮小該范圍,以適應(yīng)不同的應(yīng)用需求。
縮放因子是一個乘法因子,用于調(diào)整傳感器的測量范圍。較小的縮放因子可以擴(kuò)展測距范圍,使傳感器能夠測量更遠(yuǎn)的距離,而較大的縮放因子可以縮小測距范圍,使傳感器適用于更近的測量。
要修改縮放因子,需要使用VL6180傳感器的控制接口與其進(jìn)行通信。通過發(fā)送適當(dāng)?shù)拿詈?a target="_blank">參數(shù),您可以設(shè)置所需的縮放因子值。具體的命令和參數(shù)取決于您使用的特定控制接口和驅(qū)動程序。
下面溫度可以得知,主要有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的文檔。在該文檔中,有一個案例展示了如何修改縮放方式。通過調(diào)用函數(shù)VL6180x_UpscaleSetScaling(myDev, 2),您可以將縮放因子設(shè)置為2,實(shí)現(xiàn)將測量范圍擴(kuò)大兩倍的效果。這個案例為您提供了一個具體的示例,可以幫助您了解如何在編程中使用該函數(shù)來修改縮放因子。
VL6180x_UpscaleSetScaling
在ST提供的en.STSW-IMG003.zip壓縮包中,vl6180x_api.c文件包含了VL6180x_UpscaleSetScaling函數(shù),這個函數(shù)是用來設(shè)置設(shè)備的測距縮放因子的。
當(dāng)設(shè)備進(jìn)行測量時,測距縮放因子會應(yīng)用于設(shè)備測得的原始距離,以擴(kuò)大測量范圍,但會犧牲一定的精度。
需要注意的是,在設(shè)備處于固件待機(jī)狀態(tài)(自由運(yùn)行)以外的狀態(tài)下修改縮放因子是不安全的。這可能導(dǎo)致誤報中斷、測距范圍錯誤等問題。
為了簡化和優(yōu)化原始函數(shù),并提供更清晰和易于理解的代碼結(jié)構(gòu)。去除不相關(guān)的部分,由于原始函數(shù)中的某些操作在新的函數(shù)中沒有被使用到,這些部分被去除以提高代碼的清晰度和可讀性。
修改后的代碼具有更簡潔、易讀和易于維護(hù)的結(jié)構(gòu),同時仍然保留了修改縮放因子所需的核心操作。這種修改的目的是使代碼更易于理解和實(shí)現(xiàn),并提供更好的可擴(kuò)展性和可重用性。
修改為所需要的函數(shù),如下所示:
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);
}
主函數(shù)
修改后的函數(shù)如下所示,修改縮放因子為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 */
測試結(jié)果
測試距離為20cm結(jié)果如下所示。
審核編輯:湯梓紅
-
傳感器
+關(guān)注
關(guān)注
2551文章
51097瀏覽量
753527 -
測距
+關(guān)注
關(guān)注
2文章
105瀏覽量
19644 -
TOF
+關(guān)注
關(guān)注
9文章
483瀏覽量
36349 -
stm32cubemx
+關(guān)注
關(guān)注
5文章
283瀏覽量
14807
發(fā)布評論請先 登錄
相關(guān)推薦
評論