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是比较常用的模块,比如风扇转速控制,电机转速控制等等。

审核编辑:何安

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

    关注

    9

    文章

    107

    浏览量

    42472
收藏 人收藏

    评论

    相关推荐

    如何用pwm编程实现呼吸效果

    我用的是stm8l152c6 下面是我的pwm 信号 求解答 如何实现呼吸 #include\"iostm8l152c6.h\" #include\"
    发表于 04-16 06:52

    求购两个LED呼吸控制

    某宝某多买了几个控制器发现LED的亮度变化在低占空比的时候,变化很明显,而在高占空比的时候反而变化很小,导致呼吸表现呼吸不均匀的现象,我想
    发表于 01-31 21:54

    【先楫HPM5361EVK开发板试用体验】PWM输出测试-呼吸

    PWM、中心对齐互补PWM。 为了更直观感受PWM的变化,外接了一个led,亮度不断变化类似于呼吸
    发表于 12-03 19:35

    【LuckFox Pico开发板免费试用】PWM控制呼吸教程

    1 LuckFox Pico引脚分布 LuckFox Pico的引脚分布如下图,本次实验只关注PWM引脚。选择PWM0_M1来控制LED
    发表于 11-29 21:43

    如何通过PWM做一个呼吸

    接下来我们就来试一试,通过PWM让一个LED实现不同亮度的变化,也就是我们常见的呼吸灯了。 硬件接线 还是用这个LED灯,一端连接电阻,再到
    的头像 发表于 11-27 11:40 332次阅读
    如何通过<b class='flag-5'>PWM</b>做一个<b class='flag-5'>呼吸</b>灯

    如何利用定时器实现呼吸

    没有硬件PWM,只能软件模拟,但是发现都是在闪烁,没有做出呼吸效果。 使用软件延时的方法可以做出来,但是运行效率太慢了。 我想用定时器中断实现呼吸
    发表于 10-25 06:14

    单片机PWM控制LED输出呼吸效果,这个PWM的频率应该设置成多少呢 ?

    单片机PWM控制LED输出呼吸效果,这个PWM
    发表于 10-15 11:47

    52_2_PWM呼吸 实操案例 _45分 [000800000097] - 第9节

    PWM呼吸
    充八万
    发布于 :2023年08月19日 16:42:10

    52_2_PWM呼吸 实操案例 _45分 [000800000097] - 第6节

    PWM呼吸
    充八万
    发布于 :2023年08月19日 16:39:40

    52_1_PWM呼吸 PPT讲解 _37分 [000800000165] - 第6节

    PWM呼吸
    充八万
    发布于 :2023年08月19日 16:33:48

    【FireBeetle 2 ESP32-S3开发板体验】PWM呼吸

    PWM 能在所有可输出引脚上实现实现步聚如下: 1、从machine 中引入Pin、PWM。 2、设置当前频率 3、设置点空比来设置LED
    发表于 07-30 09:04

    STM32呼吸灯的PWM原理与代码实现

    PWM全称是Pulse Width Modulation,通过控制高频信号的占空比,眼睛当成低通滤波器,可以控制亮暗。再循环更改pwm的阈值,就弄出了
    发表于 06-28 17:10 1150次阅读

    【CW32饭盒派开发板试用体验】使用PWM实现呼吸

    的GTIM定时器通道,所以只有LED2能够实现呼吸效果。 3. 编程实现 编程
    发表于 05-25 23:00

    基于定时器的PWM呼吸灯实例

    本文将介绍通过定时器的输出比较功能实现脉宽可调的输出波形来控制LED等,实现呼吸灯的效果
    的头像 发表于 05-01 09:03 672次阅读
    基于定时器的<b class='flag-5'>PWM</b><b class='flag-5'>呼吸</b>灯实例

    PWM驱动LED实现呼吸效果

    C51 利用pwm 驱动LED 实现呼吸效果
    的头像 发表于 04-24 15:29 3119次阅读
    <b class='flag-5'>PWM</b>驱动<b class='flag-5'>LED</b><b class='flag-5'>实现</b><b class='flag-5'>呼吸</b>灯<b class='flag-5'>效果</b>