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的亮灭,使用一个位拼接运算即可,如最后一行代码所示。

  

  

时间: 2024-08-02 02:49:08

PWM(脉宽调制)——LED特效呼吸灯设计的相关文章

基于PWM的呼吸灯设计(Verilog版)

module Breath_Led(clk,rst,led); input clk,rst; output reg led; reg[19:0] count; reg[19:0] duty_cycle; always @(posedge clk) begin if(!rst) begin led<=1'b0; count<=1'b0; end else begin if(count<20'd999_999) begin count<=count+1'b1; if(count<

nrf51822之PWM呼吸灯程序

额外链接: 1.JLink-SWD烧写之引脚定义:http://www.openedv.com/posts/list/1747.htm 2.百度文库c语言之PWMhttp://wenku.baidu.com/link?url=2QeCZppvhH81D4OYAyi9eEDP8Sk0p0OQhPKPfo0OXWiWZ5PxBvSMXtP8ejxZw-sxrSOGwrFj3K3q2ewwkM_vAQlk-QMyWnD1eVuLNaANxZm 3.菜农M0助学板PWM呼吸灯小练(寄存器操作方式):ht

STM8S PWM 应用 呼吸灯

//主功能接受:使用MCU STM8S105C6 的PWM通道2 PC2 来做呼吸灯 已经验证OK,呵 //呵,这个PWM设置刚开始用还是有点麻烦,因为是自己摸索,花点时间,还是攻克了 . //所用子函数都是调用STM8S的库函数stm8s_tim.c 中的. 宏定义: //分频宏 //计数器的时钟频率(fCK_CNT)等于fCK_PSC/( PSCR[15:0]+1). #define TIM1_PRESCALER_1 ((u16)0x00) #define TIM1_PRESCALER_2

好玩的WPF第二弹:电子表字体显示时间+多彩呼吸灯特效button

我们先来看看Quartz MS字体动态显示系统时间的效果,难度相较于上一篇也要简单很多. 首先是定义一个TextBlock例如以下. <Grid> <TextBlock Name="tBlockTime" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="68" Foreground="Green"/>

用Arduino剖析PWM脉宽调制

PWM(Pulse Width Modulation)简介 PWM,也就是脉冲宽度调制,用于将一段信号编码为脉冲信号,也就是方波信号.多用于在数字电路中驱动负载随时间变化的电子元件,如LED,电机等. 在单片机中,我们常用PWM来驱动LED的暗亮程度,电机的转速等. 我们知道,在数字电路中,电压信号是离散的: 不是 0(0V)  就是 1(5V或者3.3V), 那么如何输出介于 0v 和  5V之间的某个电压值呢? 我们先来举个实际的例子,一看就懂,胜过千言万语. 如下图,要让让数字信号模拟出

STM32之呼吸灯实验

首先,我想引用一下在一片博文里 看到 的一段话,写的很详细, 首先来说,你要使用PWM模式你得先选择用那个定时器来输出PWM吧!除了TIM6.TIM7这两个普通的定时器无法输出PWM外,其余的定时器都可以输出PWM,每个通用定时器可以输出4路PWM,高级定时器TIM1.TIM8每个可输出7路PWM,这里为了方便起见,我们选择与实验相同的TIM3的通道2来说明.选好定时器及通道后,下一步就是要使能定时器的时钟,根据需要看看是否需要重映射IO,然后就是配置输出PWM的IO及定时器,到这里原子的视频及

(原创)用Verilog实现一个参数化的呼吸灯(Verilog,CPLD/FPGA)

1.Abstract     观察到一个有趣的现象,每当把Apple笔记本合上的时候,那个白色的呼吸灯就会反复地由暗渐明,然后又由明渐暗,乍一看就像Apple笔记本在打盹休息一样,十分可爱!于是突发奇想,要不用Verilog也写一个吧,资源也不需要太多,一个LED灯就可以了.为了使用方便,可以把它做成参数化的,可以根据时常进行参数调节:深睡.浅睡跟清醒的时候呼吸频率似乎是不一样的-     下面就来分析和实践一下. 2.Content   2.1 理论分析     根据上述描述的现象,仔细分析一

STM32呼吸灯

使用STM32开发板和mbed平台实现的一个呼吸灯.材料,LED灯,电阻,STM32开发板. 先上一张效果图. 背景: 我们之前设置GPIO口使用了DigitalOut,数字信号输出.只能是GPIO口为0或1两个值.在LED上体现的即是灭和亮.然而现实世界大量的信号都是模拟信号,如温度.声音.加速度等.百度上:“模拟信号是指信息参数在给定范围内表现为连续的信号. 或在一段连续的时间间隔内,其代表信息的特征量可以在任意瞬间呈现为任意数值的信号.” 理论知识(可以跳过): 模拟信号即可以简单理解为,

NE555-DIY呼吸灯的电路图

NE555设计的呼吸灯电路图 再提供一个LM358设计的呼吸灯电路图.