FPGA项目三:PWM呼吸灯

文章目录

    • 第一节 项目背景
    • 第二节 设计目标
    • 第三节 设计实现
      • 3.1顶层设计
      • 3.2 信 设计
      • 3.3 信 定义
    • 第四节 综合和上板
      • 4.1 新建工程
      • 4.2 综合
      • 4.3 配置管脚
      • 4.4 再次综合
      • 4.5 连接开发板
      • 4.6 上板

第一节 项目背景

随着照明领域需求的不断扩大,LED 技术也在迅速发展,其控制方式也越来越多样化,可以产生多样的视觉效果。相较于只具备“开”“关”功能的传统 LED 照明,能够实现从 0 到 100%灯光亮度调节的 LED 灯在家装灯饰、舞美灯光等领域的需求更为突出。这种灯的灯光亮度可以通过调节控制由高到低的逐渐变化,像是人在呼吸一般,因而被称作呼吸灯。呼吸分为两个过程,一个是“呼”,一个是“吸”。而所谓的“呼吸灯”就是将人的呼吸频率通过光的强弱表现出来,其被广泛应用于手机上,并成为各大品牌手机的卖点之一。当手机里有未处理的通知,比如未接来电或未查收的短信时,呼吸灯就会像呼吸一样有节奏的由暗到亮不断变化,从而起到通知提醒的作用。
呼吸灯的设计方法有很多,例如采用 555 定时器的设计方案,电路利用电容充放电的原理较为简单,也可以用单片机产生脉冲宽度调制来驱动 LED。本案例中采用 PWM 驱动 LED 灯的方法来进行设计。

脉冲宽度调制技术(Pulse Width Modelation,PWM)是利用微处理器/FPGA 的数字输出对模拟电路进行控制的一种有效技术,其广泛应用于测量、通信、功率控制与变换等众多领域。PWM 数字信 从处理器到被控系统都采用数字形式,无需进行数模转换。航模中的控制信 大多是 PWM 信 ,比如 FUTABA、JR 等舵机的控制都采用 PWM 方式,发射机给接收机输送脉冲后接收机会控制舵机进行旋转。举个例子,假定基础脉宽是 100ms,当发射机的脉宽增大(如增加到 150ms)时接收机控制舵机进行正向旋转;反之发射机的脉宽减小(如减小到 50ms)时,接收机控制舵机进行逆向旋转。
PWM 是一种对模拟信 电平进行数字编码的方法。通过使用高分辨率计数器对方波的占空比进行调制,从而对一个具体模拟信 的电平进行编码。由于在给定的任何时刻,满幅值的直流供电只存在有(ON)和无(OFF)两种状态,因此 PWM 信 仍然是数字信 。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。直流供电被加到负载上的时候为“通”,负载供电被断开的时候为“断”。只要有足够的带宽,任何模拟值都可以使用 PWM 进行编码。

通俗来说,PWM 是连续的、具有一定比例占空比的脉冲信 ,可以通过控制占空比来对其进行改变。简单来说,可以认为 PWM 就是一种方波,如图 3.3-1 所示。

总结:
PWM就是在合适的信 频率下,通过一个周期里改变占空比的方式来改变输出的有效电压
PWM频率越大,相应越快,了解 PWM 之后。


下面来学习一下 PWM 实现呼吸灯的原理:
信 的高低电平变化可以控制 LED 灯的明灭状态。当输出信 为低电平时 LED 灯亮,反之,当输出信 为高电平时 LED 灯灭。当输出电平持续为低,则灯一直保持亮的状态;而当输出电平持续为高,则灯一直保持灭的状态。如果输出信 50%为低电平,50%为高电平,在 PWM 适宜的周期下LED 灯光会变暗,这也说明占空比对 LED 灯的明暗程度会产生影响。
另一个影响 LED 亮度的因素则是 PWM 波形的周期。试想一下,如果 PWM 的周期是 2 秒,占空比为 50%,此时观察到 LED 的状态是暗 1 秒、亮 1 秒,而不是半亮的状态。只有缩短 PWM 的期,才能看到 LED 半亮的状态。根据经验可知,如果要达到改变亮度的效果PWM 的周期以 10 毫秒为宜。
综上所述,通过控制高低电平的时间,即占空比(高电平占周期的百分比),以及控制 PWM 的周期,就可以改变灯的明暗程度。


如何实现PWM信 输出/strong>
那么如果要实现PWM信 输出如何输出呢/p>

1)可以直接通过芯片内部模块输出PWM信 ,前提是这个I/O口要有集成模块,只需要简单几步操作即可,这种自带有PWM输出的功能模块在程序设计更简便,同时数据更精确。如下图,一般的IC口都会标明这个是否是PWM口;

本设计的上板效果如图 3.3-3 所示

