概述
VL6180X是基于ST FlightSense?專利技術(shù)的最新產(chǎn)品。作為一項(xiàng)突破性技術(shù),它實(shí)現(xiàn)了獨(dú)立于目標(biāo)反射率的絕對(duì)距離測(cè)量。傳統(tǒng)的測(cè)量方法通過測(cè)量反射光的光量來估算距離,然而這種方法存在一個(gè)主要缺點(diǎn),即被測(cè)物體的顏色和表面特性對(duì)測(cè)量精度產(chǎn)生很大影響。VL6180X采用了一種全新的方法,它精確測(cè)量了光線從傳感器照射到最近物體,并在反射回傳感器所需的時(shí)間(即飛行時(shí)間),從而準(zhǔn)確計(jì)算出兩者之間的距離。
VL6180X模塊集成了一個(gè)紅外發(fā)射器、一個(gè)紅外傳感器和一個(gè)環(huán)境光傳感器,全部封裝在一個(gè)便于集成的三合一回流焊封裝中。這種設(shè)計(jì)使終端產(chǎn)品制造商能夠減少光學(xué)和機(jī)械設(shè)計(jì)的優(yōu)化過程,并降低相關(guān)成本。 該模塊具備低功耗操作的特點(diǎn)。測(cè)距和環(huán)境光感應(yīng)(ALS)測(cè)量可以在用戶定義的時(shí)間間隔內(nèi)自動(dòng)執(zhí)行。此外,它支持多種門限和中斷方案,以最大程度地減少主機(jī)操作的需要。 主機(jī)控制和結(jié)果讀取是通過I2C接口實(shí)現(xiàn)的,方便快捷。此外,VL6180X還提供兩個(gè)可編程的GPIO引腳,用于可選的附加功能,例如測(cè)量準(zhǔn)備和門限中斷。 通過以上的優(yōu)化和擴(kuò)寫,文案更加詳細(xì)地描述了VL6180X模塊的工作原理、集成設(shè)計(jì)的優(yōu)勢(shì)以及支持的功能和接口。這些信息可以幫助讀者更好地了解該模塊的特性和應(yīng)用價(jià)值。 最近在弄ST和瑞薩RA的課程,需要樣片的可以加群申請(qǐng):6_15061293 。
視頻教程
[https://www.bilibili.com/video/BV1tX4y1q7Zj/]
樣品申請(qǐng)
[https://www.wjx.top/vm/OhcKxJk.aspx#]
完整代碼下載
[https://download.csdn.net/download/qq_24312945/87945855]
所有功能
- 三合一智能光學(xué)模塊
- 接近傳感器
- 環(huán)境光傳感器
- VCSEL光源
- 快速,精確測(cè)距
- 絕對(duì)測(cè)量范圍從0到超過10 cm(10cm以上的測(cè)距取決于具體情況)
- 不受目標(biāo)反射率影響
- 環(huán)境光抑制
- 蓋片的串?dāng)_補(bǔ)償
- 蓋片的串?dāng)_補(bǔ)償
- 主機(jī)系統(tǒng)可以用距離和信號(hào)電平實(shí)現(xiàn)手勢(shì)識(shí)別
- 可用演示系統(tǒng):P-NUCLEO-6180X1 評(píng)估板
- 環(huán)境光傳感器
- 高動(dòng)態(tài)范圍
- 精確/超低光敏感
- 校準(zhǔn)輸出值(以勒克斯為單位)
- 方便集成
- 單回流焊元件
- 無附加光學(xué)元件
- 單電源
- 用于器件控制和數(shù)據(jù)的I2C接口
- 提供一個(gè)文檔化的C可移植 API(應(yīng)用程序接口)
- 兩個(gè)可編程GPIO
- 測(cè)距和ALS的窗口和門限功能
技術(shù)規(guī)范
該模塊的供電要求為2.8V,適合于低電壓應(yīng)用場(chǎng)景。它通過I2C接口進(jìn)行主機(jī)控制和數(shù)據(jù)通信,方便與其他設(shè)備的集成。支持最大快速模式速率,達(dá)到400k,確保高效的數(shù)據(jù)傳輸。 此外,VL6180X模塊具備出色的光照強(qiáng)度檢測(cè)能力,覆蓋了廣泛的光照強(qiáng)度范圍。從微弱的1 Lux到高達(dá)100 kLux的光照強(qiáng)度,該模塊能夠準(zhǔn)確測(cè)量環(huán)境的光照水平。這使得它在需要實(shí)時(shí)監(jiān)測(cè)光照條件的應(yīng)用中非常有用,例如室內(nèi)照明控制、自動(dòng)調(diào)節(jié)顯示亮度等。 最后,VL6180X模塊具有一個(gè)默認(rèn)地址為0x29的設(shè)備地址,這樣在多個(gè)I2C設(shè)備共享同一總線時(shí),可以輕松管理和區(qū)分不同的模塊。
接口
vl6180模塊接口的示意圖如下所示。
接口說明
最小系統(tǒng)圖
生成STM32CUBEMX
用STM32CUBEMX生成例程,這里使用MCU為STM32G030C8。 配置時(shí)鐘樹,配置時(shí)鐘為64M。
串口配置
查看原理圖,PA9和PA10設(shè)置為開發(fā)板的串口。
配置串口。
IIC配置
在這個(gè)應(yīng)用中,VL6180模塊通過I2C(IIC)接口與主控器通信。具體來說,VL6180模塊的I2C引腳連接到主控器的PB6(引腳B6)和PB7(引腳B7)兩個(gè)IO口。 這種連接方式確保了模塊與主控器之間的可靠數(shù)據(jù)傳輸和通信。PB6作為I2C總線的串行數(shù)據(jù)線(SDA),負(fù)責(zé)數(shù)據(jù)的傳輸和接收。而PB7則充當(dāng)I2C總線的串行時(shí)鐘線(SCL),用于同步數(shù)據(jù)傳輸?shù)臅r(shí)序。
配置IIC為快速模式,速度為400k。
串口重定向
打開魔術(shù)棒,勾選MicroLIB
在main.c中,添加頭文件,若不添加會(huì)出現(xiàn) identifier "FILE" is undefined報(bào)錯(cuò)。
/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */
函數(shù)聲明和串口重定向:
/* USER CODE BEGIN PFP */
int fputc(int ch, FILE *f){
HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END PFP */
模塊片選
根據(jù)提供的表格信息,我們可以得知VL6180模塊的GPIO0/CE引腳用作片選腳(Chip Enable),在需要使用該功能時(shí),需要給該引腳一個(gè)高電平信號(hào)。 確保在使用GPIO0/CE引腳時(shí),正確設(shè)置引腳的電平狀態(tài),并按照VL6180模塊的規(guī)格和要求進(jìn)行相應(yīng)的配置和操作。這將確保模塊按照預(yù)期工作,并滿足特定的功能需求。
下面為模塊啟動(dòng)時(shí)序圖。
模塊地址
VL6180模塊的默認(rèn)設(shè)備地址為0x29。設(shè)備地址是用來識(shí)別和通信特定設(shè)備的標(biāo)識(shí)符。通過將VL6180模塊的設(shè)備地址設(shè)置為0x29,您可以確保與該模塊進(jìn)行正常的通信和控制。
雖然VL6180模塊的默認(rèn)設(shè)備地址為0x29,但可以通過使用I2C_SLAVE__DEVICE_ADDRESS {0x212}來修改模塊的設(shè)備地址。 通過修改設(shè)備地址,可以為VL6180模塊指定一個(gè)與默認(rèn)地址不同的唯一地址。這種靈活性使您能夠在同一I2C總線上連接多個(gè)VL6180X模塊或與其他設(shè)備進(jìn)行通信,而無需擔(dān)心地址沖突的問題。
讀寫位
在I2C總線上,由于可能連接多個(gè)設(shè)備,主設(shè)備在傳輸有效數(shù)據(jù)之前需要指定從設(shè)備的地址。大多數(shù)從設(shè)備使用7位地址,而一些設(shè)備支持10位地址尋址。主設(shè)備在需要發(fā)送或接收數(shù)據(jù)時(shí),首先發(fā)送所需從設(shè)備的地址,并匹配總線上掛載的從設(shè)備的地址。然后,主設(shè)備可以將數(shù)據(jù)發(fā)送到SDA數(shù)據(jù)線上。 緊隨地址的第8位是數(shù)據(jù)方向位(R/W),其中'0'表示發(fā)送(寫入),'1'表示請(qǐng)求數(shù)據(jù)(讀?。?對(duì)于VL6180模塊,默認(rèn)的7位地址是0x29(二進(jìn)制為010 1001),加上寫位后為0x52(二進(jìn)制為0101 0010),加上讀位后為0x53(二進(jìn)制為0101 0011)。 這意味著當(dāng)主設(shè)備與VL6180模塊進(jìn)行通信時(shí),要發(fā)送0x52地址字節(jié)進(jìn)行寫操作,或發(fā)送0x53地址字節(jié)進(jìn)行讀取操作。
extern I2C_HandleTypeDef hi2c1;
void VL6180X_WriteByte(uint8_t add,uint16_t reg,uint8_t data)
{
HAL_I2C_Mem_Write(&hi2c1 ,(add< < 1)|0,reg,I2C_MEMADD_SIZE_16BIT,&data,1,0xffff);
}
void VL6180X_WriteByte_16Bit(uint8_t add,uint16_t reg,uint16_t data)
{
uint8_t data2[2]={0,0};
data2[0]=data > >8;
data2[1]=data;
HAL_I2C_Mem_Write(&hi2c1 ,(add< < 1)|0,reg,I2C_MEMADD_SIZE_16BIT,data2,2,0xffff);
}
uint8_t VL6180X_ReadByte(uint8_t add,uint16_t reg)
{
uint8_t data=0;
HAL_I2C_Mem_Read(&hi2c1 ,(add< < 1)|1,reg,I2C_MEMADD_SIZE_16BIT,&data,1,0xffff);
return data;
}
uint16_t VL6180X_ReadBytee_16Bit(uint8_t add,uint16_t reg)
{
uint16_t data=0;
uint8_t data2[2];
HAL_I2C_Mem_Read(&hi2c1 ,(add< < 1)|1,reg,I2C_MEMADD_SIZE_16BIT,data2,2,0xffff);
data=data2[0];
data=data< < 8;
data+=data2[1];
return data;
}
模塊寄存器
對(duì)于VL6180,模塊寄存器的地址是16位的,不是8位的。VL6180模塊使用16位的寄存器地址來訪問和配置各種功能和參數(shù)。這種擴(kuò)展的地址空間提供了更大的靈活性和更多的寄存器選項(xiàng),以滿足不同的應(yīng)用需求。 在與VL6180模塊進(jìn)行通信時(shí),主設(shè)備需要發(fā)送16位的寄存器地址,以指定所需的操作和寄存器位置。這樣可以確保主設(shè)備與模塊之間的正確數(shù)據(jù)交換和通信。
所以對(duì)于vl6180模塊,讀寫代碼如下所示。
void VL6180X_WriteByte(uint8_t add,uint16_t reg,uint8_t data)
{
HAL_I2C_Mem_Write(&hi2c1 ,(add< < 1)|0,reg,I2C_MEMADD_SIZE_16BIT,&data,1,0xffff);
}
void VL6180X_WriteByte_16Bit(uint8_t add,uint16_t reg,uint16_t data)
{
uint8_t data2[2]={0,0};
data2[0]=data > >8;
data2[1]=data;
HAL_I2C_Mem_Write(&hi2c1 ,(add< < 1)|0,reg,I2C_MEMADD_SIZE_16BIT,data2,2,0xffff);
}
uint8_t VL6180X_ReadByte(uint8_t add,uint16_t reg)
{
uint8_t data=0;
HAL_I2C_Mem_Read(&hi2c1 ,(add< < 1)|1,reg,I2C_MEMADD_SIZE_16BIT,&data,1,0xffff);
return data;
}
uint16_t VL6180X_ReadBytee_16Bit(uint8_t add,uint16_t reg)
{
uint16_t data=0;
uint8_t data2[2];
HAL_I2C_Mem_Read(&hi2c1 ,(add< < 1)|1,reg,I2C_MEMADD_SIZE_16BIT,data2,2,0xffff);
data=data2[0];
data=data< < 8;
data+=data2[1];
return data;
}
初始化
首先需要檢查寄存器SYSTEM__FRESH_OUT_OF_RESET {0x16}是否為0x01.
可以通過讀取SYSTEM__FRESH_OUT_OF_RESET {0x16}進(jìn)行判斷設(shè)備是否準(zhǔn)備好,之后進(jìn)行6180初始化。 初始化如下所示。
uint8_t ptp_offset;
uint8_t VL6180X_Init(uint8_t add)
{
ptp_offset=VL6180X_ReadByte(add,VL6180X_REG_SYSTEM_FRESH_OUT_OF_RESET);
printf("ptp_offset=%dn",ptp_offset);
// if(VL6180X_Read_ID(add) == VL6180X_DEFAULT_ID)
if(ptp_offset==0x01)
{
VL6180X_WriteByte(add,0x0207, 0x01);
VL6180X_WriteByte(add,0x0208, 0x01);
VL6180X_WriteByte(add,0x0096, 0x00);
VL6180X_WriteByte(add,0x0097, 0xfd);
VL6180X_WriteByte(add,0x00e3, 0x00);
VL6180X_WriteByte(add,0x00e4, 0x04);
VL6180X_WriteByte(add,0x00e5, 0x02);
VL6180X_WriteByte(add,0x00e6, 0x01);
VL6180X_WriteByte(add,0x00e7, 0x03);
VL6180X_WriteByte(add,0x00f5, 0x02);
VL6180X_WriteByte(add,0x00d9, 0x05);
VL6180X_WriteByte(add,0x00db, 0xce);
VL6180X_WriteByte(add,0x00dc, 0x03);
VL6180X_WriteByte(add,0x00dd, 0xf8);
VL6180X_WriteByte(add,0x009f, 0x00);
VL6180X_WriteByte(add,0x00a3, 0x3c);
VL6180X_WriteByte(add,0x00b7, 0x00);
VL6180X_WriteByte(add,0x00bb, 0x3c);
VL6180X_WriteByte(add,0x00b2, 0x09);
VL6180X_WriteByte(add,0x00ca, 0x09);
VL6180X_WriteByte(add,0x0198, 0x01);
VL6180X_WriteByte(add,0x01b0, 0x17);
VL6180X_WriteByte(add,0x01ad, 0x00);
VL6180X_WriteByte(add,0x00ff, 0x05);
VL6180X_WriteByte(add,0x0100, 0x05);
VL6180X_WriteByte(add,0x0199, 0x05);
VL6180X_WriteByte(add,0x01a6, 0x1b);
VL6180X_WriteByte(add,0x01ac, 0x3e);
VL6180X_WriteByte(add,0x01a7, 0x1f);
VL6180X_WriteByte(add,0x0030, 0x00);
// Recommended : Public registers - See data sheet for more detail
VL6180X_WriteByte(add,0x0011, 0x10); // Enables polling for 'New Sample ready'
// when measurement completes
VL6180X_WriteByte(add,0x010a, 0x30); // Set the averaging sample period
// (compromise between lower noise and
// increased execution time)
VL6180X_WriteByte(add,0x003f, 0x46); // Sets the light and dark gain (upper
// nibble). Dark gain should not be
// changed. !上半字節(jié)要寫入0x4 默認(rèn)增益是1.0
VL6180X_WriteByte(add,0x0031, 0xFF); // sets the # of range measurements after
// which auto calibration of system is
// performed
VL6180X_WriteByte(add,0x0041, 0x63); // Set ALS integration time to 100ms
VL6180X_WriteByte(add,0x002e, 0x01); // perform a single temperature calibration
// of the ranging sensor
// Optional: Public registers - See data sheet for more detail
VL6180X_WriteByte(add,0x001b, 0x09); //測(cè)量間隔 輪詢模式
// period to 100ms 每步10ms- >0-10ms
VL6180X_WriteByte(add,0x003e, 0x31); //測(cè)量周期 ALS模式
// to 500ms
VL6180X_WriteByte(add,0x0014, 0x24); // Configures interrupt on 'New Sample
// Ready threshold event'
//VL6180X_WriteByte(add,VL6180X_REG_SYSTEM_FRESH_OUT_OF_RESET, 0x00); //不發(fā)送00那么讀出來的數(shù)值就是01
return 0;
}
else return 1;
}
設(shè)備標(biāo)識(shí)號(hào)
查詢?cè)O(shè)備號(hào)可以通過0x000指令進(jìn)行查詢,返回值一般為0xB4。
uint8_t VL6180X_Read_ID(uint8_t add)
{
return VL6180X_ReadByte(add,VL6180X_REG_IDENTIFICATION_MODEL_ID);
}
單次讀取距離長度
在VL6180模塊中,可以使用單次讀取或多次讀取的方式來獲取所需的數(shù)據(jù)。在這里,我們將使用單次讀取的方式來讀取數(shù)據(jù)。下圖中紅色框內(nèi)的部分展示了單次讀取的操作方式。 單次讀取是一種簡單而常用的讀取數(shù)據(jù)的方法。它涉及到向VL6180模塊發(fā)送一個(gè)讀取命令,并從模塊的寄存器中讀取所需的數(shù)據(jù)。 圖示中的紅色框內(nèi)部所示的讀取操作方式可以作為參考,幫助理解和實(shí)施單次讀取操作。
由上圖可以得知,讀取的寄存器地址為0x062,0x062寄存器的說明如下所示,單位為mm。
代碼如下所示。
uint8_t VL6180X_Read_Range(uint8_t add)
{
uint8_t range = 0;
//等待設(shè)備準(zhǔn)備好進(jìn)行量程測(cè)量
while(!(VL6180X_ReadByte(add,VL6180X_REG_RESULT_RANGE_STATUS) & 0x01));//VL6180X_REG_RESULT_RANGE_STATUS,0x0d, 自檢0x01連續(xù)性測(cè)試
//開始量程測(cè)量
VL6180X_WriteByte(add,VL6180X_REG_SYSRANGE_START,0x01);//VL6180X_REG_SYSRANGE_START,0x018,開啟測(cè)距,0x01,單次模
//輪詢到第2位被設(shè)置
while(!(VL6180X_ReadByte(add,VL6180X_REG_RESULT_INTERRUPT_STATUS_GPIO) & 0x04));//VL6180X_REG_RESULT_INTERRUPT_STATUS_GPIO,中斷等待,0x04,數(shù)據(jù)等待完畢
//讀數(shù)范圍(毫米)
range = VL6180X_ReadByte(add,VL6180X_REG_RESULT_RANGE_VAL);//RESULT__RANGE_VAL,0x062,顯示檢測(cè)長度
//清除中斷
VL6180X_WriteByte(add,VL6180X_REG_SYSTEM_INTERRUPT_CLEAR,0x07);//VL6180X_REG_SYSTEM_INTERRUPT_CLEAR,0x015,清除狀態(tài)位
return range;
}
測(cè)試結(jié)果
測(cè)試結(jié)果如下所示。
審核編輯:湯梓紅
-
接口
+關(guān)注
關(guān)注
33文章
8885瀏覽量
152972 -
ST
+關(guān)注
關(guān)注
32文章
1164瀏覽量
129953 -
STM32
+關(guān)注
關(guān)注
2283文章
10986瀏覽量
361297 -
TOF
+關(guān)注
關(guān)注
9文章
493瀏覽量
36978 -
stm32cubemx
+關(guān)注
關(guān)注
5文章
286瀏覽量
15851
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
基于STM32CUBEMX驅(qū)動(dòng)TOF模塊VL6180與VL6180X(2)----修改測(cè)量范圍

基于STM32CUBEMX驅(qū)動(dòng)TOF模塊VL6180與VL6180X(3)----修改設(shè)備地址

基于STM32CUBEMX驅(qū)動(dòng)TOF模塊VL6180與VL6180X(4)----測(cè)量環(huán)境光

基于STM32CUBEMX驅(qū)動(dòng)TOF模塊VL6180與VL6180X(5)----驅(qū)動(dòng)多個(gè)VL6180X

尋找手冊(cè)中引用的F401和VL6180板的mbed資源
VL6180X該設(shè)備的功耗是多少?
VL6180X包含多少個(gè)傳感器?
VL6180X操作如何測(cè)量距離
VL6180X:什么是線性誤差率?
VL6180X范圍偏移怎么更改
VL6180X增加了范圍
近距離測(cè)量VL6180X錯(cuò)誤
請(qǐng)問VL6180X的基本功能有哪些?
Vl6180x 官方蓋玻片模型的使用
使用VL6180X ToF傳感器與Particle Argon控制伺服器

評(píng)論