查看: 989|回复: 5

【论坛小达人】 基于STM32 的BH1750驱动程序

[复制链接]

该用户从未签到

发表于 2018-6-15 11:09:56 | 显示全部楼层 |阅读模式
分享到:
简介:
BH1750FIV是一个采用标准IIC总线接口的环境光强传感器,此传感器适用于获得像键盘LCD和手机背光灯等光强。买的淘宝上贴好的模块,gy30。
指令码:
  1.     /*************************************************************/  
  2.       
  3.     #define BHAddWrite     0x46      //从机地址+最后写方向位  
  4.     #define BHAddRead      0x47      //从机地址+最后读方向位  
  5.     #define BHPowDown      0x00      //关闭模块  
  6.     #define BHPowOn        0x01      //打开模块等待测量指令  
  7.     #define BHReset        0x07      //重置数据寄存器值在PowerOn模式下有效  
  8.     #define BHModeH1       0x10      //高分辨率 单位1lx 测量时间120ms  
  9.     #define BHModeH2       0x11      //高分辨率模式2 单位0.5lx 测量时间120ms  
  10.     #define BHModeL        0x13      //低分辨率 单位4lx 测量时间16ms  
  11.     #define BHSigModeH     0x20      //一次高分辨率 测量 测量后模块转到 PowerDown模式  
  12.     #define BHSigModeH2    0x21      //同上类似  
  13.     #define BHSigModeL     0x23      // 上类似  
  14.     /*************************************************************/  
复制代码

BH1750FIV工六种模式分为连续型和一次型,连续型又分为高精度1、2和低精度模式,单次型同样分为高精度1、2和低精度模式。单次型与连续型的区别在于单次型读完一次数据就会自动转为PowerDown模式。
各模式测量所需时间
时序图
Bh1750采用标准的IIC总线结构,驱动程序也简单,从图可以看出设置高精度连续读模式先发送IIC起始信号再发送7位器件地址+1位写标志位也就是0X46,然后从机应答之后在发送模式指令等待ack应答后发送IIC停止信号这样一条模式就设置完毕。代码如下:

  1.     void bh_data_send(u8 command)  
  2.     {  
  3.         do{  
  4.         iic_start();                      //iic起始信号  
  5.         iic_byte_write(BHAddWrite);       //发送器件地址  
  6.         }while(iic_wait_ack());           //等待从机应答  
  7.         iic_byte_write(command);          //发送指令  
  8.         iic_wait_ack();                   //等待从机应答  
  9.         iic_stop();                       //iic停止信号  
  10.     }   
复制代码

读取数据参照时序图也比较简单,先发送IIC起始信号,在发送7位器件地址+一位读写标志位,等待从机ACK应答,这时主机开始读取IIC数据,再主机读取完8位数据,主机要向从机发送ack应答信号告诉从机接收数据完毕,然后再读取低八位数据,主机发送非应答信号然后结束IIC通信。代码如下:
  1.     u16 bh_data_read(void)  
  2.     {  
  3.         u16 buf;  
  4.         iic_start();                       //iic起始信号  
  5.         iic_byte_write(BHAddRead);         //发送器件地址+读标志位  
  6.         iic_wait_ack();                     //等待从机应答  
  7.         buf=iic_byte_read(1);              //读取数据  
  8.         buf=buf<<8;                        //读取并保存高八位数据  
  9.         buf+=0x00ff&iic_byte_read(0);      //读取并保存第八位数据  
  10.         iic_stop();                        //发送停止信号   
  11.         return buf;   
  12.     }  
复制代码
    这样基本驱动就写完整了下面写一下综合测试代码:
  1.     int main(void)  
  2.     {  
  3.         float datalx;                  
  4.         USART1_Config();  
  5.         delay_init();  
  6.         iic_init();  
  7.          
  8.         bh_data_send(BHPowOn);    //发送启动命令  
  9.         bh_data_send(BHReset);    //清除寄存器内容  
  10.         bh_data_send(BHModeH2);   //设置高精度为模式2  
  11.         delay_ms(180);            //设置完成后要有一段延迟,手册上说最大180ms就可以了  
  12.         while(1)  
  13.         {  
  14.             datalx =bh_data_read()/1.2; //根据手册读取的数据除以1.2就得到单位位lx的光强度检测值。  
  15.             printf ("%f",datalx);  
  16.             delay_ms(500);  
  17.         }  
  18.     }  
复制代码
   串口输出结果:不同光强如图所示。




相关工程文件:

13.png
14.png
15.png
16.png

模拟iic驱动bh1750.zip

4.82 MB, 下载次数: 12

回复

使用道具 举报

  • TA的每日心情
    奋斗
    2019-7-11 15:59
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2018-6-29 17:03:19 | 显示全部楼层
    咦,图片看不到。楼主删了还是社区的问题?还是我的问题?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

     楼主| 发表于 2018-7-2 10:46:15 | 显示全部楼层
    电子星辰 发表于 2018-6-29 17:03
    咦,图片看不到。楼主删了还是社区的问题?还是我的问题?

    图片已补齐
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-25 20:21 , Processed in 0.153872 second(s), 26 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.