FPGA——驱动BH1750

该博客详细介绍了如何利用Verilog驱动GY302模块中的BH1750芯片来检测环境光强。内容包括BH1750的工作模式、IIC总线时序以及Verilog代码实现。在Verilog代码中,通过状态机控制发送命令、读取数据的过程,并实现了IIC通信的开始和结束条件、数据稳定和ACK应答位等关键步骤。最终,读取到的16位光强值需除以1.2得到实际光强。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GY302模块

最近做项目用到了这个模块,记录一下。GY302模块可以检测当前的环境光强值,用到的是BH1750芯片。
在这里插入图片描述
模块一共五个引脚:Vcc、GND、SCL、SDA和ADDR。

BH1750芯片手册

大致浏览下BH1750芯片手册,可以获得以下信息:
1、
在这里插入图片描述
芯片采用标准的IIC总线接口

2、
在这里插入图片描述
这张图说明芯片由两种工作模式:One Time 和 Continuous 模式,在One Time模式下读取完一次光强值会直接自动回到Power Down状态,也就是再想读光强的话需要重新写一次寄存器,而Continuous模式则可以连续读

3、
在这里插入图片描述
下面标黄的句子告诉我们推荐使用H-Resolution Mode,在上面的表中我们可以查到这个模式对应的Opencode是0001_0000,其实就对应写进寄存器的数据。

4、
在这里插入图片描述
这里说明了寄存器的地址是什么,它对应于模块ADDR引脚的电平高低,如果是>=0.7VCC的高电平,则寄存器地址为1011100,反之则为0100011

5、
在这里插入图片描述
芯片手册中也给了我们几个example,这个例子是ADDR低电平,Continuously H-resolution mode的,符合我们的要求,可见它的写寄存器地址和数据都是上文提到的,所以我们可以直接以这种方式驱动BH1750去获取环境光强。还需要注意发送完指令后需要等待180ms的时间才可以进行read result的操作,然后每隔120ms可以重新读取一次

IIC总线时序

1、首先是IIC总线通信的开始条件和结束条件:
在这里插入图片描述
在串行时钟线SCL为高时拉低SDA,表明开始一次IIC通信。在串行时钟线SCL为高时拉高SDA,表明结束一次IIC通信

2、然后,就要注意SCL为高时,SDA数据线上的数据必须稳定。不管是谁控制SDA数据线都必须遵循这个原则。
在这里插入图片描述
只有在SCL时钟线为低电平时,才可以改变SDA总线上的值

3、ACK应答位信号,为低电平时有效。如果FPGA给BH1750写数据,那么需要校验一个低电平的校验位,才可以进行下一次有效的写。同样,如果FPGA从BH1750读数据,在读完一个字节后,需要发送一个低电平的ACK应答位给BH1750。不过要注意,在最后一个字节读完后,FPGA需要返回一个非有效ACK位,即拉高总线的值,表示不再接受数据

Verilog驱动

在清楚要用IIC总线发送和接收的值以及IIC总线的时序之后,我们就可以编写verilog驱动。代码大致思路就是通过几个大的状态机:初始化、发送指令、等待、读取数据,进行整体状态控制。再在发送指令和读取数据状态使用内部状态机去构造IIC时序,最后将光强值打包输出,具体代码如下:

module	bh1750_driver
#(
		parameter				TIME_1S			=	480_000_000	,
		parameter				TIME_180MS		=	864_0000	,
		parameter				TIME_120MS		=	576_0000	,
		parameter				CLOCK_DIV		=	480			,
		parameter				SEND_FIRST_BYTE	=	8'b01000110	,
		parameter				SEND_SECOND_BYTE=	8'b00010000	,
		parameter				SEND_THIRD_BYTE	=	8'b01000111	
)
(
		input					clk								,
		input					reset							,
		output	wire			scl								,
		inout	wire			sda								,
		output	reg		[15:0]	lux_data						,
		output	wire			lux_data_vld					
);					
			
		localparam				INIT			=	5'b00001	;
        localparam				SEND_COMMAND	=	5'b00010	;
        localparam				WAIT_RESULT_1	=	5'b00100	;
        localparam				READ_RESULT		=	5'b01000	;
        localparam				WAIT_RESULT_2	=	5'b10000	;
		localparam				CLOCK_DIV_HALF	=	CLOCK_DIV/2 ;
        localparam				CLOCK_DIV_QUAT	=	CLOCK_DIV/4	;
		
		localparam				SEND_INIT		=	3'd0		;
		localparam				LOAD_SECOND_BYTE=	3'd2		;
		localparam				SEND_START		=	3'd3		;
		localparam				SEND_BYTE		=	3'd4		;
		localparam				RECIVE_ACK		=	3'd5		;
		localparam				LOAD_FIRST_BYTE	=	3'd1		;
		localparam				CHECK_ACK		=	3'd6		;
		localparam				SEND_END		=	3'd7		;
		
		localparam				READ_INIT		=	4'd0		;
		localparam				LOAD_SEND_BYTE	=	4'd1		;
		localparam				READ_START		=	4'd2		;
		localparam				READ_SEND_BYTE	=	4'd3		;
		localparam				READ_ACK		=	4'd4		;
		localparam				CHECK_READ_ACK	=	4'd5		;
		localparam				READ_HIGH_BYTE	=	4'd6		;
		localparam				SEND_FIRST_ACK	=	4'd7		;
		localparam				SEND_ACK_READ	=	4'd8		;
		localparam				READ_LOW_BYTE	=	4'd9		;
		localparam				SEND_SECOND_ACK	=	4'd10		;
		localparam				SEND_ACK_END	=	4'd11		;
        localparam				READ_END		=	4'd12		;

		reg				[ 4:0]	state_c_global					;
		reg				[ 
基于FPGA的智能环境感知自适应照明系统设计与实现——融合人体追踪与生物节律算法》 --- **核心创新点** 1. **动态人体追踪照明** - 采用PIR阵列传感器实现人体移动轨迹预测 - 基于FIR滤波器的多传感器数据融合算法 - 动态PWM调光控制(支持256级亮度调节) 2. **生0法** - 嵌入式时钟模块实现当地时间同步 - 基于CIE光照曲线的色温动态调节 - 结合褪黑素分泌模型的亮度调控策略 3. **物联网集成架构** - 基于UART的自定义轻量级通信协议 - ESP8266 WiFi模块云端交互设计 - 异常照明状态远程报警功能 --- **技术实现方案** 1. **硬件架构** - 主控:EP4CEF17C8 FPGA - 传感器阵列:AMG8833红外阵列 + BH1750光强传感器 - 执行机构:WS2812B智能LED灯带 - 通信模块:ESP8266 WiFi模组 2. **关键模块设计** - **运动轨迹预测模块** 3. **系统集成创新** - 多时钟域协同控制架构 - 基于Avalon总线的软核处理器集成 - 自适应噪声抑制算法(ANR)实现 --- **预期成果与工作量** 1. **硬件实现** - 完成8路PWM通道控制 - 实现≤5ms的响应延迟 - 构建完整的传感器-处理-执行链路 2. **算法创新** - 提出改进型粒子滤波追踪算法 - 开发基于CIE 015:2018的简化计算模型 - 实现光照强度与色温的协同调控 3. **论文支撑点** - 系统架构设计方法论 - 多源数据融合算法对比分析 - 生物节律调控效果验证 - 典型应用场景能耗分析
最新发布
04-11
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值