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
    +关注

    关注

    1601

    文章

    21296

    浏览量

    593070
收藏 人收藏

    评论

    相关推荐

    FPGA呼吸

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

    PWM实现呼吸效果

    的是#11口。呼吸源码如下:void setup (){pinMode(11,OUTPUT);}void loop(){//循环语句,控制PWM亮度的增加for (int a=0; a=0;a--
    发表于 07-20 15:03

    dsp pwm 呼吸

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

    基于stm32的PWM呼吸工程分享

    (NVIC_PriorityGroup_2);//中断优先级分组分两组LED_Init();TIM3_CH1_PWM_Init(500,72-1); //频率是2kHzTIM_SetCompare1(TIM3,i);delay_ms(10); } 全部资料51hei下载地址: 基于stm32的
    发表于 07-02 07:51

    请问pwm是怎么实现呼吸

    今天面试被问到pwm实现呼吸的效果,发现arm新一期的视频老师讲的定时器这部分就讲了定时器中断,这些基本概念什么的讲的很少,哪位大哥教教我pwm是干嘛用的???
    发表于 04-30 07:45

    PWM呼吸,手把手教你做

    PWM呼吸1 项目背景随着LED在照明领域的不断发展,其控制方式也越来越多样化,形成不同的视觉效果。相比较的只具备“开”“关”功能的传统LED照明,能够实现从0到100%光的亮度的调节的LED
    发表于 08-22 10:24

    怎么样去设计基于单片机与PWM呼吸

    51单片机(呼吸)C语言版基于单片机与PWM呼吸设计实训指导教师:班级:设计人姓名:设计日期:设计地点:完成时间:本设计是基于单片机的
    发表于 07-15 06:02

    怎么通过PWM来实现呼吸

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

    PWM输出制作呼吸

    PWM:脉冲宽度调制(Pulse width modulation)。PWM输出实验,制作呼吸
    发表于 08-18 07:10

    通过PWM调制模拟呼吸

    //功能:通过PWM调制模拟呼吸//名称:呼吸#include //调用含有51专用寄存器的头文件;c51(用于单片机开发的一种c语言)
    发表于 11-17 08:25

    STM32Cube如何配置PWM呼吸

    STM32Cube如何配置PWM呼吸
    发表于 11-23 07: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

    STM32呼吸的原理是什么

    前段时间学习stm32的时候就做过呼吸实验,浏览了一些博客后,做下总结呼吸原理其实是利用pwm
    发表于 02-21 07:26