0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA学习系列:15. 呼吸灯(pwm)设计

FPGA学习交流 来源:互联网 作者:佚名 2018-06-13 11:21 次阅读

设计背景:

呼吸灯广泛应用于手机之上,并成为各大品牌新款手机的卖点之一。如果手机里面有未处理的通知,比如说未接来电,未查收的短信等等,呼吸灯就会在控制之下完成由亮到暗的逐渐变化,感觉好像是人在呼吸起到一个通知提醒的作用。

设计原理:

关于呼吸灯设计实现的理论主要是PWM有关知识。PWMPluse Width Modulation)脉冲宽度调制,是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。并广泛应用在从测量、通信、功率控制与变换及LED照明等许多领域中。顾名思义,就是占空比可调的信号,那么什么是占空比呢?

占空比(Duty Cycle or Duty Ratio),可以解释为,在一脉冲序列中(方波),正脉冲序列的持续时间与脉冲总周期的比值。也可理解为,电路释放能量的有效时间与总释放时间的比值。

PWM是怎样实现调光呢?想要调节LED的亮度变化,实则是调节控制流经LED电流。电流增大则LED亮度增强,反之减弱。但由于电流为模拟信号,所以这时就用到了PWM。正如下图所示:

image.png

使用一系列等幅不等宽的脉冲来代替一个正弦波,脉冲的宽度根据正弦波a的幅度变化,幅度高,则脉冲宽,反之。

多数负载需要的PWM调制频率都高于10Hz,要想实现呼吸灯的效果必须提高调制频率,通常调制频率为1Khz~200Khz之间。在LED控制中PWM作用于电源部分,脉宽调制的脉冲频率通常大于100Hz,人眼就不会感到闪烁。这里我们取PWM调制频率为1KHzPWM周期为1ms

脉冲频率一定时,输出脉冲的占空比越大,相当于输出的有效电平越大,随着占空比的不同,LED的亮度也将不同。如占空比为0时,则LED不亮,为100%时,则LED最量,我们让占空比从0~100%变化,再从100%~0不断变化,则就可实现呼吸灯效果。

本设计呼吸灯的一个周期为2s,分为占空比增“吸”和占空比减“呼”两种模式,每个为1s,一个PWM周期为2ms,所以每个模式包含1000PWM周期,将每个PWM周期分为1000份,即每个时间段2us

设计架构图:

时钟50M

image.png

设计代码:

设计模块

0modulehuxi_led_state(clk,led,rst_n);

1 inputclk;

2 inputrst_n;

3

4 outputregled;

5

6 parameterT =100_000;

7

8 localparams0 =1'b0;

9 localparams1 =1'b1;

10

11 reg[25:0]lw;

12 reg[25:0]hw;

13

14 reg[16:0]count;

15

16 // 产生2MS的脉冲

17 always@(posedgeclk ornegedgerst_n)

18 if(!rst_n)

19 begin

20 count <=1'b0;

21 end

22 else

23 begin

24 if(count ==T -1)

25 begin

26 count <=1'b0;

27 end

28 else

29 begin

30 count <=count +1'b1;

31 end

32 end

33

34 wireflag;

35 assignflag =(count ==T -1)?1'b1:1'b0;

36

37 regstate;

38

39 // 通过在一个周期中加减高低电平的时间来产生PWM

40 always@(posedgeclk ornegedgerst_n)

41 if(!rst_n)

42 begin

43 lw <=T -100;

44 hw <=100;

45 state <=1'b0;

46 end

47 else

48 begin

49 case(state)

50 s0:begin

51 if(flag &&(lw >100))//判断低电平的时间

52 begin

53 lw <=lw -100;

54 hw <=hw +100;

55 state <=s0;

56 end

57 elseif(flag &&(lw ==100))

58 begin

59 hw <=hw -100;

60 lw <=lw +100;

61 state <=s1;

62 end

63 else

64 begin

65 hw <=hw;

66 lw <=lw;

67 state <=s0;

68 end

69 end

70 s1:begin

71 if(flag &&(hw >100))//判断高电平的时间

72 begin

73 hw <=hw -100;

74 lw <=lw +100;

75 state <=s1;

76 end

77 elseif(flag &&(hw ==100))

78 begin

79 hw <=hw +100;

80 lw <=lw -100;

81 state <=s0;

82 end

83 else

84 begin

85 hw <=hw;

86 lw <=lw;

87 state <=s1;

88 end

89 end

90 default:state <=s0;

91 endcase

92 end

93

94 reg[25:0]cnt;

95 regsum;

96

97 //分频模块,产生不同占空比的LED亮的时间

98 always@(posedgeclk ornegedgerst_n)

99 if(!rst_n)

100 begin

101 sum <=1'b0;

102 led <=1'b1;

103 cnt <=1'b0;

104 end

105 else

106 case(sum)

107 s0:begin

108 if(cnt <hw -1)//高电平的时间

109 begin

110 led <=1'b0;

111 cnt <=cnt +1'b1;

112 end

113 else

114 begin

115 cnt <=1'b0;

116 sum <=s1;

117 end

118 end

119 s1:begin

120 if(cnt <lw -1)//低电平的时间

121 begin

122 led <=1'b1;

123 cnt <=cnt +1'b1;

