【 E-Lock NXP LPC55 】VISHAY Proximity VCNL VCNL36825T深入解析

一、介紹

E-Lock EVM 上面使用 Vishay 的 VCNL36825T 來當作為非接觸喚醒裝置,以達到節約系統電源,增加使用者體驗。

Proximity sensor : 鄰近感測器通常發射電磁場或電磁輻射束(例如紅外線)並觀察電場或返回訊號的變化來實現功能。可被偵測的物體被稱為鄰近感測器的目標。不同類型的鄰近感測器有不同的目標,例如電容式鄰近感測器或光電感測器可能偵測塑料目標,而電感式鄰近感測器只能偵測金屬目標。

二、Vishay VCNL36825T

特性 : 
1. Supply voltage range VDD: 2.62 V to 3.6 V
2. Low power consumption I2C
3. The 12-bit proximity sensing function
4. Operating range 200 (mm)
5. VCSEL driving current 20 (mA)

Proximity Function
• Immunity to red glow (940 nm IRED)
• Programmable IVCSEL sink current
• Intelligent cancellation to reduce cross talk phenomenon
• Smart persistence scheme to reduce PS response time
• Low power consumption mode
• Sunlight cancellation up to 100 klx

The VCSEL emitter has a narrow emission angle of approximately ± 4°


三、Proximity 運用在 Elock 用途

因為 Proximity 設計的角度為 ± 4° 距離約 20 公分,因此在此方案透過 Proximity 來進行系統喚醒,當使用想要操作 E-lock 時,只要擺放的位置以及機構設置正確,可以增加使用者體驗並節約功耗。


下面為 E-lock system with proximity system flow.



四、VCNL36825T example code


Proximity VCNL36825T 透過 I2C interface 與 MCU host 通訊,其 I2C 通訊格式為下圖所示


下列為該 VCNL36825T 的 command set


首先將 command set 先 define 起來
#define Proximity_I2C_ADDR_7BITS	0x60
#define PS_CONF1 0x00
#define PS_CONF2 0x03
#define PS_CONF3_4 0x04
#define PS_THDL 0x05
#define PS_THDH 0x06
#define PS_CANC 0x07
#define PS_AC_LP 0x08
#define PS_Data 0xF8
#define PS_Int 0xF9
#define PS_ID 0xFA
#define PS_Data_AC 0xFB​

再來將 Proximity 做初始化動作

void Proximity_init()
{
uint8_t command[2];


PRINTF("\r\n\nProximity_init");
/*VCNL36826 config init*/
command[0]=0x01;
command[1]=0x00;
I2C_WriteData(I2C4_MASTER, Proximity_I2C_ADDR_7BITS, PS_CONF1, command, 2);
command[0]=0x00;
command[1]=0x00;
I2C_WriteData(I2C4_MASTER, Proximity_I2C_ADDR_7BITS, PS_CONF2, command, 2);
command[0]=0x00;
command[1]=0x00;
I2C_WriteData(I2C4_MASTER, Proximity_I2C_ADDR_7BITS, PS_CONF3_4, command, 2);

/**/
command[0]=0x03; //PS_ON=1
command[1]=0x00;
I2C_WriteData(I2C4_MASTER, Proximity_I2C_ADDR_7BITS, PS_CONF1, command, 2);
command[0]=0x83; //PS_ON=1, PS_INIT=1
command[1]=0x02;
I2C_WriteData(I2C4_MASTER, Proximity_I2C_ADDR_7BITS, PS_CONF1, command, 2);
command[0]=0x06; //PS_ST=1
command[1]=0x00;
I2C_WriteData(I2C4_MASTER, Proximity_I2C_ADDR_7BITS, PS_CONF2, command, 2);
command[0]=0x0C;
command[1]=0xF7;
I2C_WriteData(I2C4_MASTER, Proximity_I2C_ADDR_7BITS, PS_CONF3_4, command, 2);
command[0]=0x01;
command[1]=0x00;
I2C_WriteData(I2C4_MASTER, Proximity_I2C_ADDR_7BITS, PS_THDL, command, 2);
command[0]=0x05;
command[1]=0x00;
I2C_WriteData(I2C4_MASTER, Proximity_I2C_ADDR_7BITS, PS_THDH, command, 2);
}​

可以透過下列讀取 Proximity ID 來確認裝置與 MCU 是否運作正常。

void Proximity_ID()
{
uint8_t rxdata[2]={0};
I2C_ReadData(I2C4_MASTER, Proximity_I2C_ADDR_7BITS, PS_ID,1, rxdata, 2);
PRINTF("\r\nProximity ID : 0x%X, 0x%X",rxdata[0],rxdata[1]);
}


讀取 Proximity 的距離 raw data.

void Proximity_Data()
{
uint8_t rxdata[2]={0};;
I2C_ReadData(I2C4_MASTER, Proximity_I2C_ADDR_7BITS, PS_Data,1, rxdata, 2);
PRINTF("\r\nProximity data : 0x%X, 0x%X",rxdata[0],rxdata[1]);
//I2C_ReadData(I2C4_MASTER, Proximity_I2C_ADDR_7BITS, PS_Int,1, rxdata, 2);
}


將 Proximity 設置到睡眠模式節省功耗

void Proximity_Sleep()
{
uint8_t command[2];
command[0]=0x01;
command[1]=0x00;
I2C_WriteData(I2C4_MASTER, Proximity_I2C_ADDR_7BITS, PS_CONF1, command, 2);
}


五、參考資料

1. Datasheet : https://www.vishay.com/ppg?80235

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★博文作者未開放評論功能