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校正

上公式表為讀取到的Count與實際Lux的參考轉換這邊注意使用公式後在整機後與實際狀況還是有誤差

因此可以引用下表其他廠品的範例去建構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的讀寫可以參考之前文章寫法

Leave a Comment

Your email address will not be published. Required fields are marked *

Shopping Cart