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。可以看出0x23和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

    文章

    987

    浏览量

    23952
  • 逻辑电平
    +关注

    关注

    0

    文章

    151

    浏览量

    14407
  • 逻辑分析仪
    +关注

    关注

    3

    文章

    214

    浏览量

    23148
  • 光度传感器
    +关注

    关注

    0

    文章

    4

    浏览量

    4394
  • IIC通信
    +关注

    关注

    0

    文章

    19

    浏览量

    3005

原文标题:【外设移植】I2C 光照度传感器(BH1750)M61开发板驱动

文章出处:【微信号:安信可科技,微信公众号:安信可科技】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

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

    xs128怎么控制bh1750光照度传感器,没有IIC,怎么用啊?
    发表于 05-18 06:16

    「超级干货」STM32CubeMX学习教程之硬件I2C读取光照度

    数据(BH1750),单片机采用I2C协议和光照度模块进行通信,采用I2C1,配置如下图所示:6.配置时钟树STM32L4的最高主频到80M
    发表于 09-29 14:29

    基于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次下载
    STC89<b class='flag-5'>C</b>51单片机应用<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>测量及显示的源代码免费下载

    STM32单片机基础14——使用硬件I2C读取环境光强度传感器数据(BH1750

    本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件I2C外设读取环境光强度传感器数据(BH1750)。1. 准备工作硬件准备开发板首先需要准备一个
    发表于 11-21 16:51 19次下载
    STM32单片机基础14——使用硬件<b class='flag-5'>I2C</b>读取环境光强度<b class='flag-5'>传感器</b>数据(<b class='flag-5'>BH1750</b>)

    【STM32Cube_14】使用硬件I2C读写环境光强度传感器BH1750

    本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件I2C外设读取环境光强度传感器数据(BH1750
    发表于 12-05 16:51 29次下载
    【STM32Cube_14】使用硬件<b class='flag-5'>I2C</b>读写环境光强度<b class='flag-5'>传感器</b>(<b class='flag-5'>BH1750</b>)

    数字可显示光照度

    这个部分我们用 光照度传感器BH1750)、最小系统(STC12C5A60S2)、lcd1602显示屏。代码部分:#ifnd
    发表于 12-23 19:21 6次下载
    数字可显示<b class='flag-5'>光照度</b>表

    [HAL]STM32F1光照度测量BH1750 串口输出

    [HAL]STM32F1光照度测量BH1750 串口输出硬件连接:使用到的硬件有:STM32F103C8T6最小系统,USB转TTL模块(串口通信),
    发表于 01-12 20:26 15次下载
    [HAL]STM32F1<b class='flag-5'>光照度</b>测量<b class='flag-5'>BH1750</b> 串口输出

    基于BH1750光照强度传感器

    光强传感器 BH1750
    的头像 发表于 07-27 11:38 1.1w次阅读
    基于<b class='flag-5'>BH1750</b>的<b class='flag-5'>光照</b>强度<b class='flag-5'>传感器</b>

    BH1750光照传感器模块设计原理图

    BH1750光照传感器模块设计包含原理图及PCB文件
    发表于 05-25 15:49 38次下载

    【外设移植】I2C 光照度传感器BH1750M61开发板驱动

    本作品由安信可社区用户 制作 IC光度传感器模块种类很多,我选择一种比较常用的模块(BH1750)做外设移植。BH1750的优点如下: 1、支持标准快速模式的IIC通信 2、模块IIC
    的头像 发表于 03-21 11:24 921次阅读
    【外设移植】<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>