• 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(宁河川)

    个人微信订阅号:NingHeChuan

    如果你想及时收到个人撰写的博文推送,可以扫描左边二维码(或者长按识别二维码)关注个人微信订阅号

    知乎ID:NingHeChuan

    微博ID:NingHeChuan

    原文地址:http://www.cnblogs.com/ninghechuan/p/6291499.html 

  • 相关阅读:
    sqlite3中给表添加列
    webpack打包后服务端__dirname失效问题
    nodejs查看本机hosts文件域名对应ip
    vscode远程调试node服务端
    git 删除错误commit
    npm安装模块没有权限解决办法
    node gyp编译所需要的环境
    npm和yarn的淘宝镜像添加
    笨办法学Python 笔记
    梯度下降法优化线性回归算法参数
  • 原文地址:https://www.cnblogs.com/ninghechuan/p/6291499.html
Copyright © 2020-2023  润新知