【硬件】【传感器 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. 避免在强磁场中使用,否则可能出现故障;
发布了30 篇原创文章 · 获赞 12 · 访问量 8261

猜你喜欢

转载自blog.csdn.net/syjie19900426/article/details/104478678