干货 | 基于FPGA的呼吸灯设计

引言:呼吸灯在日常生活中经常见到,如电子时钟,小夜灯等等,本文我们介绍下通过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 timeralways @(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

  • Quartusii软件:11.0

工程编译完成后,下载bit文件到电路板,PWM波测试结果如下图所示。

图片

图4:SignalTapII在线抓取波形

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值