树莓派3Python驱动TSL2561树莓派3PythonTSL2561
TSL2561文档翻译
操作原则
-
模数转换模块
TSL256x包含两个内部积分的adc模块。积分adc模块的电流来自于channel 0 和 1 的光电二极管。两个通道的测量同时发生,当一次测量即将完成的时候,测量结果被存储在channel 0 与 1的数据寄存器中。为了确保无效数据不被读取,测量被记录两次。在一次transfer结束后,就开始下次(integrate)积分周期。
-
数字接口
地址如下表所示。
Note:slave地址位7bits,一个读写位应该被附加在slave address后。
ADDR SEL TERMINAL LEVEL |
SLAVE ADDRESS |
SMB ALERT ADDRESS |
GND |
0101001 |
0001100 |
Float |
0111001 |
0001100 |
VDD |
1001001 |
0001100 |
- 寄存器设置
TSL256X被16个寄存器(3个被保留)控制。一个命令寄存器控制串行接口。这些寄存器提供大量功能,能被读取用于确定adc转换的结果。
通常情况下,为了指定要指定的寄存器,command寄存器首先被写
ADDRESS |
RESISTER NAME |
REGISTER FUNCTION |
−− |
COMMAND |
Specifies register address |
0h |
CONTROL |
Control of basic functions |
1h |
TIMING |
Integration time/gain control |
2h |
THRESHLOWLOW |
Low byte of low interrupt threshold |
3h |
THRESHLOWHIGH |
High byte of low interrupt threshold |
4h |
THRESHHIGHLOW |
Low byte of high interrupt threshold |
5h |
THRESHHIGHHIGH |
High byte of high interrupt threshold |
6h |
INTERRUPT |
Interrupt control |
7h |
−− |
Reserved |
8h |
CRC |
Factory test — not a user register |
9h |
−− |
Reserved |
Ah |
ID |
Part number/ Rev ID |
Bh |
−− |
Reserved |
Ch |
DATA0LOW |
Low byte of ADC channel 0 |
Dh |
DATA0HIGH |
High byte of ADC channel 0 |
Eh |
DATA1LOW |
Low byte of ADC channel 1 |
Fh |
DATA1HIGH |
High byte of ADC channel 1 |
- Command Register
命令寄存器指定目标寄存器的地址,为了接下来的读写操作。send byte协议被用于配置命令寄存器。
启动时命令寄存器默认为0x00
FIELD |
BIT |
DESCRIPTION |
CMD |
7 |
Select command register. Must write as 1. |
CLEAR |
6 |
Interrupt clear. Clears any pending interrupt. This bit is a write-one-to-clear bit. It is self clearing. |
WORD |
5 |
SMB Write/Read Word Protocol. 1 indicates that this SMB transaction is using either the SMB Write Word or |
Read Word protocol.
BLOCK | 4 | Block Write/Read Protocol. 1 indicates that this transaction is using either the Block Write or the Block Read
protocol. See Note below.
ADDRESS | 3:0 | Register Address. This field selects the specific control or status register for following write and read
commands according to Table 2.
FIELD |
BIT |
DESCRIPTION |
Resv |
7:2 |
Reserved. Write as 0. |
POWER |
1:0 |
Power up/power down. By writing a 03h to this register, the device is powered up. By writing a 00h to this register, the device is powered down. NOTE: If a value of 03h is written, the value returned during a read cycle will be 03h. This feature can be used to verify that the device is communicating properly. |
- Timing Register
控制积分时间和adc通道值的获取
积分时间依赖于INTEG以及内部时钟频率
FIELD |
BIT |
DESCRIPTION |
Resv |
7−5 |
Reserved. Write as 0. |
GAIN |
4 |
Switches gain between low gain and high gain modes. Writing a 0 selects low gain (1×); writing a 1 selects high gain (16×). |
Manual |
3 |
Manual timing control. Writing a 1 begins an integration cycle. Writing a 0 stops an integration cycle.NOTE: This field only has meaning when INTEG = 11. It is ignored at all other times. |
Resv |
2 |
Reserved. Write as 0. |
INTEG |
1:0 |
Integrate time. This field selects the integration time for each conversion. |
INTEG FIELD VALUE |
SCALE NOMINAL |
INTEGRATION TIME |
00 |
0.034 |
13.7 ms |
01 |
0.252 |
101 ms |
10 |
1 |
402 ms |
11 |
−− |
N/A |
REGISTER |
ADDRESS |
BITS |
DESCRIPTION |
DATA0LOW |
Ch |
7:0 |
ADC |
DATA0HIGH |
Dh |
7:0 |
ADC |
DATA1LOW |
Eh |
7:0 |
ADC |
DATA1HIGH |
Fh |
7:0 |
ADC |
python代码
"""
File name: tsl2561.py
Time: 2019/3/11
"""
import wiringpi as wp
import time
TSL2561_IIC_ADDR= 0x39
POWER_UP = 0x03
POWER_DOWN = 0x00
CONTROL_REG = 0x80
DATA0_LOW = 0x8c
DATA0_HIGH = 0x8d
DATA1_LOW = 0x8e
DATA1_HIGH = 0x8f
fd = wp.wiringPiSetUp(TSL2561_IIC_ADDR)
wp.wiringPiI2CWrite(fd, CONTROL_REG)
wp.wiringPiI2CWrite(fd, POWER_UP)
time.sleep(0.5)
wp.wiringPiI2CWrite(fd, DATA0_LOW)
data0_low = wp.wiringPiI2CRead(fd)
wp.wiringPiI2CWrite(fd, DATA0_HIGH)
data0_high = wp.wiringPiI2CRead(fd)
wp.wiringPiI2CWrite(fd, DATA1_LOW)
data1_low = wp.wiringPiI2CRead(fd)
wp.wiringPiI2CWrite(fd, DATA1_LOW)
data1_low = wp.wiringPiI2CRead(fd)
chnn0 = (data0_high << 8) + data0_low
chnn1 = (data1_high << 8) + data1_low
if chnn0 == 0:
lux = 0
elif chnn0 !=0:
div = float(chnn1)/float(chnn0)
if(div>0 and div<=0.5):
lux = (0.304*chnn0 - 0.062 * chnn0 * (div*1.4))
if(div>0.5 and div<=0.61):
lux = (0.022*chnn0 - 0.031 * chnn1)
if(div>0.61 and div<=0.8):
lux = (0.8 and div<=1.3)
if(div>0.8 and div<=1.3):
lux = (0.00146*chnn0 - 0x00112*chnn1)
if(div > 1.3)
lux = 0
print '%.3f' % lux
|