在上一篇中,我們介紹了IIC驅(qū)動OLED顯示屏。這一篇是IIC驅(qū)動BH1750FVI光強(qiáng)度傳感器。其實在之前的樹莓派系列中也寫過BH1750FVI光強(qiáng)度傳感器的文章。
這里是一個IIC總線上面掛載了兩個IIC從設(shè)備。
產(chǎn)品介紹
BH1750FVI 是一種用于兩線式串行總線接口的數(shù)字型光強(qiáng)度傳感器集成電路。這種集成電路可以根據(jù)收集的光線強(qiáng)度數(shù)據(jù)來調(diào)整液晶或者鍵盤背景燈的亮度。利用它的高分辨率可以探測較大范圍的光強(qiáng)度變化。(1lx-65535lx)
產(chǎn)品特點(diǎn)
- 支持 I2C BUS 接口(f/s Mode Support)。
- 接近視覺靈敏度的光譜靈敏度特性(峰值靈敏度波長典型值:560nm)。
- 輸出對應(yīng)亮度的數(shù)字值。
- 對應(yīng)廣泛的輸入光范圍(相當(dāng)于 1-65535lx)。
- 通過降低功率功能,實現(xiàn)低電流化。
- 通過 50Hz/60Hz 除光噪音功能實現(xiàn)穩(wěn)定的測定7. 支持 1.8V 邏輯輸入接口。
- 無需其他外部件。
- 光源依賴性弱(白熾燈,熒光燈,鹵素?zé)簦坠?LED,日光燈)。
- 有兩種可選的 I2C slave 地址。
- 可調(diào)的測量結(jié)果影響較大的因素為光入口大小。
- 使用這種功能能計算 1.1 lx 到 100000 lx 馬克斯/分鐘的范圍。
- 最小誤差變動在±20%。
- 受紅外線影響很小。
產(chǎn)品應(yīng)用
移動電話,液晶電視,筆記本電腦,便攜式游戲機(jī),數(shù)碼相機(jī),數(shù)碼攝像機(jī),汽車定位系統(tǒng),液晶顯示器。
芯片框圖
描述:
?PD 接近人眼反應(yīng)的光敏二極管。(Photo diode with approximately human eye response.)
?AMP 集成運(yùn)算放大器:將 PD 電流轉(zhuǎn)換為 PD 電壓。
?ADC 模數(shù)轉(zhuǎn)換獲取 16 位數(shù)字?jǐn)?shù)據(jù)。
?Logic + IC Interface(邏輯+ IC 界面)光強(qiáng)度計算和 I2C 總線接口,包括下列寄存器:數(shù)據(jù)寄存器→光強(qiáng)度數(shù)據(jù)寄存。初始值是:“0000_0000_0000_0000”。測量時間寄存器→時間測量數(shù)據(jù)寄存。初始值是:“0100_0101”。
?OSC 內(nèi)部振蕩器(時鐘頻率典型值:320kHz)。該時鐘為內(nèi)部邏輯時鐘。
從這個框圖也可以看出這個芯片的內(nèi)部模塊比較簡單,實際使用也不復(fù)雜。
測量程序步驟
指令集合結(jié)構(gòu)
從“寫指示”到“讀出測量結(jié)果”的測量時序?qū)嵗?/p>
#define IIC_SCL P10 // 時鐘
#define IIC_SDA P11 // 數(shù)據(jù)
這個是IIC和單片機(jī)IO口的連接。
驅(qū)動代碼
#include "bh1750fvi.h"
#include "iic.h"
#define BH1750FVI_SlaveAddress 0x46 // 設(shè)備地址
#define BH1750FVI_DOWN 0x00 // 斷電指令
#define BH1750FVI_ON 0x01 // 通電指令
#define BH1750FVI_RESEET 0x07 // 復(fù)位
#define BH1750FVI_CON_H 0x10 // 連續(xù)分辨率模式, 1lx, 120ms
#define BH1750FVI_CON_H2 0x11 // 連續(xù)分辨率模式, 0.5lx, 120ms
#define BH1750FVI_CON_L 0x13 // 連續(xù)低分辨率模式,4lx, 16ms
#define BH1750FVI_ONE_H 0x20 // 一次高分辨率模式,1lx, 120ms
#define BH1750FVI_ONE_H2 0x21 // 一次高分辨率模式,0.5lx, 120ms
#define BH1750FVI_ONE_L 0x23 // 一次低分辨率模式,4lx, 16ms
// 往BH1750FVI寫數(shù)據(jù)
void BH1750FVI_Write_Reg(u8 reg)
{
IIC_Start();
IIC_Write_Byte(BH1750FVI_SlaveAddress);
IIC_Write_Byte(reg);
IIC_Stop();
}
// 讀取1字節(jié)數(shù)據(jù)
u8 BH1750FVI_Read_Reg(u8 reg)
{
u8 dat;
IIC_Start();
IIC_Write_Byte(BH1750FVI_SlaveAddress);
IIC_Write_Byte(reg);
IIC_Start();
IIC_Write_Byte(BH1750FVI_SlaveAddress + 1);
dat = IIC_Read_Byte();
IIC_Stop();
return dat;
}
u16 BH1750FVI_Read_all()
{
u8 i;
u8 BUF[8];
u16 dat;
IIC_Start();
IIC_Write_Byte(BH1750FVI_SlaveAddress + 1);
for(i = 0; i < 2; i++)
{
BUF[i] = IIC_Read_Byte();
if(i == 2){
IIC_Send_Ack(1);
}else{
IIC_Send_Ack(0);
}
}
IIC_Stop();
dat = BUF[0]< 8 + BUF[1];
return dat;
}
u16 BH1750FVI_Measure()
{
BH1750FVI_Write_Reg(BH1750FVI_ON);
BH1750FVI_Write_Reg(BH1750FVI_CON_H);
return BH1750FVI_Read_all();
}
void BH1750FVI_Init()
{
BH1750FVI_Write_Reg(BH1750FVI_DOWN);
BH1750FVI_Write_Reg(BH1750FVI_ON);
}