IC光度傳感器模塊種類很多,我選擇一種比較常用的模塊(BH1750)做外設(shè)移植。BH1750的優(yōu)點(diǎn)如下:
1、支持標(biāo)準(zhǔn)快速模式的IIC通信
2、模塊IIC通信地址可以通過(guò)特定引腳的電平進(jìn)行改變,在同一IIC總線下可以掛載兩個(gè)BH1750模塊
3、可捕獲光照強(qiáng)度范圍廣,范圍為1至65535lx
4、接近視覺靈敏度的光譜靈敏度特性
5、通過(guò)50Hz/60Hz除光噪音功能實(shí)現(xiàn)穩(wěn)定的測(cè)定
6、光源依懶性弱
7、最小誤差為±20%
8、受紅外影響很小
BH1750模塊如下圖所示
需要重點(diǎn)關(guān)注的是模塊電源電壓的額定值為4.5V,所以模塊的供電電壓最好用3.3V的電源供電,否則會(huì)影響模塊的使用壽命。
BH1750測(cè)量程序步驟
官方的技術(shù)文檔給出了各種模塊下測(cè)量的程序步驟,這對(duì)驅(qū)動(dòng)的編寫很有用處。測(cè)量程序步驟如下圖所示
從圖中可以看出,BH1750模塊主要有兩種測(cè)量模塊,一種是一次測(cè)量,另外一種是連續(xù)測(cè)量。從測(cè)量模式的流程不難看出,一次測(cè)量模式主要應(yīng)用于間歇性定時(shí)測(cè)量,這樣可以節(jié)約模塊的電量損耗,尤其是模塊用在需要用電池供電的移動(dòng)設(shè)備。但是一次測(cè)量模式帶來(lái)的缺點(diǎn)是測(cè)量時(shí)間會(huì)變長(zhǎng),因?yàn)槊看味夹枰匦陆o模塊通電。對(duì)應(yīng)的連續(xù)測(cè)量模式主要應(yīng)用在對(duì)電量損耗影響可以忽略且需要實(shí)時(shí)獲取光照強(qiáng)度值的設(shè)備中,每次測(cè)量時(shí)間相對(duì)來(lái)說(shuō)會(huì)比較短一點(diǎn)。
但是在測(cè)試過(guò)程中發(fā)現(xiàn)若發(fā)送的指令是一次測(cè)量的指令,讀取數(shù)據(jù)后還可以繼續(xù)讀取下一次測(cè)量的數(shù)據(jù),且數(shù)據(jù)是有效的。這一點(diǎn)和官方給的文檔有很大的差距,可能購(gòu)買的模塊是改過(guò)的。這一點(diǎn)在大家使用過(guò)程中需要著重注意一下。
BH1750IIC設(shè)備地址
BH1750IIC的設(shè)備地址可以通過(guò)模塊引腳的ADDR邏輯電平值決定。對(duì)應(yīng)模塊的ADO引腳,如圖所示
手冊(cè)中也給出當(dāng)ADO(有些模塊的絲印是ADDR)接不同的邏輯電平時(shí)通信的時(shí)序?qū)嵗缦聢D所示
從圖中可以看出當(dāng)ADO接邏輯低電平(GND)時(shí),BH1750的IIC通信地址為0x23;當(dāng)ADO接邏輯高電平(VCC)時(shí),BH1750的IIC通信地址為0x5c??梢钥闯?x23和0x5c為七位二進(jìn)制互為取反。且經(jīng)過(guò)自測(cè)發(fā)現(xiàn)ADO的高電平邏輯的電壓是可以接到5V上的,但是建議在接線的時(shí)候最好是接到和VCC保持一樣的電平值。若不使用BH1750的ADO修改IIC通信地址的功能需要將ADO接至高電平或低電平,不能懸空。ADO也可以接I/O口,通過(guò)I/O來(lái)控制BH1750的IIC通信地址,但是在一個(gè)完整的指令傳輸中,發(fā)送的地址要和ADO的控制邏輯要一致,否則會(huì)通信失敗。
BH1750支持的指令
BH1750支持多種不同分辨率的測(cè)量模式,可以支持1lx、0.5lx和4lx不同分辨率的測(cè)試模式。也支持通過(guò)指令控制模塊的供電狀態(tài)以及測(cè)量時(shí)間的改變(建議不要修改測(cè)量時(shí)間,否則會(huì)影響測(cè)量的準(zhǔn)確度,驅(qū)動(dòng)也并未提供修改測(cè)量時(shí)間的接口函數(shù),若有興趣深入學(xué)習(xí)的朋友可以根據(jù)提供的文檔進(jìn)行嘗試)。具體支持的指令集如下表所示
需要注意的是表中的L模式的分辨率為41lx與英文文檔(4lx)的分辨率不一樣,是因?yàn)樵摫硎菑闹形奈臋n截取的。BH1750的中文文檔也是多方查找才找到的資源,雖然有錯(cuò)誤的地方,但是并不影響整體的閱讀。從測(cè)試流程可以得知測(cè)試模式有一次和連續(xù)的,從上圖中也可以進(jìn)一步知道在一次和連續(xù)測(cè)試模式下根據(jù)分辨率的不同又有H、H2和L模式的區(qū)分。所以BH1750總共有6中測(cè)試模式,但是在實(shí)際測(cè)試過(guò)程中只有三種測(cè)試模式,因?yàn)橐淮蔚臏y(cè)試模式也可以連續(xù)讀取有效的數(shù)據(jù)。
BH1750驅(qū)動(dòng)編寫
BH1750用的是IIC通信,所以可以復(fù)用上一篇AHT20外設(shè)移植時(shí)寫的IIC指令下發(fā)和數(shù)據(jù)讀取兩個(gè)函數(shù),在此只復(fù)制過(guò)來(lái),代碼很簡(jiǎn)單,詳細(xì)的介紹可以看
AHT20外設(shè)移植帖子。
IIC寫指令函數(shù)定義為
IIC讀數(shù)據(jù)指令為
接下來(lái)是封裝BH1750指令的函數(shù)。首先是電源狀態(tài)控制函數(shù),函數(shù)定義如下
參數(shù)_powerSta傳遞BH1750電源通電狀態(tài)控制指令,通電需要下發(fā)0x01,斷電需要下發(fā)0x00。參數(shù)枚舉類型定義如下
該函數(shù)在IIC初始化后會(huì)被調(diào)用一次,且參數(shù)為BH1750_POWAER_ON_CMD,用于給BH1750模塊的芯片發(fā)送供電指令。
然后是BH1750重置函數(shù),函數(shù)定義如下
重置BH1750是下發(fā)指令BH1750_RESET_CMD,且BH1750_RESET_CMD為一個(gè)宏定義,定義如下
參數(shù)指令下發(fā)模式函數(shù)定義如下
參數(shù)_TestMode可以選擇下發(fā)的模式是什么,這樣通用性更強(qiáng)。
最后是獲取并計(jì)算光照強(qiáng)度數(shù)據(jù)。相關(guān)函數(shù)定義為
函數(shù)是先下發(fā)測(cè)試模式,這里我選擇的是連續(xù)H模式,通過(guò)BH1750.h文件中的宏定義決定測(cè)試模式是什么,宏定義如下
然后是延時(shí)180ms,等待芯片測(cè)量成功。不同的測(cè)量模式需要等待不同的測(cè)試時(shí)間,這里我已經(jīng)把所有可選的測(cè)量模式的等待時(shí)間全部列出來(lái),通過(guò)模式的選擇確定需要等待多長(zhǎng)時(shí)間。因?yàn)闆]有狀態(tài)的讀取,所以直接獲取光照強(qiáng)度的數(shù)據(jù)。獲取后根據(jù)光照強(qiáng)度的計(jì)算公式進(jìn)行轉(zhuǎn)換,然后將轉(zhuǎn)換后的結(jié)果保存在參數(shù)指針_LuxVal中。
由于文檔沒有明確給出具體的轉(zhuǎn)換公式,所以只能從文檔中給出的列子中去推導(dǎo)出轉(zhuǎn)換公式。
從圖中可以看出,測(cè)量完畢后會(huì)收到16位(兩字節(jié))的數(shù)據(jù),且這兩字節(jié)的數(shù)據(jù)都是光照強(qiáng)度數(shù)值,沒有其他的數(shù)據(jù),高位在前低位在后。代碼也是接收兩個(gè)字節(jié)的數(shù)據(jù)(IIC_RecData(RecData, 2);)。圖中的測(cè)試模式高分辨率模式和一次低分辨率模式分別對(duì)應(yīng)H和L模式。通過(guò)計(jì)算公式可以推導(dǎo)出轉(zhuǎn)換公式為:光照強(qiáng)度數(shù)值(lx)=((接收到的第一個(gè)字節(jié)數(shù)據(jù)<< 8)+接收到的第二個(gè)字節(jié)數(shù)據(jù) )/1.2。其中也可以得出在L模式的測(cè)試下若收到的第二個(gè)字節(jié)數(shù)據(jù)的最低位為1的話,那么該數(shù)據(jù)或模式是有問題。因?yàn)長(zhǎng)模式的分辨率為4lx,按照轉(zhuǎn)換公式的話,接收到的光照強(qiáng)度數(shù)據(jù)的第二個(gè)字節(jié)數(shù)據(jù)的最低位必須為0。除了有H和L模式外還有H2模式,再次通過(guò)文檔的例程可以繼續(xù)推導(dǎo)出H2模式的轉(zhuǎn)換公式。
從圖中可以看出H2模式的各位的權(quán)值??梢钥闯龅氖鞘盏降牡诙€(gè)字節(jié)數(shù)據(jù)的最低位的權(quán)值為-1,與H和L模式的權(quán)值0不一樣。所以在轉(zhuǎn)換過(guò)程中可以列出兩種轉(zhuǎn)換公式。在驅(qū)動(dòng)代碼中也是給出兩種轉(zhuǎn)換公式,也是根據(jù)BH1750.h文件中選擇的測(cè)試模式進(jìn)行選擇轉(zhuǎn)換公式。
BH1750的初始化函數(shù)定義如下
先是初始化IIC,這次用的外設(shè)資源是IIC0。初始化完之后是調(diào)用模塊芯片供電函數(shù),這個(gè)在前面已經(jīng)介紹過(guò)了,在此不做過(guò)多介紹。
在BH1750.c中有一個(gè)函數(shù)被注釋掉,該函數(shù)的功能是輪詢BH1750所有的測(cè)試模式,通過(guò)main函數(shù)的調(diào)用和數(shù)據(jù)的串口打印,可以對(duì)BH1750的各種測(cè)試模式進(jìn)行輪詢測(cè)試,大家若有興趣可以將這段函數(shù)去掉注釋,然后在main函數(shù)進(jìn)行調(diào)用且用串口打印光照強(qiáng)度數(shù)值。
函數(shù)BH1750_TestModePoll與光照強(qiáng)度讀取函數(shù)BH1750_ReadLightIntensity的區(qū)別是函數(shù)BH1750_TestModePoll會(huì)輪詢所有的測(cè)試模式并讀取數(shù)據(jù),函數(shù)BH1750_ReadLightIntensity會(huì)根據(jù).h文件的模式選擇宏定義進(jìn)行讀取,且若模式選擇的是一次測(cè)量模式,為了與文檔的測(cè)試流程一致所以先發(fā)送供電指令再發(fā)送測(cè)試模式設(shè)置,若把該步驟去掉模塊也可以正常工作。
在main函數(shù)中首先是調(diào)用BH1750的初始化代碼,然后是每隔1S讀取一下光強(qiáng)度值,將讀取到的數(shù)據(jù)通過(guò)串口調(diào)試接口打印出來(lái)。通過(guò)綠燈閃爍頻率為1S的方式告訴Ai-M61開發(fā)板在正常工作。main函數(shù)定義如下
BH1750驅(qū)動(dòng)代碼驗(yàn)證
按照如下的接線方式進(jìn)行接線,我用的是外設(shè)IIC0的資源獲取BH1750采集到的的光強(qiáng)度數(shù)值,連接方式如下
將程序燒進(jìn)開發(fā)板后按下復(fù)位按鍵便可通過(guò)串口查看模塊獲取到的光強(qiáng)度值。串口打印信息如下圖所示
BH1750模塊問題
BH1750模塊在寫驅(qū)動(dòng)的時(shí)候最大的問題是中文文檔不好找,我也是在非常老的論壇上下載下來(lái)的,而且里面也有很多錯(cuò)誤的地方,這些錯(cuò)誤的地方也讓我走了很多彎路,浪費(fèi)了很長(zhǎng)的時(shí)間。至于其他的問題,大家可以參考我寫的問題匯總帖子。
BH1750驅(qū)動(dòng)代碼
壓縮文件有BH1750的驅(qū)動(dòng)代碼和BH1750中英文數(shù)據(jù)手冊(cè)各一份外還有BH1750通信過(guò)程中用Kingst金思特邏輯分析儀抓取的數(shù)據(jù)波形。若要看數(shù)據(jù)波形可以搜索Kingst金思特邏輯分析儀官網(wǎng)下載官方軟件,然后導(dǎo)入該文件就可以查看了。
審核編輯:劉清
-
電源電壓
+關(guān)注
關(guān)注
2文章
982瀏覽量
23916 -
邏輯電平
+關(guān)注
關(guān)注
0文章
150瀏覽量
14392 -
邏輯分析儀
+關(guān)注
關(guān)注
3文章
214瀏覽量
23124 -
光度傳感器
+關(guān)注
關(guān)注
0文章
4瀏覽量
4390 -
IIC通信
+關(guān)注
關(guān)注
0文章
19瀏覽量
2999
原文標(biāo)題:【外設(shè)移植】I2C 光照度傳感器(BH1750)M61開發(fā)板驅(qū)動(dòng)
文章出處:【微信號(hào):安信可科技,微信公眾號(hào):安信可科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論