天天看點

【硬體】【傳感器 BH1750FVI】

Ambient Light Sensor / 環境光傳感器: BH1750FVI

簡介: 環境光傳感器

  • 廠商: ROHM
  • 立創商城采購連結
  • 測量精度: 0.96 ~ 1.2 ~ 1.44
  • 分辨率: 1 - 65535 lx
  • 工作電壓: 2.4 - 3.6V,Typ. = 3.0V
  • 工作溫度: -40℃ ~ +85℃

功能框圖:

【硬體】【傳感器 BH1750FVI】

其中,Logic + I2C Interface 包含兩類寄存器:

  • 資料寄存器: 測量的環境光資料(即,内部 ADC 轉換出的資料,為 16bit),初始值為 “0000 0000 0000 0000”
  • 測量時間寄存器: 測量時間,初始值為 “0100 0101”

OSC 為内部電路提供時鐘,典型值為 320KHz

管腳定義:

管腳編号 管腳名稱 描述
1 VCC 電源腳
2 ADDR ADDR = H(>= 0.7xVCC),slave 位址為 “1011 100”; ADDR = L(=< 0.3xVCC),slave 位址為 “0100 011”。電路結構為 3 state buffer
3 GND
4 SDA I2C 串行資料接口
5 DVI I2C 總線的參考電平;内部寄存器異步複位:DVI <= 0.4V, at least 1us。BH1750FVI is pulled down by 150K while DVI=L
6 SCL I2C 串行時鐘接口

上電及複位操作:

【硬體】【傳感器 BH1750FVI】
  • 異步複位: DVI 需要在 VCC 供電後維持超過 1us 的低電平,以保證内部邏輯正确進入 Power Down Mode
  • 複位指令: 即 “0000 0111”,用來清除先前采集的資料。該指令在 Power Down Mode 下無效。

應用電路設計:

設計中,需要保證 DVI 與 VCC 之間的時序關系,一般有兩種方案可以實作:

1)MCU 控制 DVI 信号:

【硬體】【傳感器 BH1750FVI】

2)VCC 與 DVI 之間嵌入 RC 電路實作:

【硬體】【傳感器 BH1750FVI】
【硬體】【傳感器 BH1750FVI】
推薦 R = 1K,C = 1uF。 當 VCC 關掉時,由于 RC 的存在,DVI 的電壓會比 VCC 高,但是在我們推薦的 RC 參數下,并不會對晶片造成損壞。該參數在電路闆上實測 Reset Section 約在 1ms,遠滿足需求。

軟體 workflow:

【硬體】【傳感器 BH1750FVI】
指令名稱 指令代碼 指令描述
Power Down 0000 0000 掉電模式
Power On 0000 0001 上電:等待測量指令
Reset 0000 0111 複位資料寄存器。掉電模式下,Reset 指令無效
Continuously H-Resolution Mode(推薦) 0001 0000 以 1lx 分辨率開始測量;測量時間約 120ms
Continuously H-Resolution Mode 2 0001 0001 以 0.5lx 分辨率開始測量;測量時間約 120ms
Continuously L-Resolution Mode 0001 0011 以 4lx 分辨率開始測量;測量時間約 16ms
One Time H-Resolution Mode(推薦) 0010 0000 以 1lx 分辨率開始測量;測量時間約 120ms;測量結束後自動進入 Power Down Mode
One Time H-Resolution Mode 2 0010 0001 以 0.5lx 分辨率開始測量;測量時間約 120ms;測量結束後自動進入 Power Down Mode
One Time L-Resolution Mode 0010 0011 以 4lx 分辨率開始測量;測量時間約 16ms;測量結束後自動進入 Power Down Mode
Change Measurement time(High bit) 01000 MT[7,6,5] 調整測量時間,見如下描述
Change Measurement time(Low bit) 011 MT[4,3,2,1,0] 調整測量時間,見如下描述

調整測量時間::

即,調整傳感器靈敏度,用于抵消光學視窗(optical window)帶來的影響。

具體通過調整測量時間來實作。MTreg 的調整範圍為: “0001 1111/31” ~ “1111 1110/254”,預設值 “0100 0101/69”

比如,光學視窗的透過率為 50%,測量結果則變為之前的一半。通過調整測量時間為 2 倍,可将測量結果彌補到光學視窗透過率為 100% 的值。舉個例子,将預設測量值 “0100 0101” 調整為 2 倍 “1000 1010”:

【硬體】【傳感器 BH1750FVI】

240ms 後,測量資料将被存入 Data Register。

“指令寫入及測量值”示例

假定,ADDR = L,slave 位址為 “0100 011”

【硬體】【傳感器 BH1750FVI】

例如讀取到的 High Byte 為 “1000 0011” 和 Low Byte 為 “1001 0000”,則:

(215 + 29 + 28 + 27 + 24 )/ 1.2 = 28067(lx)

代碼測試:

寫操作:

static esp_err_t i2c_master_write_slave(i2c_port_t i2c_num, uint8_t *sub_reg)
{
	int ret;
	
    i2c_cmd_handle_t cmd = i2c_cmd_link_create();
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, (SENSOR_ADDR | WRITE_BIT), ACK_CHECK_EN);
	i2c_master_write_byte(cmd, sub_reg, ACK_CHECK_EN);
    i2c_master_stop(cmd);
    ret = i2c_master_cmd_begin(i2c_num, cmd, 1000 / portTICK_RATE_MS);
    i2c_cmd_link_delete(cmd);
	
    return ret;
}
           

讀操作(資料包含兩個位元組):

static esp_err_t i2c_master_read_slave(i2c_port_t i2c_num, uint8_t *data_rd_h, uint8_t *data_rd_l)
{
    int ret;
    i2c_cmd_handle_t cmd = i2c_cmd_link_create();
    i2c_master_start(cmd);
    i2c_master_write_byte(cmd, SENSOR_ADDR  | READ_BIT, ACK_CHECK_EN);
    i2c_master_read_byte(cmd, data_rd_h, ACK_VAL);
    i2c_master_read_byte(cmd, data_rd_l, NACK_VAL);
    i2c_master_stop(cmd);
    ret = i2c_master_cmd_begin(i2c_num, cmd, 1000 / portTICK_RATE_MS);
    i2c_cmd_link_delete(cmd);
    return ret;
}
           

配置 BH1750 為 Continuously H-Resolution Mode :

i2c_master_write_slave( I2C_EXAMPLE_MASTER_NUM, BH_POWER_ON);
i2c_master_write_slave( I2C_EXAMPLE_MASTER_NUM, BH_CTN_HIGH_RESOLUTION_MODE);
           

擷取光強資料并計算為 lx:

ret = i2c_master_read_slave(I2C_EXAMPLE_MASTER_NUM, &bh1750_dat[1], &bh1750_dat[0]); 
raw_data = ((bh1750_dat[1] << 8 | bh1750_dat[0]) / BH_1750_MEASUREMENT_ACCURACY);
           

用手遮擋或手電筒照射,測試結果如下:

預設:BH1750 raw data is: 472.500000
...
手遮擋:BH1750 raw data is: 2.500000
...
手電筒照射:BH1750 raw data is: 13231.666992
           

設計時需要注意的其他事項:

  1. 器件背部的 exposed central pad 不做電氣屬性連接配接,更不要焊接;
  2. 避免在強磁場中使用,否則可能出現故障;