引言:呼吸灯在日常生活中经常见到,如电子时钟,小夜灯等等,本文我们介绍下通过PWM波来控制LED灯,实现呼吸灯功能。
1.呼吸灯概念
呼吸灯其实是在处理器的控制下,由暗渐亮、然后再由亮渐暗,其实现效果类似人的呼吸方式的LED灯。其要实现呼吸周期重复,明暗渐变功能。
2.实现原理
由于FPGA管脚输出逻辑电平只有“0”和“1”,因此并不能通过FPGA来改变LED两侧电压差来实现呼吸灯。但是,我们可以通过改变单位时间内亮灯时间的占空比来实现呼吸效果,即在固定频率下,通过调整占空比来控制LED的亮灭,又称作PWM(Pulse Width Modulation)调制。PWM是对模拟电路控制的一种非常有效的技术,广泛应用于测量、功率控制、通信等领域。
图1:占空比调整示意图
3.硬件介绍
LED灯电路如下图所示,当电阻其限流作用,保证LED不会超过其工作最大电流,当FPGA IO口输出低电平时,LED灯点亮,反之,LED灯熄灭。
图2:LED灯电路图
4.FPGA软件设计
本设计呼吸灯的亮灭周期是2S,PWM每间隔2ms更新一次,共计更新100次即2S后切换PWM的占空比调整方向。因此PWM占空比的调整是和2ms定时计数器和2S定时计数器相关。系统框图如下:
图3:呼吸灯PWM产生框图
上图中包含了3个定时计数器:
(1)20us定时器,作为本系统的基本定时器,产生时间基准;(2)20ms定时器,通过20us定时器,计数100次完成20ms定时计数;(3)2s定时器,通过20ms定时器,计数100次完成2S定时计数。
1us定时器代码:
//20us 定时器
always @(posedge i_sysclk_p or negedge i_rstn)begin
if(i_rstn == 1'b0)
cnt_20us_timer <= 0;
else if(cnt_20us_timer < T20US_SET)
cnt_20us_timer <= cnt_20us_timer + 1'b1;
else
cnt_20us_timer <= 24'd0;
end
20ms比较定时器代码:
//20ms pwm比较定时器,基于 1us timer
always @(posedge i_sysclk_p or negedge i_rstn)begin
if(i_rstn == 1'b0)
cnt_20ms_timer <= 0;
else if(20us_timer_done)
cnt_20ms_timer <= (cnt_20ms_timer < T20MS_SET) ? (cnt_20ms_timer + 1'b1) : 10'd0;
else
cnt_20ms_timer <= cnt_20ms_timer ;
end
5.软件在线仿真与实测
硬件平台:EP2C8Q208C8N
工程编译完成后,下载bit文件到电路板,PWM波测试结果如下图所示。
图4:SignalTapII在线抓取波形
欢迎关注FPGA技术实战公众号,喜欢就多多转发吧!