【硬件】【傳感器 BH1750FVI】

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

簡介: 環境光傳感器

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

功能框圖:

其中,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 串行時鐘接口

上電及復位操作:

  • 異步復位: DVI 需要在 VCC 供電後維持超過 1us 的低電平,以保證內部邏輯正確進入 Power Down Mode
  • 復位命令: 即 “0000 0111”,用來清除先前採集的數據。該命令在 Power Down Mode 下無效。

應用電路設計:

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

1)MCU 控制 DVI 信號:

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

推薦 R = 1K,C = 1uF。 當 VCC 關掉時,由於 RC 的存在,DVI 的電壓會比 VCC 高,但是在我們推薦的 RC 參數下,並不會對芯片造成損壞。該參數在電路板上實測 Reset Section 約在 1ms,遠滿足需求。


軟件 workflow:

指令名稱 指令代碼 指令描述
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”:

240ms 後,測量數據將被存入 Data Register。


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

假定,ADDR = L,slave 地址爲 “0100 011”

例如讀取到的 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. 避免在強磁場中使用,否則可能出現故障;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章