<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

I2C光照度傳感器(BH1750)M61開發板驅動步驟

安信可科技 ? 來源:安信可科技 ? 2024-03-17 16:00 ? 次閱讀

IC光度傳感器模塊種類很多,我選擇一種比較常用的模塊(BH1750)做外設移植。BH1750的優點如下:

1、支持標準快速模式的IIC通信

2、模塊IIC通信地址可以通過特定引腳的電平進行改變,在同一IIC總線下可以掛載兩個BH1750模塊

3、可捕獲光照強度范圍廣,范圍為1至65535lx

4、接近視覺靈敏度的光譜靈敏度特性

5、通過50Hz/60Hz除光噪音功能實現穩定的測定

6、光源依懶性弱

7、最小誤差為±20%

8、受紅外影響很小

BH1750模塊如下圖所示

cebc162a-e2bb-11ee-a297-92fbcf53809c.jpg

BH1750電氣參數

cecc22c2-e2bb-11ee-a297-92fbcf53809c.png

ceea2a74-e2bb-11ee-a297-92fbcf53809c.png

需要重點關注的是模塊電源電壓的額定值為4.5V,所以模塊的供電電壓最好用3.3V的電源供電,否則會影響模塊的使用壽命。

BH1750測量程序步驟

官方的技術文檔給出了各種模塊下測量的程序步驟,這對驅動的編寫很有用處。測量程序步驟如下圖所示

ceee5680-e2bb-11ee-a297-92fbcf53809c.png

從圖中可以看出,BH1750模塊主要有兩種測量模塊,一種是一次測量,另外一種是連續測量。從測量模式的流程不難看出,一次測量模式主要應用于間歇性定時測量,這樣可以節約模塊的電量損耗,尤其是模塊用在需要用電池供電的移動設備。但是一次測量模式帶來的缺點是測量時間會變長,因為每次都需要重新給模塊通電。對應的連續測量模式主要應用在對電量損耗影響可以忽略且需要實時獲取光照強度值的設備中,每次測量時間相對來說會比較短一點。

但是在測試過程中發現若發送的指令是一次測量的指令,讀取數據后還可以繼續讀取下一次測量的數據,且數據是有效的。這一點和官方給的文檔有很大的差距,可能購買的模塊是改過的。這一點在大家使用過程中需要著重注意一下。

BH1750IIC設備地址

BH1750IIC的設備地址可以通過模塊引腳的ADDR邏輯電平值決定。對應模塊的ADO引腳,如圖所示

cf043bbc-e2bb-11ee-a297-92fbcf53809c.png

手冊中也給出當ADO(有些模塊的絲印是ADDR)接不同的邏輯電平時通信的時序實例,如下圖所示

cf0cf798-e2bb-11ee-a297-92fbcf53809c.png

從圖中可以看出當ADO接邏輯低電平(GND)時,BH1750的IIC通信地址為0x23;當ADO接邏輯高電平(VCC)時,BH1750的IIC通信地址為0x5c??梢钥闯?x23和0x5c為七位二進制互為取反。且經過自測發現ADO的高電平邏輯的電壓是可以接到5V上的,但是建議在接線的時候最好是接到和VCC保持一樣的電平值。若不使用BH1750的ADO修改IIC通信地址的功能需要將ADO接至高電平或低電平,不能懸空。ADO也可以接I/O口,通過I/O來控制BH1750的IIC通信地址,但是在一個完整的指令傳輸中,發送的地址要和ADO的控制邏輯要一致,否則會通信失敗。

BH1750支持的指令

BH1750支持多種不同分辨率的測量模式,可以支持1lx、0.5lx和4lx不同分辨率的測試模式。也支持通過指令控制模塊的供電狀態以及測量時間的改變(建議不要修改測量時間,否則會影響測量的準確度,驅動也并未提供修改測量時間的接口函數,若有興趣深入學習的朋友可以根據提供的文檔進行嘗試)。具體支持的指令集如下表所示

cf232e50-e2bb-11ee-a297-92fbcf53809c.png

