博主最近在調試 AP3216C 三合一環境傳感器,由敦南科技推出的一款傳感器,支持環境光強度(ALS)、接近距離(PS)和紅外線強度(IR)這三個環境參數檢測。
1、前言
2、傳感器特性
- I2C 接口,快速模式下波特率可以到 400Kbit/S
- 多種工作模式選擇:ALS, PS+IR, ALS+PS+IR, PD 等等
- 內建溫度補償電路。
- 寬工作溫度范圍(-30°C ~ +80°C)。
- 超小封裝,4.1mm x 2.4mm x 1.35mm
- 環境光傳感器具有 16 位分辨率(0~65535)。
- 接近傳感器和紅外傳感器具有 10 位分辨率(0~1023)。
- 4 個用戶可選動態范圍
- Anti-flicker rejection (reject 50/60Hz)(防閃爍抑制)
- 高靈敏度@darkened glass
- 4 個可編程紅外 LED 電流輸出
- 高環境光抑制
- 串擾補償
- 符合 RoHS 安全標準
典型應用
AP3216C 常被用于手機、平板、導航設備等,其內置的接近傳感器可以用于檢測是否有物體接近,比如手機上用來檢測耳朵是否接觸聽筒,如果檢測到的話就表示正在打電話,手機就會關閉手機屏幕以省電。 也可以使用環境光傳感器檢測光照強度,可以實現自動背光亮度調節。
目標設備
功能框圖
典型應用電路
3、參考資料
《AP3216C_Preliminary_Datasheet_Rev0.86.pdf》
4、引腳說明
5、工作模式
ALS,PS+IR,ALS+PS+IR,PD,ALS 一次,SW Reset,PS+IR一次和ALS + PS+IR一次。
6、I2C 讀寫地址
從地址0x1E
7、寄存器
系統寄存器表
翻譯如下
0X00 這個寄存器是模式控制寄存器,用來設置 AP3216C 的工作模式,一般開始先將其設置為 0X04,也就是先軟件復位一次 AP3216C。
接下來根據實際使用情況選擇合適的工作模式,比如設置為 0X03,也就是開啟 ALS+PS+IR。
從 0X0A~0X0F 這 6 個寄存器就是數據寄存器,保存著 ALS、PS 和 IR 這三個傳感器獲取到的數據值。
如果同時打開 ALS、PS 和 IR ,讀取間隔最少要 112.5ms,因為 AP3216C 完成一次轉換需要 112.5ms。
8、代碼
博主用的是輪詢去讀數據,大家也可以配置成中斷方式。
AP3216C.H
#define AP3216C_ADDR 0X1E
#define AP3216C_SYSTEMCONG 0x00
#define AP3216C_INTSTATUS 0X01
#define AP3216C_INTCLEAR 0X02
#define AP3216C_IRDATALOW 0x0A
#define AP3216C_IRDATAHIGH 0x0B
#define AP3216C_ALSDATALOW 0x0C
#define AP3216C_ALSDATAHIGH 0X0D
#define AP3216C_PSDATALOW 0X0E
#define AP3216C_PSDATAHIGH 0X0F
#define AP3216C_POWER_DOWN 0x00
#define AP3216C_ENABLE_ALL 0x03
#define AP3216C_SW_RESET 0x04
AP3216C 沒有 chip id 寄存器,我們先寫一個值,然后讀出來,如果相等,則表示器件存在。 同時將器件初始化。
u8 AP3216C_Check_And_Init(void)
{
u8 temp;
I2C_WriteOneByte(AP3216C_ADDR,AP3216C_SYSTEMCONG,AP3216C_SW_RESET); /* SW reset */
delay_ms(50);
I2C_WriteOneByte(AP3216C_ADDR,AP3216C_SYSTEMCONG,AP3216C_ENABLE_ALL); /* enable ALS PS IR */
temp=I2C_ReadOneByte(AP3216C_ADDR,AP3216C_SYSTEMCONG);
if(temp == AP3216C_ENABLE_ALL)
return 0;
else
return 1;
}
讀取數據
for(i = 0; i < 6; i++)
{
buf[i] = I2C_ReadOneByte(AP3216C_ADDR,AP3216C_IRDATALOW + i);
}
if(buf[0] & 0X80) /* IR_OF 位為 1,則數據無效 */
ir = 0;
else
ir = ((unsigned short)buf[1] << 2) | (buf[0] & 0X03);
als = ((unsigned short)buf[3] << 8) | buf[2];/* 讀取 ALS 數據 */
if(buf[4] & 0x40) /* IR_OF 位為 1,則數據無效 */
ps = 0;
else
ps = ((unsigned short)(buf[5] & 0X3F) << 4) | (buf[4] & 0X0F);
printf("ALS:%u ,PS:%u ,IR:%u \\r\\n",als,ps,ir);
讀取數據過程中,IR 和 ps 需要先判斷數據是否有效,若有效再輸出,如注釋。
-
傳感器
+關注
關注
2548文章
50673瀏覽量
751987 -
接口
+關注
關注
33文章
8497瀏覽量
150834 -
接近傳感器
+關注
關注
5文章
188瀏覽量
24412 -
I2C
+關注
關注
28文章
1481瀏覽量
123286 -
環境傳感器
+關注
關注
2文章
73瀏覽量
18497
發布評論請先 登錄
相關推薦
評論