呼吸灯的概念和实现原理

描述

引言: 呼吸灯在日常生活中经常见到,如电子时钟,小夜灯等等,本文我们介绍下通过PWM波来控制LED灯,实现呼吸灯功能。

1.呼吸灯概念

呼吸灯其实是在处理器的控制下,由暗渐亮、然后再由亮渐暗,其实现效果类似人的呼吸方式的LED灯。其要实现呼吸周期重复,明暗渐变功能。

2.实现原理

由于FPGA管脚输出逻辑电平只有“0”和“1”,因此并不能通过FPGA来改变LED两侧电压差来实现呼吸灯。但是,我们可以通过改变单位时间内亮灯时间的占空比来实现呼吸效果,即在固定频率下,通过调整占空比来控制LED的亮灭,又称作PWM(Pulse Width Modulation)调制。PWM是对模拟电路控制的一种非常有效的技术,广泛应用于测量、功率控制、通信等领域。

FPGA

图1:占空比调整示意图

3.硬件介绍

LED灯电路如下图所示,图中电阻起限流作用,保证LED不会超过其工作最大电流,当FPGA IO口输出低电平时,LED灯点亮,反之,LED灯熄灭。

FPGA

图2:LED灯电路图

4.FPGA软件设计

本设计呼吸灯的亮灭周期是2S,PWM每间隔2ms更新一次,共计更新100次即2S后切换PWM的占空比调整方向。因此PWM占空比的调整是和2ms定时计数器和2S定时计数器相关。系统框图如下:

FPGA

图3:呼吸灯PWM产生框图

上图中包含了3个定时计数器:

(1)20us定时器,作为本系统的基本定时器,产生时间基准;

(2)20ms定时器,通过20us定时器,计数100次完成20ms定时计数;

(3)2s定时器,通过20ms定时器,计数100次完成2S定时计数。

20us定时器代码:

 

//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

Quartusii软件:11.0

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

FPGA

图4:SignalTapII在线抓取波形

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分