需要注意的是表中的L模式的分辨率為41lx與英文文檔(4lx)的分辨率不一樣,是因為該表是從中文文檔截取的。BH1750的中文文檔也是多方查找才找到的資源,雖然有錯誤的地方,但是并不影響整體的閱讀。從測試流程可以得知測試模式有一次和連續的,從上圖中也可以進一步知道在一次和連續測試模式下根據分辨率的不同又有H、H2和L模式的區分。所以BH1750總共有6中測試模式,但是在實際測試過程中只有三種測試模式,因為一次的測試模式也可以連續讀取有效的數據。

BH1750驅動編寫

BH1750用的是IIC通信,所以可以復用上一篇AHT20外設移植時寫的IIC指令下發和數據讀取兩個函數,在此只復制過來,代碼很簡單,詳細的介紹可以看

AHT20外設移植帖子。

IIC寫指令函數定義為

cf2c4738-e2bb-11ee-a297-92fbcf53809c.png

IIC讀數據指令為

cf376622-e2bb-11ee-a297-92fbcf53809c.png

接下來是封裝BH1750指令的函數。首先是電源狀態控制函數,函數定義如下

cf44d370-e2bb-11ee-a297-92fbcf53809c.png

參數_powerSta傳遞BH1750電源通電狀態控制指令,通電需要下發0x01,斷電需要下發0x00。參數枚舉類型定義如下

cf4f59ee-e2bb-11ee-a297-92fbcf53809c.png

該函數在IIC初始化后會被調用一次,且參數為BH1750_POWAER_ON_CMD,用于給BH1750模塊的芯片發送供電指令。

然后是BH1750重置函數,函數定義如下

cf5e9792-e2bb-11ee-a297-92fbcf53809c.png

重置BH1750是下發指令BH1750_RESET_CMD,且BH1750_RESET_CMD為一個宏定義,定義如下

cf69cce8-e2bb-11ee-a297-92fbcf53809c.png

參數指令下發模式函數定義如下

cf784728-e2bb-11ee-a297-92fbcf53809c.png

參數_TestMode可以選擇下發的模式是什么,這樣通用性更強。

最后是獲取并計算光照強度數據。相關函數定義為

cf86c988-e2bb-11ee-a297-92fbcf53809c.png

函數是先下發測試模式,這里我選擇的是連續H模式,通過BH1750.h文件中的宏定義決定測試模式是什么,宏定義如下

cf98979e-e2bb-11ee-a297-92fbcf53809c.png

然后是延時180ms,等待芯片測量成功。不同的測量模式需要等待不同的測試時間,這里我已經把所有可選的測量模式的等待時間全部列出來,通過模式的選擇確定需要等待多長時間。因為沒有狀態的讀取,所以直接獲取光照強度的數據。獲取后根據光照強度的計算公式進行轉換,然后將轉換后的結果保存在參數指針_LuxVal中。

由于文檔沒有明確給出具體的轉換公式,所以只能從文檔中給出的列子中去推導出轉換公式。

cfa6eff6-e2bb-11ee-a297-92fbcf53809c.png

從圖中可以看出,測量完畢后會收到16位(兩字節)的數據,且這兩字節的數據都是光照強度數值,沒有其他的數據,高位在前低位在后。代碼也是接收兩個字節的數據(IIC_RecData(RecData, 2);)。圖中的測試模式高分辨率模式和一次低分辨率模式分別對應H和L模式。通過計算公式可以推導出轉換公式為:光照強度數值(lx)=((接收到的第一個字節數據<< 8)+接收到的第二個字節數據 )/1.2。其中也可以得出在L模式的測試下若收到的第二個字節數據的最低位為1的話,那么該數據或模式是有問題。因為L模式的分辨率為4lx,按照轉換公式的話,接收到的光照強度數據的第二個字節數據的最低位必須為0。除了有H和L模式外還有H2模式,再次通過文檔的例程可以繼續推導出H2模式的轉換公式。

cfb3732a-e2bb-11ee-a297-92fbcf53809c.png

從圖中可以看出H2模式的各位的權值??梢钥闯龅氖鞘盏降牡诙€字節數據的最低位的權值為-1,與H和L模式的權值0不一樣。所以在轉換過程中可以列出兩種轉換公式。在驅動代碼中也是給出兩種轉換公式,也是根據BH1750.h文件中選擇的測試模式進行選擇轉換公式。