综上所述,本工程一共需要三个信 ,时钟 clk,复位 rst_n 和输出信 led。将 module 的名称
定义为 ,在顶层信 代码中需要将与外部相连接的输入/输出信 列出,从而实现
信 与管脚的连接,其具体代码如下:

3.2 信 设计

在进行信 设计之前先按照至简设计法的思路来进行架构设计。回顾一下设计需求:通电后,LED 灯显示接近于灭,在之后的 10 秒内,每隔 2 秒钟亮度变化一次,逐渐变亮;在下一个 10 秒内,依旧是每隔 2 秒亮度变化一次,但是会逐渐变暗。可以将其总结为:本设计以 20 秒为一次循环,每隔 2 秒变化一次,前 10 秒亮度逐渐增大,后 10 秒亮度逐渐减小。

前文中详细的介绍过 PWM 的原理,可以得知通过控制 PWM 的占空比可以实现 LED 灯的亮度控制。PWM 占空比越大(高电平时间越长,低电平时间越低),灯的亮度越暗。可以这样理解:FPGA 控制 led 信 的输出,可以输出为 PWM 波形并通过调整占比来达到改变 LED 灯亮度的效果。

根据设计目标可以得出设计方案:每 20 秒一次循环,每隔 2 秒改变一次 led 的占空比,前 10 秒占空比逐渐变小,LED 灯逐渐变亮,后 10 秒占空比逐渐变大,LED 灯也随之逐渐变暗。由于设计目标只对亮度改变进行要求,并没有说明具体的占空比是多少,因此本书自行设定占空比。可以在上板时根据观察到的视觉效果,调整占空比的大小。本书设定占空比如下:

第 1 个 2 秒内,占空比为 95%;
第 2 个 2 秒内,占空比为 85%;
第 3 个 2 秒内,占空比为 70%;
第 4 个 2 秒内,占空比为 50%;
第 5 个 2 秒内,占空比为 20%;
第 6 个 2 秒内,占空比为 20%;
第 7 个 2 秒内,占空比为 50%;
第 8 个 2 秒内,占空比为70%;
第 9 个 2 秒内,占空比为 85%;
第 10 个 2 秒内,占空比为 95%。
之后以此为规律循环往复。

经过多次的实验和测试后发现:PWM 每 10 毫秒刷新一次,LED 灯显示的亮度效果是最好的。因此根据经验值,本书将 PWM 波周期设为 10 毫秒。建议初学者按照书中提供经验值来进行操作,在完全掌握了设计原理可以独立完成设计后,可以再进行不同波型以及不同占空比的尝试。

根据前文分析,得到 led 信 的变化波形图如下图所示。


为什么Led的变零条件是br> 在这个地方add_cnt0始终等于1 。写不写是无所谓的,但是写了绝对不会错。
看前面内容:
计数器规则 3:只有在加 1 条件有效时,才能表示计数器的计数值。
假定加 1 条件为 add_cnt,计数器当前值为 cnt,则
add_cnt&&cntx-1 表示计数器计数到 x 个。
cnt
x-1 不能表示计数器计数到 x 个。
计数器是从 0 开始计数的,因此计数器的默认值即初始值是 0。那么当计数器的值为 0 时要如何区分这是开始计数的第 1 个值,还是并未计数的默认值呢br> 这种情况下可以通过加 1 条件来进行区分。当加 1 条件无效时,计数器值为 0 表示未开始计数,此时的 0 为默认值;当加 1 条件有效时,计数器值为 0 表示计的第 1 个数。同理,当 cntx-1,不能表示计数到 x;只有当 cntx-1 且加 1 条件有效时,才表示计数到 x。
因此,当 add_cnt&&cnt5-1 时,表示计数到 5 个。而当 add_cnt0 &&cnt==5-1 时,不能表示计数到 5 个

3.3 信 定义

下来将 module 补充完整,首先来定义信 类型。对类型 reg 和 wire 的判断总会有多余的联想,比如认为 reg 是寄存器,wire 是线;或者认为 reg 类型会综合成寄存器,wire 类型不会综合成寄存器。

但是这些其实和 reg 型还是 wire 型都并无关系。实际上对信 类型的判断不需要做任何的联想,只
要记住一个规则“用 always 实现的是 reg 型,其他都是 wire 型”就可以了。

cnt0 是用 always 产生的信 ,因此类型为 reg。cnt0 计数的最大值为 500_000,需要用 19 根线表示,即位宽是 19 位。关于信 位宽的获取,至简设计法在此分享一个非常实用的技巧:打开计算器,点击“查看”,选择“程序员”模式,在“十进制”下将信 值输入,就会获得对应的信 位宽。如下图所示,将 cnt0 的值 500_000 输入,可以看出其位宽为 19。

FPGA项目三:PWM呼吸灯
完整代码如下

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年2月7日
下一篇 2022年2月7日

相关推荐