PWM(脉宽调制)——LED特效呼吸灯设计

  简述PWM

  PWM——脉宽调制信号(Pulse Width Modulation),它利用微处理器的数字输出来实现,是对模拟电路控制的一种非常有效的技术,广泛应用于测量、通信、功率控制与变化等许多领域。

  LED特效呼吸灯原理

  采用pwm的方式,在固定的频率下,采用占空比的方式来实现LED亮度的变化。占空比为0,LED灯不亮,占空比为100%,则LED灯最亮。所以将占空比从0到100%,再从100%到0不断变化,就可以实现LED灯实现特效呼吸。

  设计思路、框图  

  变亮:当cnt2 < cnt3时为高电平,反之为低电平。

  变暗:当cnt2 < cnt3时为低电平,反之为高电平。

  先分频出延时为1us的延时电路,作为后面电路的驱动电路,然后是1ms延时和1s延时,会产生两个计数器,刚好是1000倍的关系。

  (1)在第一秒时,随着cnt3由0到999逐渐增大,每一个1ms的占空比通过cnt2去调节。当cnt2 < cnt3时为高电平,反之为低电平。 因此,随着cnt3的逐渐增大,高电平的时间逐渐增大,直到100%。

  (2)在第二秒时,随着cnt3由0到999逐渐增大,每一个1ms的占空比通过cnt2去调节。当cnt2 < cnt3时为低电平,反之为高电平。 因此,随着cnt3的逐渐增大,高电平的时间逐渐减小,直到0。

  设计图如上所示,完后就可以照图施工了,附上部分代码。

 1     //延时1us
 2     always @(posedge mclk or negedge rst_n)
 3     begin
 4         if(!rst_n)
 5             cnt1 <= 6'b0;
 6         else if(cnt1 < STOP_50 - 1'b1)
 7             cnt1 <= cnt1 + 1'b1;
 8         else 
 9             cnt1 <= 6'b0;
10     end
11     assign delay_1us = (cnt1 == STOP_50 - 1'b1)?1'b1:1'b0;
12     
13     //延时1ms
14     always @(posedge mclk or negedge rst_n)
15     begin
16         if(!rst_n)
17             cnt2 <= 10'b0;
18         else if(delay_1us)
19         begin
20             if(cnt2 < STOP_1000 - 1'b1)    
21                 cnt2 <= cnt2 + 1'b1;
22             else 
23                 cnt2 <= 10'b0;
24         end
25        end
26        assign delay_1ms = ((delay_1us == 1'b1) && (cnt2 == STOP_1000 - 1'b1))?1'b1:1'b0;
27        
28        //延时1s
29        always @(posedge mclk or negedge rst_n)
30     begin
31         if(!rst_n)
32             cnt3 <= 10'b0;
33         else if(delay_1ms)
34         begin
35              if(cnt3 < STOP_1000 - 1'b1)
36                 cnt3 <= cnt3 + 1'b1;
37             else 
38                 cnt3 <= 10'b0;
39          end
40         
41     end
42     assign delay_1s = ((delay_1ms == 1'b1) && (cnt3 == STOP_1000 - 1'b1))?1'b1:1'b0;
43     
44     //state change
45     always @(posedge mclk or negedge rst_n)
46     begin
47         if(!rst_n)
48             display_state <= 1'b0;
49         else if(delay_1s)//每一秒切换一次led灯显示状态
50             display_state <= ~display_state;
51         else 
52             display_state <= display_state;
53     end
54     
55     //pwm信号的产生
56     always @(posedge mclk or negedge rst_n)
57     begin
58         if(!rst_n)
59                 pwm <= 1'b0;
60         else 
61             case(display_state)
62                 1'b0: pwm <= (cnt2 < cnt3)?1'b1:1'b0;
63                 1'b1: pwm <= (cnt2 < cnt3)?1'b0:1'b1;
64                 default: pwm <= pwm;
65             endcase
66     end
67     
68     //位拼接使得输出八位led呼吸灯
69     assign led_out = {8{pwm}};
70     

  产生的pwm信号原来是一位的,所以最后要是需要控制多个LED的亮灭,使用一个位拼接运算即可,如最后一行代码所示。

转载请注明出处:NingHeChuan(宁河川)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯移动品质中心TMQ的专栏

当我们讨论流畅度的时候,我们究竟在说什么?

前言:那些年我们用过的显示性能指标 相对其他 Android 性能指标(如内存、CPU、功耗等)而言,显示性能(包括但不仅限于我们常说的“流畅度”)的概念本来...

3249
来自专栏linjinhe的专栏

LSM-Tree 的写放大写放大、读放大、空间放大RockDB 写放大简单分析参考文档

基于 LSM-Tree 的存储系统越来越常见了,如 RocksDB、LevelDB。LSM-Tree 能将离散的随机写请求都转换成批量的顺序写请求(WAL + ...

902
来自专栏瓜大三哥

奇数分频

奇数倍分频有多种实现方法,下面介绍常用的错位“异或”法的原理。如进行三分频,通过待分频时钟上升沿触发计数器进行模三计数,当计数器计数到邻近值进行两次翻转。比如在...

17410
来自专栏恰同学骚年

设计模式的征途—18.策略(Strategy)模式

俗话说条条大路通罗马,很多情况下实现某个目标地途径都不只一条。在软件开发中,也会时常遇到这样的情况,实现某一个功能有多条途径,每一条途径都对应一种算法。此时,可...

845
来自专栏美团技术团队

红黑树深入剖析及Java实现

红黑树是平衡二叉查找树的一种。为了深入理解红黑树,我们需要从二叉查找树开始讲起。 BST 二叉查找树(Binary Search Tree,简称BST)是一棵二...

2783
来自专栏知识分享

FPGA按一下按键,对应端口输出单个脉冲

对于FPGA的verilog语言,,,规定一个变量不能在多个always中被赋值.但是可以在多个alway块中做判断--结合状态机思想 module state...

2444
来自专栏葡萄城控件技术团队

应用系统中常见报表类型解析

根据报表的布局、数据源结构、打印方式和数据分析方式,可将应用系统中的报表分为以下类型: 清单报表 图表报表 分栏报表 分组报表 交叉报表 并排报表 ...

1955
来自专栏CSDN技术头条

MongoDB的设计模式策略

MongoDB是一项通用工具,但它也并非完美。针对某些MongoDB不适用的场合,有时可选用设计模式来加以应对。 MongoDB是一个NoSQL文档数据库,在大...

1866
来自专栏码匠的流水账

redis的bitset实战

361
来自专栏一“技”之长

iOS开发之蓝牙通讯 原

        蓝牙是设备近距离通信的一种方便手段,在iPhone引入蓝牙4.0后,设备之间的通讯变得更加简单。相关的蓝牙操作由专门的CoreBluetooth...

632

扫码关注云+社区