**这是本文档旧的修订版!**
脉冲宽度调制(PWM)实验
1. 实验内容
本实验的目的希望通过一个简单的实验来熟悉脉宽调制的原理,了解脉宽调制在LED显示上的应用。具体内容是采用脉宽调制来控制核心板上的LED的亮度,使板子上的8个LED灯依次渐亮和渐灭。
2. 实验原理
脉宽调制即Pulse width Modulation,简称PWM。脉宽调制是利用脉冲信号来实现模拟输出的一种方法,其在电力电子等方面有着广泛的应用。下面以脉宽调制在LED显示控制中的应用来介绍脉宽调制的原理。
如今在城市的各个繁华街区都可以看到各种尺寸的大屏幕,播放着商家的广告、新闻甚至体育直播,这些大屏幕就是LED屏。LED屏由成千上万个LED灯组成,一般情况下每个像素点由红绿蓝三个LED灯组成。这些红绿蓝三原色的LED灯发出不同亮度的光,由于每个像素点上这三个LED灯离得非常近,从远处看这三原色的光就自然在视网膜上进行了合成,组合成了几十万种颜色。成千上万个这样的像素点放在一起就组合成了大的LED屏。
LED屏的技术原理并不十分复杂,但是对实现工艺的要求非常高。由于一个LED屏上的LED灯的数量非常大,要具有非常好的显示效果,就要求这么多的LED灯的亮度要有非常好的一致性。如果亮度不均匀的化,整体的显示效果就非常差。另外就是控制系统,即要实现对大量LED灯的控制,又要保证控制效果,这对控制系统提出了很高的要求。那么LED的亮度是采用何种方式来控制呢?
简单而言,LED灯的亮度是采用下图所示的原理来控制,一般控制芯片采用的是FPGA、MCU或其它类型的芯片。当Dout的电平为低时,LED灯点亮;当Dout的电平为高时,LED熄灭。由此可见,Dout只能点亮或熄灭,不能调整亮度。但是如果将Dout变成一个脉冲信号,例如信号频率是1kHz,占空比是1/2。那么,LED就以很高的频率被点亮然后熄灭,而后又点亮又熄灭,由于人眼的视觉特性此时的LED就会看其来比点亮时按了一些。不断地调整LED的占空比,就会使得LED发出亮度不同的光,这就是脉宽调制。脉宽调制就是通过调整输出脉冲信号的占空比来实现对外围器件的控制。
图 8 1 PWM控制LED亮度示意图
本实验其实是LED大屏幕控制的一个简化实验。核心板上有8个LED灯,利用脉宽调制来控制LED0到LED7的亮度逐渐变化,同时每个LED灯的亮度也随时间的变化而逐渐变亮或变暗。
3. 程序设计
3.1 8.3.1.总体架构(PWM.v)
图8 2 脉宽调制程序的总体架构
整个程序的架构如图8 2所示,主要由两个模块PWMController和PWMbasic1~PWMbasic8组成:
1.PWMcontroller实现对8个LED灯亮度的控制,即决定每个LED灯的亮度应该是多少;
2.PWMbasic1~PWMbasic8每一个模块用于控制一个LED灯亮度的实现,也就是使得LED灯的亮度满足PWMcontroller提出的要求;
3.Counter是一个从0到PERIODWIDTH的一个计数器,PERIODWIDTH是脉宽调制信号的周期。
#### 3.2 PWMBasic模块(PWMBasic.v)
PWMBasic控制LED达到所要求的亮度,PWMBasic1~PWMBasic8是模块PWM_Basic的实例化。
PWM_Basic的输入输出接口如下:
input clk, reset; 时钟和复位信号。
input [15:0] pulsewidth; 脉宽调制信号脉冲宽度,以时钟周期为单位。
input [15:0] clktick; 这是counter计数器的计数值。
output reg pwmout; 控制LED的输出信号。
对LED灯的控制逻辑如下:
always @(posedge clk or negedge reset ) begin
if(!reset) begin
pwmout ⇐ 1;
end
else begin
if( clktick == 16'd0 )
pwmout ⇐ 1'b0; 注释1。
if( clktick == pulsewidth )
pwm_out ⇐ 1'b1; 注释2。
end
end
### 仿真结果
### 演示程序文件说明
### 演示程序使用