Ambient Light Sensor On STM32
前言
環境光感測器(英語:Ambient Light Sensor)是一種感光元件, 目前主要用於手機、筆電、平板等等顯示螢幕面板
目前AMS_OSRAM這邊有推出一款新的ALS SFH 5721
The SFH5721 Digital Ambient Light Sensor combines an array of photodiodes and wide dynamic
range readout channels to enable ambient light and infrared sensing.
Features:
- Package: clear epoxy
- ESD: 2 kV acc. to ANSI/ESDA/JEDEC JS-001 (HBM)
- Adapted to human eye sensitivity (Vλ)
- Integrated and independent Infrared Detection Channel
- I²C Interface
- supports two I²C slave addresses
- Zero dark count value
- 16 Bit ADC resolution
Block diagram
SFH5721
Nucleo-F401RE
接線
傳感器板子與上圖Nucleo-F401RE腳位對接部分硬件即完成
注意此板是3.3V非5V,與I2C的腳為傳感器板是含電阻的,如果是焊路電路板記得要外加電阻正常
Register setting Flow
PS:這邊注意DEVID 可能會有所不同詳細需確認Datasheet為0x00還是0x01
Sensor Initialization
void Rest_all(){
uint8_t x=1;
x=read_register(DEVID);
if(x==0x00){
enableSFH5721.RESET=1;
write_register(OPSEL,*((uint8_t*)(&enableSFH5721)));
printf("reset ok\n\r");
enableSFH5721.RESET=0;
}
else
{printf("connect fail\n\r");
printf("DEVID=%#x\n\r",x);
for(;;);}
};
這邊與其他Sensor一樣需要先做初始化避免後續寫入I2C資料錯誤
Sensor setting
這邊有幾個參數可以設定影響對光的敏感度分別是AGAIN/DGAIN/Integration time
其中AGAIN與Integration time主要影響對光的靈敏度與最大光感,如下圖主要取線性區間
設定程式這邊切成3個部分如下
setAnalogGan(0x01,0x07);//Analog gain is 4 ,Integration time is 25ms(0x01,0x07)
setDigitalGan(0x00,0x00,1);//Digital gain is 1 ,Wait time 0ms
setlowpassfilter(0x01,ALS);//Digital lowpass filter depth is 3(ALS,0x01)
其中AnalogGan
void setAnalogGan(uint8_t Analog_Gan,uint8_t Integration_time)
{
uint8_t feedback=0;
GanSFH5721.AGAIN=Analog_Gan;
GanSFH5721.IT=Integration_time;
write_register(MCONFA,*((uint8_t*)(&GanSFH5721)));
feedback=read_register(MCONFA);
printf("AGAIN=%x \n\r",feedback);
}
DigitalGan
void setAnalogGan(uint8_t Analog_Gan,uint8_t Integration_time)
{
uint8_t feedback=0;
GanSFH5721.AGAIN=Analog_Gan;
GanSFH5721.IT=Integration_time;
write_register(MCONFA,*((uint8_t*)(&GanSFH5721)));
feedback=read_register(MCONFA);
printf("AGAIN=%x \n\r",feedback);
}
Data Getting
在初始化後就可以去抓取ALS與IR的Data,其中Dark Data是用在零點的修正原因在可能溫度與完全暗室下會有部分偏差這邊就可以用Dark Data做修正
下面以ALS Data抓取為例(IR與Dark可以以此為模板)
uint16_t get_ALS(){
uint8_t x=0;
x=ReadStatus();
if(x==3|| x==7 || x==6 || x==8){
uint8_t buffer[2];
uint16_t DATA=0;
buffer[0]=read_register(DATA3L);
buffer[1]=read_register(DATA3H);
DATA= buffer[1];
DATA = DATA << 8;
DATA += buffer[0];
return DATA;}
else if(x==4)
{printf("data not ready\n\r");
return 0;}
}
ALS與IR校正
因此可以引用下表其他廠品的範例去建構Lux與IR的線性關係式(此部分沒有標準答案)
這邊我寫出我的方式以供各位參考
校準流程參考
- 量測室外lux meter 量測到50Klux陽光底下SFH5721換算出Ev與Ee的數值(參考上面公式)
- 選不同區域重復步驟一,已取得5個以上Data樣本
- 參考上表以二維公式Z=aY+bX+C帶入其中Z代入Meter數值 /Y代入Ev/ X代入Ee數值
- 建立出標準公式表後續求出ALS與IR Count數值時候就可以立馬求得實際Lux數值
- 這邊注意Dark數值是單獨使用在暗室或溫度校準時候量測使其歸零使用
參考
這邊非常推薦DFRobot_TCS3430的h檔寫法可以有效區分別所要暫存區域,I2C的讀寫可以參考之前文章寫法