BH1750的初始化函數定義如下

cfc4be5a-e2bb-11ee-a297-92fbcf53809c.png

先是初始化IIC,這次用的外設資源是IIC0。初始化完之后是調用模塊芯片供電函數,這個在前面已經介紹過了,在此不做過多介紹。

在BH1750.c中有一個函數被注釋掉,該函數的功能是輪詢BH1750所有的測試模式,通過main函數的調用和數據的串口打印,可以對BH1750的各種測試模式進行輪詢測試,大家若有興趣可以將這段函數去掉注釋,然后在main函數進行調用且用串口打印光照強度數值。

函數BH1750_TestModePoll與光照強度讀取函數BH1750_ReadLightIntensity的區別是函數BH1750_TestModePoll會輪詢所有的測試模式并讀取數據,函數BH1750_ReadLightIntensity會根據.h文件的模式選擇宏定義進行讀取,且若模式選擇的是一次測量模式,為了與文檔的測試流程一致所以先發送供電指令再發送測試模式設置,若把該步驟去掉模塊也可以正常工作。

在main函數中首先是調用BH1750的初始化代碼,然后是每隔1S讀取一下光強度值,將讀取到的數據通過串口調試接口打印出來。通過綠燈閃爍頻率為1S的方式告訴Ai-M61開發板在正常工作。main函數定義如下

cfd27cca-e2bb-11ee-a297-92fbcf53809c.png

BH1750驅動代碼驗證

按照如下的接線方式進行接線,我用的是外設IIC0的資源獲取BH1750采集到的的光強度數值,連接方式如下

cfe0be5c-e2bb-11ee-a297-92fbcf53809c.png

將程序燒進開發板后按下復位按鍵便可通過串口查看模塊獲取到的光強度值。串口打印信息如下圖所示

cff0b992-e2bb-11ee-a297-92fbcf53809c.png

BH1750模塊問題

BH1750模塊在寫驅動的時候最大的問題是中文文檔不好找,我也是在非常老的論壇上下載下來的,而且里面也有很多錯誤的地方,這些錯誤的地方也讓我走了很多彎路,浪費了很長的時間。至于其他的問題,大家可以參考我寫的問題匯總帖子。

BH1750驅動代碼

d00307dc-e2bb-11ee-a297-92fbcf53809c.png

壓縮文件有BH1750的驅動代碼和BH1750中英文數據手冊各一份外還有BH1750通信過程中用Kingst金思特邏輯分析儀抓取的數據波形。若要看數據波形可以搜索Kingst金思特邏輯分析儀官網下載官方軟件,然后導入該文件就可以查看了。




審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 電源電壓
    +關注

    關注

    2

    文章

    931

    瀏覽量

    23647
  • 邏輯電平
    +關注

    關注

    0

    文章

    147

    瀏覽量

    14321
  • 邏輯分析儀
    +關注

    關注

    3

    文章

    206

    瀏覽量

    22951
  • 光度傳感器
    +關注

    關注

    0

    文章

    4

    瀏覽量

    4382
  • IIC通信
    +關注

    關注

    0

    文章

    18

    瀏覽量

    2980

原文標題:【外設移植】I2C 光照度傳感器(BH1750)M61開發板驅動

