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

    文章

    112

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【沁恒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

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

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

    【幸狐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 ?879次阅读
    基于FPGA的<b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>设计(附源工程)

    PWMLED调光中的应用

    脉冲宽度调制(PWM)是一种常用的调光技术,它通过改变脉冲的宽度来控制LED的亮度。这种技术因其高效、节能和易于控制的特点,在
    的头像 发表于 11-28 16:33 ?3437次阅读

    4G模组PWM调光入门:打造个性化呼吸

    一直有朋友问我怎么打造个性化呼吸,本文我将以合宙低功耗4G模组经典型号——Air780E为例,展示PWM输出呼吸
    的头像 发表于 11-17 09:56 ?688次阅读
    4G模组<b class='flag-5'>PWM</b>调光入门:打造个性化<b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>

    呼吸的概念和实现原理

    呼吸在日常生活中经常见到,如电子时钟,小夜灯等等,本文我们介绍下通过PWM波来控制LED
    的头像 发表于 10-24 14:50 ?5618次阅读
    <b class='flag-5'>呼吸</b><b class='flag-5'>灯</b>的概念和<b class='flag-5'>实现</b>原理

    【RA-Eco-RA0E1-32PIN-V1.0开发板试用】pwm控制led呼吸

    我们继续熟悉e2studio的工具配置生成代码,本部分介绍,通过芯片的SAU单元部分,使能PWM功能,来输出可变的占空比,来控制LED的亮案。 首先我们查看原理图 我们使用的P112这个引脚
    发表于 09-17 21:29

    使用STM32CubeMX输出PWM,并制作呼吸效果

    概述 本篇文章主要介绍如何使用STM32CubeMX输出PWM,并制作呼吸效果。 硬件准备 首先需要准备一个开发板,这里我准备的是NUCLEO-F030R8的开发板: 选择芯片型号
    发表于 09-04 10:38

    【xG24 Matter开发套件试用体验】02: 点灯

    上一篇我们弄完了环境,这篇就可以开整啦,先来看看如何实现点灯吧。 硬件分析 可以看到板子上是有两个按键和两个LED的。 这里从原理图我们知道了LED的两个
    发表于 09-01 16:38

    如何实现pwm控制功能

    PWM(Pulse Width Modulation,脉冲宽度调制)是一种常见的电子控制技术,广泛应用于各种电子设备中,如电机控制LED调光、电源管理等。 一、
    的头像 发表于 08-08 15:08 ?1700次阅读