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

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

3天内不再提示

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

电子设计 来源:电子设计 作者:电子设计 2022-02-08 17:50 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

作者:ALINX

适用于板卡型号:

AXU2CGA/AXU2CGB/AXU3EG/AXU4EV-E/AXU4EV-P/AXU5EV-E/AXU5EV-P /AXU9EG/AXU15EG

实验Vivado工程为“pwm_led”。

本文主要讲解使用PWM控制LED,实现呼吸灯的效果。

1.实验原理

如下图所示,用一个N比特的计数器,最大值可以表示为2的N次方,最小值0,计数器以“period”为步进值累加,加到最大值后会溢出,进入下一个累加周期。当计数器值大于“duty”时,脉冲输出高,否则输出低,这样就可以完成图中红色线所示的脉冲占空比可调的脉冲输出,同时“period”可以调节脉冲频率,可以理解为计数器的步进值。

PWM脉宽调制示意图

不同的脉冲占空比的方波输出后加在LED上,LED灯就会显示不同的亮度,通过不断地调节方波的占空比,从而实现LED灯亮度的调节。

2. 实验设计

PWM模块设计非常简单,在上面的原理中已经讲到,这里不再说原理。

pIYBAGAJhDmAAbuBAAAymKPNjcc992.png

PWM模块(ax_pwm)端口

`timescale1ns/1ps

module ax_pwm

#(

parameter N =16//pwm bit width

input clk,

input rst,

input[N -1:0]period, //pwm step value

input[N -1:0]duty, //duty value

output pwm_out //pwm output

);

reg[N -1:0] period_r; //period register

reg[N -1:0] duty_r; //duty register

reg[N -1:0] period_cnt; //period counter

reg pwm_r;

assign pwm_out = pwm_r;

always@(posedge clk orposedge rst)

begin

if(rst==1)

begin

period_r duty_r end

else

begin

period_r duty_r end

end

//period counter, step is period value

always@(posedge clk orposedge rst)

begin

if(rst==1)

period_cnt else

period_cnt end

always@(posedge clk orposedge rst)

begin

if(rst==1)

begin

pwm_r end

else

begin

if(period_cnt 》= duty_r) //if period counter is bigger or equals to duty value, then set pwm value to high

pwm_r else

pwm_r end

end

那么如何实现呼吸灯的效果呢?我们知道呼吸灯效果是由暗不断的变亮,再由亮不断的变暗的过程,而亮暗效果是由占空比来调节的,因此我们主要来控制占空比,也就是控制duty的值。

在下面的测试代码中,通过设置period的值,设定PWM的频率为200Hz,PWM_PLUS状态即是增加duty值,如果增加到最大值,将pwm_flag置1,并开始将duty值减少,待减少到最小的值,则开始增加duty值,不断循环。其中PWM_GAP状态为调整间隔,时间为100us。

`timescale1ns/1ps

module pwm_test(

input clk, //25MHz

input rst_n, //low active

output led //high-off, low-on

);

localparam CLK_FREQ =25; //25MHz

localparam US_COUNT = CLK_FREQ ; //1 us counter

localparam MS_COUNT = CLK_FREQ*1000; //1 ms counter

localparam DUTY_STEP =32‘d100000; //duty step

localparam DUTY_MIN_VALUE =32’h6fffffff; //duty minimum value

localparam DUTY_MAX_VALUE =32‘hffffffff; //duty maximum value

localparam IDLE =0; //IDLE state

localparam PWM_PLUS =1;//PWM duty plus state

localparam PWM_MINUS =2;//PWM duty minus state

localparam PWM_GAP =3;//PWM duty adjustment gap

wire pwm_out; //pwm output

reg[31:0] period; //pwm step value

reg[31:0] duty; //duty value

reg pwm_flag ; //duty value plus and minus flag, 0: plus; 1: minus

reg[3:0] state;

reg[31:0] timer; //duty adjustment counter

assign led =~pwm_out ;//led low active

always@(posedge clk ornegedge rst_n)

begin

if(rst_n ==1’b0)

begin

period timer duty pwm_flag state end

else

case(state)

IDLE:

begin

period state duty end

PWM_PLUS :

begin

if(duty 》 DUTY_MAX_VALUE - DUTY_STEP) //if duty is bigger than DUTY MAX VALUE minus DUTY_STEP , begin to minus duty value

begin

pwm_flag duty end

else

begin

pwm_flag duty end

state end

PWM_MINUS :

begin