文章出處:【微信號:安信可科技,微信公眾號:安信可科技】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    xs128怎么控制bh1750光照度傳感器

    xs128怎么控制bh1750光照度傳感器,沒有IIC,怎么用???
    發表于 05-18 06:16

    花房監控系統(環境溫濕度、土壤濕度、光照度),實現澆水、排風、簾子控制等

    ``51單片機控制的花房監控系統(環境溫濕度、土壤濕度、環境光照度):通過手機]通過手機]該系統傳感器有: 1、溫濕度傳感器DHT11? 2、光照度
    發表于 02-28 11:01

    「超級干貨」STM32CubeMX學習教程之硬件I2C讀取光照度

    數據(BH1750),單片機采用I2C協議和光照度模塊進行通信,采用I2C1,配置如下圖所示:6.配置時鐘樹STM32L4的最高主頻到80M
    發表于 09-29 14:29

    【RT-Thread創新應用設計大賽】BH1750光照強度檢測

    BH1750是一種用于光照強度檢測的傳感器,并以I2C接口的方式來工作,為了便于程序移植這里是以GPIO口模擬I2C的方式來
    發表于 11-29 11:10

    BH1750光照傳感器概述

    BH1750光照傳感器篇這里推薦一位博主寫的這個傳感器的文章,可以看下文章鏈接1、產品介紹(1)概述:BH1750FVI 是一種用于兩線式串
    發表于 12-02 06:00

    基于RK3399Pro的BH1750驅動程序開發流程是怎樣的呢

    BH1750是什么?BH1750數字光照度傳感器是如何工作的?基于RK3399Pro的BH1750驅動
    發表于 02-14 07:49

    怎樣去設計一個數字可顯示光照度

    這個部分我們用 光照度傳感器BH1750)、最小系統(STC12C5A60S2)、lcd1602顯示屏。代碼部分:#ifndef _dy
    發表于 02-18 06:11

    如何快速使用STM32 HAL庫讀取光照度數據

    使用STM32 HAL庫讀寫環境光照度傳感器BH1750)本文將教大家如何快速使用STM32HAL庫讀取光照度數據。實現功能:通過APP實時監測
    發表于 03-01 06:10

    求分享BH1750 i2c傳感器驅動程序

    我剛剛完成了 BH1750 驅動程序的第一個版本。我花了一段時間才讓它工作,并且不得不得到一個模擬發現來調試。 如果有人想知道如何使用 I2c,此驅動程序可能有助于入門。非常感謝編寫最
    發表于 05-24 09:00

    STC89C51單片機應用BH1750光照度傳感器的電路圖免費下載

    本文檔的主要內容詳細介紹的是STC89C51單片機應用BH1750光照度傳感器的電路圖免費下載。
    發表于 08-23 08:00 ?91次下載
    STC89C51單片機應用<b class='flag-5'>BH1750</b><b class='flag-5'>光照度</b><b class='flag-5'>傳感器</b>的電路圖免費下載

    使用BH1750和LCD1602實現光照度測量及顯示的源代碼免費下載

    本文檔的主要內容詳細介紹的是使用BH1750和LCD1602實現光照度測量及顯示的源代碼免費下載。
    發表于 12-27 08:00 ?27次下載
    使用<b class='flag-5'>BH1750</b>和LCD1602實現<b class='flag-5'>光照度</b>測量及顯示的源代碼免費下載

    [HAL]STM32F1光照度測量BH1750 串口輸出

    [HAL]STM32F1光照度測量BH1750 串口輸出硬件連接:使用到的硬件有:STM32F103C8T6最小系統板,USB轉TTL模塊(串口通信),光照度小球(主芯片BH1750
    發表于 01-12 20:26 ?15次下載
    [HAL]STM32F1<b class='flag-5'>光照度</b>測量<b class='flag-5'>BH1750</b> 串口輸出

    基于BH1750光照強度傳感器

    光強傳感器 BH1750
    的頭像 發表于 07-27 11:38 ?9967次閱讀
    基于<b class='flag-5'>BH1750</b>的<b class='flag-5'>光照</b>強度<b class='flag-5'>傳感器</b>

    BH1750光照傳感器模塊設計原理圖

    BH1750光照傳感器模塊設計包含原理圖及PCB文件
    發表于 05-25 15:49 ?27次下載

    【外設移植】I2C 光照度傳感器BH1750M61開發板驅動

    本作品由安信可社區用戶 制作 IC光度傳感器模塊種類很多,我選擇一種比較常用的模塊(BH1750)做外設移植。BH1750的優點如下: 1、支持標準快速模式的IIC通信 2、模塊IIC通信地址可以
    的頭像 發表于 03-21 11:24 ?490次閱讀
    【外設移植】<b class='flag-5'>I2C</b> <b class='flag-5'>光照度</b><b class='flag-5'>傳感器</b>(<b class='flag-5'>BH1750</b>)<b class='flag-5'>M61</b><b class='flag-5'>開發板</b><b class='flag-5'>驅動</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>