Light Sensor
| ||||||||||||||||||||
| ||||||||||||||||||||
说明
产品概述
本模块是以ams AG 的TSL2581光 - 数字转换器为核心的环境光传感器。传感器将一个宽带光电二极管(可见光和红外光)和一个红外响应光电二极管组合在能够在有效的16位动态范围(16位分辨率)上提供近光适应响应的单个CMOS集成电路上。两个积分ADC将光电二极管电流转换为表示在每个通道上测量的辐照度的数字输出。该数字输出可以被输入到微处理器,其中使用经验公式导出以勒克斯为单位的照度(环境光水平)以近似人眼反应。
规格
- 工作电压: 3.3V ~ 5V
- 有效量程: 0-10000Lux
- 输出形式: 数字量
- 通信方式: I2C
- 产品尺寸: 25.04mm×15.47mm
- 固定孔尺寸: 2.0mm
主要用途
应用包括路灯控制,安全照明,阳光收集,机器视觉和动力仪表集群,同时是平板,手机,数码相机的理想选择。
接口说明
引脚号 | 标识 | 管脚描述 |
1 | VCC | 电源正(2.7V-5V) |
2 | GND | 电源地 |
3 | SDA | I2C数据线 |
4 | SCL | I2C时钟线 |
5 | INT | 数字中断输出 |
工作原理
1.原理图
2.时序分析
TSL2581器件采用I2C通信,因此有一条数据线,一条时钟线。I2C总线在传送数据过程中共有三种类型信号:开始信号、结束信号和应答信号。
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。
I2C写数据时序
首先主机(即STM32,后面统称为主机)会发送一个开始信号,然后将其I2C的7位地址与写操作位组合成8位的数据发送给从机(即TSL2581传感器模块,后面统称为从机),从机接收到后会响应一个应答信号,主机此时将命令寄存器地址发送给从机,从机接收到发送响应信号,此时主机发送命令寄存的值,从机回应一个响应信号,直到主机发送一个停止信号,此次I2C写数据操作结束 。
I2C读数据时序
首先主机会发送一个开始信号,然后将其I2C的7位地址与写操作位组合成8位的数据发送给从机,从机接收到后会响应一个应答信号,主机此时将命令寄存器地址发送给从机,从机接收到发送响应信号,此时主机重新发送一个开始信号,并且将其7位地址和读操作位组合成8位的数据发送给从机,从机接收到信号后发送响应信号,再将其寄存器中的值发送给主机,主机端给予响应信号,直到主机端发送停止信号,此次通信结束。
Command code:即命令代码,其组成如下:
CMD : 选择命令寄存器。 寻址COMMAND寄存器时必须写为1。
TRANSACTION:此两位为选择读写方式以及特殊功能寄存器,当写入10时,支持I2C的读块协议,如果是写入数据,此两位应配置为00;当写入11时为特殊功能寄存器,此时ADDRESS可以选择如下几种:
0 0001:此时为清除中断,但传感器触发中断后,其中断输出将一直保持为0,如果不配置此位将无法置位为1;
0 0010:停止手动积分;
0 0011: 开始手动积分;
ADDRESS:通过上面的阐述,当高5高6位为10时,I2C可读,为00时,I2C可写。此时此5位为各个寄存器的地址,所有地址在下面的配置代码中都会有相应的分析。
3.I2C地址
模块具有数字(i2c)接口。您可以选择三个地址中的一个,传感器内部是7位地址:
ADDR状态 | 地址 |
VCC | 0X49 |
FLOAT | 0X39 |
GND | 0X29 |
注:我们开发板ADDR管脚默认为FLOAT。
4.器件ID
可以通过写入寄存器地址0x12读取器件的ID:
ReadBuffer = I2C_DEV_Read(COMMAND_CMD |TRANSACTION |ID);
根据手册说明,器件ID在8位的寄存器中,高四位固定为器件的部件号,低四位为器件的硅版本号,而其硅版本号手册中并未说明,因此需要对得出的数据进行一个小处理:
ID = ReadBuffer & 0XF0;
即可得到具体的器件的部件号,TSL2581器件号为0x90。
配置代码解析(以STM32为例)
根据手册要求,器件工作需要先上电,才能进行写数据与读取两个ADC通道的值,故:
I2C_DEV_Write(ADDR_FLOAT_Write,COMMAND_CMD| CONTROL,ADC_EN|CONTROL_POWERON);
ADDR_FLOAT_Write为I2C地址,且最低位为写数据位;
COMMAND_CMD 为I2C写命令时,最高必须置为1,写入的数据才有效;
CONTROL为控制寄存器地址00h,可以配置ADC使能与器件使能;
ADC_EN为使能ADC通道,开始进行积分;
CONTROL_POWERON为使能器件。
上电结束后,就可以配置积分时间和通道的增益倍数,分别配置为400ms和增益为16倍,TSL2581每2.7ms进行一次积分,配置为400MS,大约为148个积分周期。
I2C_DEV_Write(ADDR_FLOAT_Write,COMMAND_CMD | TIMING, INTEGRATIONTIME_400MS); I2C_DEV_Write(ADDR_FLOAT_Write,COMMAND_CMD | ANALOG, GAIN_16X);
注:当增益为GAIN_16X时,测量范围小,适合室内测试;若需要测试外界强光则可将倍数改为GAIN_1X,此时测量范围最大。
此时就可以读取两个通道的值,由于手册说明必须先读取低位的数据才能读取高位,故:(只为通道0的讲解,通道1同理)
DataLow = I2C_DEV_Read(COMMAND_CMD | TRANSACTION | DATA0LOW);
DataHigh = I2C_DEV_Read(COMMAND_CMD | TRANSACTION | DATA0HIGH);
Channel_0 = 256 * DataHigh + DataLow ;
先读取低位数据的值,再读取高位数据的值,然后再把两个8位的数据组合成16位的数据。通道0的值为可见和红外的值,通道1得到的为红外的值, ch1 << ch2。
读取到两个通道的值后,就可以把两个通道的值转化为光强度。由于前面配置为了积分周期为400ms,与16倍增益,则需要对求出的值进行缩放,才能得出精确的当前光照强度值,积分时间为400ms时通道满值为 65536:
chScale0 = 65536;
而增益16倍后通道缩减为4096:
chScale0 = chScale0 >> 4; chScale1 = chScale0 ;
此时进行缩放:
channel0 = (Channel_0 * chScale0) >> 16; channel1 = (Channel_1 * chScale1) >> 16;
缩放后,按照特有的公式出两个通道的比例:
ratio1 = (channel1 << (RATIO_SCALE + 1)) / channel0;
其中RATIO_SCALE = 9;
ratio = (ratio1 + 1) >> 1;
此时根据经验公式可以得出如下关系式:
if ((ratio >= 0X00) && (ratio <= K1C)) { b = B1C; m = M1C; } else if (ratio <= K2C) { b = B2C; m = M2C; } else if (ratio <= K3C) { b = B3C; m = M3C; } else if (ratio <= K4C) { b = B4C; m = M4C; } else if (ratio > K5C) { b = B5C; m = M5C; }
其中:ratio <= 0.3时,b = 0.130,m = 0.240。
ratio <= 0.38时,b = 0.1649,m = 0.3562。 ratio <= 0.45时,b = 0.0974,m = 0.1786。 ratio <= 0.54时,b = 0.062,m = 0.100。 ratio > 0.54时,b = m = 0。
得出相应的通道倍数后,导出当前的光照值:
temp = ((channel0 * b) - (channel1 * m)); temp += (1 << (16 - 1)); lux = temp >> 16;
则Lux为当前光照强度。
中断的配置:
根据手册,其中断阀值寄存器为03h-06h,其中03h为低阀值的低8位,04h为低阀值的高8位,05h与06h同理,故:
DataLLow = min % 256; DataLLow= min / 256; I2C_DEV_Write(ADDR_FLOAT_Write,COMMAND_CMD | THLLOW, DataLLow); I2C_DEV_Write(ADDR_FLOAT_Write,COMMAND_CMD | THLHIGH, DataLHigh);
而中断阀值寄存器只对通道0有效,因此min的值不应超过2^16。
当通道0的值在一定的积分周期内低于设定的低阀值或者高于设定的高阀值,则中断输出位将会置为1,且将一直保持,并且ADC的使能也会被关闭,除非通过TRANSACTION设定为11,通过特殊功能寄存器将其清空,同时重新配置寄存器CONTROL给器件上电且使能ADC:
I2C_DEV_Write(ADDR_FLOAT_Write,COMMAND_CMD | TRANSACTION_SPECIAL | SPECIAL_FUN_INTCLEAR, INTR_INTER_MODE); I2C_DEV_Write(ADDR_FLOAT_Write,COMMAND_CMD | CONTROL, ADC_EN | CONTROL_POWERON);
其中: TRANSACTION_SPECIAL = 0x60,即TRANSACTION为11;
SPECIAL_FUN_INTCLEAR为ADDRESS,其值为 0 0001;
INTR_INTER_MODE此参数为每8个积分周期进行一次中断,目的是为了让通道0保持一定的值持续一段时间才能触发中断;
操作现象
下面,以接入微雪 XNUCLEO-F103RB (STM32F103R) 和 Arduino UNO 开发板为例。
1) 将配套程序下载到相应的开发板中。
2) 将串口线和模块接入开发板,给开发板上电,打开串口调试软件。
模块与开发板连接如下表所示:
端口 | XNUCLEO-F103RB |
VCC | 3V3或5V |
GND | GND |
SDA | PB9 |
SCL | PB8 |
INT | PA7 |
端口 | Arduino |
VCC | 3V3或5V |
GND | GND |
SDA | SDA |
SCL | SCL |
INT | 13 |
3) 波特率设置
Baud rate | 115200 |
Data bits | 8 |
Stop bit | 1 |
Parity bit | NONE |
4)传感器靠近不同的光源,串口打印的数据会发生相应改变,显示数值以LUX为单位的光强,具体实验详见附录。
附录
以下为实测的数据:
图为传感器测出的通过串口打印的光照强度数值; |
图为特安斯 TA8133 手持式数字照度计测出的同一光源出的光照强度。 |