if(duty begin

pwm_flag duty end

else

begin

pwm_flag duty end

state end

PWM_GAP:

begin

if(timer 》= US_COUNT*100)//adjustment gap is 100us

begin

if(pwm_flag)

state else

state

timer end

else

begin

timer end

end

default:

begin

state end

endcase

end

//Instantiate pwm module

ax_pwm

#(

.N(32)

ax_pwm_m0(

.clk (clk),

.rst (~rst_n),

.period (period),

.duty (duty),

.pwm_out (pwm_out)

);

endmodule

3. 下载验证

生成bitstream,并下载bit文件,可以看到PL LED1灯产生呼吸灯效果。PWM是比较常用的模块,比如风扇转速控制,电机转速控制等等。

审核编辑:何安

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

    关注

    10

    文章

    116

    浏览量

    43829
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    FZH367 具有独立自动呼吸功能的LED(12×16)点阵驱动芯片 原厂技术支持

    概述 型号:FZH367FZH367是一种具有独立自动呼吸功能的LED(12×16)点阵驱动芯片。芯片通过I2C协议控制每个LED实现 3
    发表于 11-18 09:18

    原厂 FZH365 具有独立自动呼吸功能的LED(12×12)点阵驱动芯片

    是一种具有独立自动呼吸功能的LED(12×12)点阵驱动芯片。芯片通过I2C协议控制每个 LED实现 3 种自动
    发表于 11-17 09:38

    FZH16 固定花样 6 通道LED流星雨显示效果驱动IC

    是固定花样 6 通道LED流星雨显示效果驱动IC。本产品内部自带振荡器,PWM输出进行灰度 渐变。上电复位后,输出PWM波形,进行 6 通道的LE
    发表于 11-14 09:34

    LuatOS中PWM实现LED亮度调节与呼吸的实战教程

    PWMLED亮度调节和呼吸效果实现方面有着广泛应用。在LuatOS环境中,如何高效运用PWM
    的头像 发表于 11-11 19:05 7139次阅读
    LuatOS中<b class='flag-5'>PWM</b><b class='flag-5'>实现</b><b class='flag-5'>LED</b>亮度调节与<b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>的实战教程

    【沁恒CH585开发板免费试用体验】+PWM呼吸

    /下降沿/双边沿 4路26位PWM输出 8路8位PWM输出或前6路16位PWM输出 今天在上期的点灯例程上,修改出两路PWM输出,让开发板上的LED
    发表于 07-03 19:02

    【BPI-CanMV-K230D-Zero开发板体验】+控制与Python编程

    程序 在执行程序后,可得到图9至图11的显示效果。 图9 显示青色 图10 显示绿色 图11 显示紫色 当然我们还可以通过PWM来调节彩灯的亮度,以实现色彩的渐变效果
    发表于 06-27 17:33

    【RA-Eco-RA4M2开发板评测】点灯实现6种LED花式流水灯操作

    很高兴收到瑞萨电子提供的RA4M2开发板,这次帖子就专门用来说说专业点灯操作,实现各种花式的流水灯,可以十分方便地控制LED的各种状态,甚至多个LED组合
    发表于 04-28 21:28

    使用单片机驱动多组LED实现呼吸效果电路

    各位大佬,请教下,当前我需要使用单片机驱动控制20路并联LED,需要PWM驱动实现呼吸
    发表于 04-11 14:24

    LED6001 PWM调光单通道LED驱动器,具有集成增压控制器数据手册

    的亮度可以通过两个独立的引脚通过 PWM 调光和模拟调光(10:1 比率)来控制。通过与 LED 串串联并由专用引脚直接驱动的 MOSFET,可以获得增强的
    的头像 发表于 04-09 17:37 909次阅读
    <b class='flag-5'>LED</b>6001 <b class='flag-5'>PWM</b>调光单通道<b class='flag-5'>LED</b>驱动器,具有集成增压<b class='flag-5'>控制</b>器数据手册

    基于NB-IoT单控制器的智慧路灯应用案例及效果分析

    基于NB-IoT单控制器的智慧路灯应用案例及效果分析
    的头像 发表于 04-07 15:16 800次阅读
    基于NB-IoT单<b class='flag-5'>灯</b><b class='flag-5'>控制</b>器的智慧路灯应用案例及<b class='flag-5'>效果</b>分析

    【幸狐Omni3576边缘计算套件试用体验】PWM呼吸

    【幸狐Omni3576边缘计算套件试用体验】PWM呼吸 本文介绍了幸狐Omni3576边缘计算套件实现 GPIO 输出电平的控制
    发表于 04-03 04:59

    【瑞萨RA2L1入门学习】01. PWM 呼吸

    占空比的调节就是实现呼吸效果的关键。通过控制PWM信号的占空比,可以
    发表于 03-07 11:43

    【瑞萨RA2L1入门学习】01、PWM呼吸

    低功耗的桌面摆件项目。 这次评测报告内容是PWM呼吸。 2 硬件部分 2.1 LED 这块RA2L1开发板载有2颗LED
    发表于 01-25 13:34

    基于FPGA的呼吸设计(附源工程)

    ,起到一个通知提醒的作用。 设计原理 关于呼吸设计实现的理论主要是PWM有关知识。PWM(Pluse Width Modulation)脉
    的头像 发表于 01-16 10:09 1380次阅读
    基于FPGA的<b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>设计(附源工程)