124 end

125 else

126 begin

127 cnt <=1'b0;

128 sum <=s0;

129 end

130 end

131 default:sum <=s0;

132 endcase

133

134endmodule

测试模块

0`timescale1ns/1ps

1 modulehuxi_led_state_tb();

2 regclk;

3 regrst_n;

4

5 wireled;

6

7 parameterT =100_000;

8

9 initialbegin

10 clk =1'b1;

11 rst_n =1'b0;

12

13 #200.1rst_n =1'b1;

14

15

16 end

17

18 always#10clk =~clk;

19

20

21

22 huxi_led_state huxi_led_state_date(//例化设计

23 .clk(clk),

24 .led(led),

25 .rst_n(rst_n)

26 );

27 endmodule

仿真:

image.png


仿真中可以看到点亮led等高电平在不停的增高,然后会降低,通过验证我们的设计是正确的。


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

    关注

    1625

    文章

    21664

    浏览量

    601720
收藏 人收藏

    评论

    相关推荐

    PWM驱动LED实现呼吸效果

    C51 利用pwm 驱动LED 实现呼吸效果
    的头像 发表于 04-24 15:29 3691次阅读
    <b class='flag-5'>PWM</b>驱动LED实现<b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>效果

    FPGA呼吸

    基于FPGA呼吸一、目标1、占空比(pwm)的理解。2、计数器的应用。3、分频的应用。二、要求四个LED从暗逐渐变亮,然后从亮逐渐变暗
    发表于 10-26 21:01

    dsp pwm 呼吸

    请问有没有DSP PWM呼吸的原理讲解及例程,新手,谢谢!
    发表于 10-17 19:32

    怎么通过PWM来实现呼吸

    个人理解:如果能实现电压的变化就能实现呼吸了,如果能得到一个类似正弦电压的电压,那么就能实现这个呼吸。那么问题就来了,该怎么得到这个类似正弦电压的电压?STM32中的
    发表于 08-11 06:17

    PWM实现呼吸流程

    Conceit is the quicksand of success.  自负是成功的流沙。PWM实现呼吸PWM概述相关概念PWM设置流
    发表于 01-13 06:41

    PWM实现呼吸的应用

    stm32实现PWM最简单方法前言一、PWM概念二、PWM应用输出比较功能框图三、PWM呼吸
    发表于 01-21 13:18

    STC15单片机呼吸程序介绍

    STC15单片机呼吸程序主控STC15W4K61S4频率24Mhz该程序用了PCA/PWM作为LED的驱动,因为目标板(
    发表于 02-18 07:44

    使用PWM控制LED实现呼吸的效果

    本文主要讲解使用PWM控制LED,实现呼吸的效果。
    的头像 发表于 02-08 17:50 1.3w次阅读
    使用<b class='flag-5'>PWM</b>控制LED实现<b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>的效果

    【ZYNQ Ultrascale+ MPSOC FPGA教程】第十章 PWM呼吸实验

    本文主要讲解使用PWM控制LED,实现呼吸的效果。
    发表于 01-26 08:27 1次下载
    【ZYNQ Ultrascale+ MPSOC <b class='flag-5'>FPGA</b>教程】第十章 <b class='flag-5'>PWM</b><b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>实验

    STM32_PWM呼吸

    全面屏发展,因此很多手机取消了呼吸这一功能,取而代之的是息屏显示)2、什么是PWM?PWM:Pulse Width Modulation,脉冲宽度调制,是利用微处理器的数字输出来对模
    发表于 11-26 12:21 20次下载
    STM32_<b class='flag-5'>PWM</b><b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>

    STC15呼吸

    STC15单片机呼吸程序主控STC15W4K61S4频率24Mhz该程序用了PCA/PWM作为LED的驱动,因为目标板(
    发表于 12-23 19:26 32次下载
    STC<b class='flag-5'>15</b><b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>

    STM32 使用PWM实现呼吸

    STM32 PWM实现呼吸使用STM32F103ZET6 定时器4 CH2通道产生PWM波,在GPIOD,GPIO_PIN13引脚LED1产生呼吸
    发表于 12-24 19:41 55次下载
    STM32 使用<b class='flag-5'>PWM</b>实现<b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>

    通过STM32实现PWM呼吸的教程

    顾名思义,就是一个的亮度的变化,由亮变暗,从暗变亮,有一个渐变,规律的变化,像是人的呼吸,是呼吸,所以叫
    的头像 发表于 07-26 15:20 1.2w次阅读
    通过STM32实现<b class='flag-5'>PWM</b><b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>的教程

    基于FPGA呼吸设计

    呼吸主要是利用PWM的方式,在固定的频率下,通过调整占空比的方式来控制LED的亮度的变化,从而实现由暗渐亮再由亮渐暗的过程。
    的头像 发表于 09-27 11:43 2037次阅读
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>设计

    仿真测试:呼吸PWM

    呼吸的效果是逐渐由暗变亮再逐渐由亮变暗,FPGA的引脚电压只有“0”和“1”两个等级。
    的头像 发表于 10-10 14:52 1075次阅读
    仿真测试:<b class='flag-5'>呼吸</b><b class='flag-5'>灯</b><b class='flag-5'>PWM</b>