利用PWM脉宽调制实现呼吸灯
1.设计目标
完成一个呼吸灯,从亮到灭的时间为2秒,从灭到亮的时间为2秒,以此不断往复。
2.设计步骤
2.1设计分析
利用PWM(脉冲宽度调制)实现led灯亮度的变化,只需要改变占空比就可以实现,具体操作是将2秒分为1000份,每份即2/1000(2ms),也就是说一个pwm周期为2ms。在这样一个2ms周期内,改变占空比,且随着周期数变化,占空比也在变化,就可以显示出亮度变化的过程。
比如在第一个2s内,这个2秒内led灯的亮度是越来越暗的,所以具体操作为:把每个周期(2ms)再分成1000份,即一份为2us(这个2us称之为pwm的最小分辨率),在第一个2ms内高电平为1000个2us;在第二个2ms内低电平的个数为1个2us,高电平的个数为999个2us;第三个2ms内低电平的个数为2个2us,高电平的个数为998个2us;以此类推,最后一个2ms,低电平的个数为1000个2us。从而实现,每2ms亮度变化一次,一个2s内亮度变化了一千次,在肉眼看来,这个亮度的变化过程是非常平滑的。
反过来,亮度增加过程也是一样的,只要按2ms增大占空比即可实现。
2.2设计波形图

由图可知,一共需要三个计数器:T20us_count、T2us_count、T2ms_count。分别用于计算20ns,2us,2ms的个数。当T20us_count等于99时,代表计时2us(20ns*100)已到;当T2us_count等于999、T20us_count等于99时,代表2ms(2us*1000)已到;同理,当T2ms_count等于999、T2us_count等于999、T20us_count等于99时,代表2s(2ms*1000)已到。
观察波形图,在第一个2ms内,led_pwm都为高电平。在第二个2ms内,led_pwm在T2us_count为0时为低电平,大于等于0时为高电平。在第三个2ms,T2ms_count等于2,则在T2us_count等于0、1时,led_pwm为低电平,大于1时为高电平。因此可以得到一般规律,T2ms_count是用于计算2ms的个数,从0逐渐增长到999,代表第1个2ms到第1000个2ms,所以在任意一个2ms内,T2us_count小于T2ms_count,led_pwm为低电平,大于则为高电平。
第2个2s,亮度是慢慢增加的,过程与亮度减少是相逆的,T2us_count小于T2ms_count,led_pwm为高电平,大于则为低电平,从而实现占空比越来越大,从而实现亮度慢慢增加。
3.Verilog 代码
module pwm_led(
input wire Clk,
input wire Rst_n,
output wire led_pwm
); wire Rst;
assign Rst=~Rst_n; //定时2us,即pwm脉冲的最小分辨率
parameter T2us=8'd99;
reg [7:0]T20ns_count; //计算20ns的个数
always@(posedge Clk or posedge Rst)
if(Rst)
begin
T20ns_count<='d0;
end
else if(T20ns_count==T2us) //20ns*100=2us定时时间到
begin
T20ns_count<='d0;
end
else
T20ns_count<=T20ns_count+1'b1; //20us时间到,计数器加一 //定时2ms,即pwm的一个周期
parameter T2ms=12'd999;
reg [11:0]T2us_count;
always@(posedge Clk or posedge Rst)
if(Rst)
begin
T2us_count<='b0;
end
else if((T2us_count==T2ms)&&(T20ns_count==T2us)) //2us*1000=2ms定时时间到
begin
T2us_count<='b0;
end
else if(T20ns_count==T2us) //2us时间到,计数器加一
T2us_count<=T2us_count+1'b1; //定时2s
reg H_L_flag;//亮到灭,灭到亮的标志位
parameter T2s=12'd999;
reg [11:0]T2ms_count;
always@(posedge Clk or posedge Rst)
if(Rst)
begin
T2ms_count<='b0;
H_L_flag<='b0;
end
else if((T2ms_count==T2s)&&(T2us_count==T2ms)&&(T20ns_count==T2us)) //2ms*1000=2s定时时间到
begin
T2ms_count<='b0;
H_L_flag<=~H_L_flag;
end
else if((T2us_count==T2ms)&&(T20ns_count==T2us)) //2ms时间到,计数器加一
T2ms_count<=T2ms_count+1'b1; //PWM控制模块
assign led_pwm=(T2us_count<T2ms_count)?H_L_flag:~H_L_flag; endmodule
4.testbench代码
`timescale 1ns/1ns
`define clock_period 20
module pwm_led_tb; reg Clk;
reg Rst_n;
wire led_pwm_out;
pwm_led U0(
.Clk (Clk),
.Rst_n (Rst_n),
.led_pwm (led_pwm)
); initial Clk=1'b0;
always #(`clock_period/2) Clk=~Clk; initial
begin
Rst_n<=1'b0;
#(`clock_period*2);
Rst_n<=1'b1;
end endmodule
5.结语
以上程序经过ModelSim仿真,仿真通过后,也经过了上板验证,开始2s,led灯的亮度能够很平滑的下降,后一个2s,亮度能够慢慢提高,如此往复操作,实现4s为周期的呼吸灯。
利用PWM脉宽调制实现呼吸灯的更多相关文章
- PWM输出,呼吸灯
一.初始化GPIO 使用PB1,查芯片手册对应TIM3_CH4 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2 ...
- PWM(脉宽调制)——LED特效呼吸灯设计
简述PWM PWM--脉宽调制信号(Pulse Width Modulation),它利用微处理器的数字输出来实现,是对模拟电路控制的一种非常有效的技术,广泛应用于测量.通信.功率控制与变化等许多领域 ...
- [FPGA]Verilog利用PWM调制巧妙完成RGB三色彩虹呼吸灯(给简约的题目以美妙的解答)
概述 实现彩虹呼吸灯 题目就是这么简短,但这是目前我碰到的最有意思的一道题目,因为他有无数种解决方法,并且每一种都是那么高级或者巧妙,比如 可以利用3路不同初相的PWM调制信号驱动三颗RGB灯重叠呼吸 ...
- 浅浅的分析LED呼吸灯的实现和PWM的关系
前言 在本周,我们在python课上做了一个实验,用ARDUINO使小LED灯模仿出呼吸灯的效果,实验进行的很成功,但是机器当仅输出高/低电平的时候是怎么样才能做到渐亮渐暗(输出电压)的变化呢?在这里 ...
- 【iCore4 双核心板_ARM】例程八:定时器PWM实验——呼吸灯
实验原理: STM32的定时器有PWM功能,iCore4的蓝色LED连接在定时器的输出接口上, 可以通过定时器的PWM输出控制LED的亮度,从而实验呼吸灯的功能. 核心代码: int main(voi ...
- STM8S003F3通过PWM波实现三基色呼吸灯(转)
源: STM8S003F3通过PWM波实现三基色呼吸灯
- STM8S PWM 应用 呼吸灯
//主功能接受:使用MCU STM8S105C6 的PWM通道2 PC2 来做呼吸灯 已经验证OK,呵 //呵,这个PWM设置刚開始用还是有点麻烦,由于是自己摸索.花点时间.还是解决了 . //所用子 ...
- 12-ESP8266 SDK开发基础入门篇--PWM,呼吸灯
https://www.cnblogs.com/yangfengwu/p/11094085.html PWM其实没有什么,就是看着官方给的API,,,然后就是用呗 对了,其实对于RTOS SDK版本的 ...
- Arduino系列之pwm控制LED灯(呼吸灯)
下面我将写出最简单控制呼吸灯的方法 void setup() // { pinMode(12,OUTPUT); ...
随机推荐
- C# 9 新特性 —— 补充篇
C# 9 新特性 -- 补充篇 Intro 前面我们分别介绍了一些 C# 9 中的新特性,还有一些我觉得需要了解一下的新特性,写一篇作为补充. Top-Level Statements 在以往的代码里 ...
- Nebula Exchange 工具 Hive 数据导入的踩坑之旅
摘要:本文由社区用户 xrfinbj 贡献,主要介绍 Exchange 工具从 Hive 数仓导入数据到 Nebula Graph 的流程及相关的注意事项. 1 背景 公司内部有使用图数据库的场景,内 ...
- 科来网络通讯协议图2019版(OSI七层模型)
来源:http://www.colasoft.com.cn/download/protocols_map.php 自己把它转成了图片,好做查看:https://www.lanzous.com/ib5h ...
- 安装SVN和汉化包及基本使用
官网下载程序 和 下载汉化包. https://tortoisesvn.net/ 注意SVN汉化包版本需要和SVN版本一致,否则是无效的. 一.下载 1.进入官网,点击downloads 2.点击 ...
- Hive Query生命周期 —— 钩子(Hook)函数篇
无论你通过哪种方式连接Hive(如Hive Cli.HiveServer2),一个HQL语句都要经过Driver的解析和执行,主要涉及HQL解析.编译.优化器处理.执行器执行四个方面. 以Hive目前 ...
- mysql中的kill
show processlist;查看id, 然后 kill id ; 就行了.
- 【ORA】ORA-16629解决办法
数据库向保护模式报告不同的保护级别"警告消息. 首先查看主备库的保护模式和保护级别 select protection_mode,protection_level from v$databa ...
- ctfhub技能树—sql注入—过滤空格
手注 查询数据库 -1/**/union/**/select/**/database(),2 查询表名 -1/**/union/**/select/**/group_concat(table_name ...
- cobalt strike出现连接超时情况解决办法
服务器安装好teamserver服务后,进行连接,此时出现了连接超时的情况 检查方法: 一.检查端口是否正常开启 netstat -an | grep <设置的端口号>centos7可以用 ...
- 到底什么是哈希Hash?
有次面试被问到这个问题? 我说是经过运算的一串字符串,这个回答显然是让人不满意,连自己都不满意! 但是又对其很模糊,那么到底什么是Hash呢? 定义 Hash一般翻译为散列,还有音译为哈希,本文我们统 ...