实验十一 PWM
一、实验设计目标
(1)编写程序,使用FPGA产生脉冲调制(PWM)信号,且信号的周期和占空比可通过按键调节。
(2)进一步巩固之前学习到的矩阵键盘、按键消抖的功能。
二、实验设计思路
PWM信号可用于控制步进电机的工作,图1.1是一个PWM信号的示意图。这个脉冲的周期为Period,宽度为1的那段时间称为脉冲宽度,占空比定义为高电平信号占整个脉冲周期的百分比,即:
(1.1)
图1.1 一个PWM信号
要产生这样的PWM信号,基本思想就是使用一个计数器,当计数值Cnt1小于脉冲宽度时,让PWM信号为1;当Cnt1大于等于脉冲宽度时,让PWM信号为0;当Cnt1的值等于Period-1时,计数器复位,Cnt1变为0。循环往复便产生了一个连续的PWM信号。
该PWM信号发生器系统由占空比、周期调整模块,PWM信号产生模块和数码管显示模块组成,图1.2是该系统的示意图。
图1.2 PWM信号发生器示意图
占空比、周期调整模块用于调整PWM信号的占空比Duty和周期Period,设置四个按键开关,分别控制占空比增加、占空比减少、周期增加和周期减少。输出信号Duty用于控制PWM波的占空比,取值范围为0~100;Count_P内存储了一个数值,用于表征周期Period。需要注意的是,当按下一次按键开关时,FPGA可能识别到多次操作或未识别到操作,所以,U1模块内增加“按键消抖模块”用于准确识别按键操作。
PWM信号产生模块用于产生PWM信号。Count_D内存储了一个数值,用于表征脉冲宽度,计算公式为
(1.2)
U2模块内有一个计数器Cnt1,按照前文提到的基本思想,比较Cnt1和Count_P、Count_D的数值,即可产生所需的PWM波。
数码管显示模块用于显示当前PWM信号的Duty、Count_P和Count_D,便于观察验证实验结果。因数码管个数限制,增加开关信号Count_D_Display与Count_P_Display用于切换数码管界面,这与第二篇的实验八中的思想相同。
三、功能模块图与输入输出引脚说明
该工程较包含顶层模块pwm与底层模块Duty_Period_Adjust_module、PWM_Generate_module、Digitron_NumDisplay_module,整个工程的模块功能图参考图1.2即可。下面介绍一下顶层模块各主要引脚的功能:
(1)CLK:50MHz的时钟信号输入。
(2)RSTn:复位输入信号。当RSTn为低电平时,PWM信号的周期、占空比分别置为5ms和50%。
(3)col,row:键盘输入信号。因为只用了KEY0和KEY1两个按键,因此我们将row设置为4’b0111;KEY0对应col[0],控制PWM的周期,每按一下,相应参数变化一次。KEY[1]对应col[1],控制PWM占空比,每按一下,相应参数变化一次。
(4)Count_D_Display、Count_P_Display:拨动开关输入信号,高电平有效,分别控制数码管显示Count_D和Count_P。
(5)Digitron_Out、DigitronCS_Out:分别为七段数码管的显示输出信号和扫描驱动信号。
(6)PWM_LED_Out:U2模块产生的PWM信号,输出到LED灯,共有一位总线。因为PWM信号的平均直流值和占空比是成比例的,可以通过LED灯的亮度变化来定性观察PWM信号的占空比的变化情况。
(7)PWM_EPI_Out:与(6)相同,也是所产生的PWM信号,输送到硬木课堂口袋实验平台中,定量观察PWM信号。
四、程序设计
(1)图1.3是截取自底层模块PWM_Generate_module的部分代码:
图1.3 PWM_Generate_module核心代码
15:计算Count_D,见公式(1.2)。
29-32:使用一个简易的计数器Cnt1,通过比较Cnt1与Count_D的值,决定信号PWM_Out电平的高或低。
五、FPGA管脚配置
以下是Anlogic FPGA的IO Constraint,CLK、DigitronCS_Out、Digitron_Out、col和row信号已经多次用到,不再赘述;复位输入信号RSTn与开发板上的SWO相连;Count_D_Display、Count_P_Display 输入信号分别与开发板上的SW1、SW2相连;输出信号PWM_LED_Out送到LED7;PWM_EPI_Out送到开发板上侧的I/O通道“T4”中,通过“T4”口送往硬木口袋实验平台。
set_pin_assignment { Count_D_Display } { LOCATION = A10; IOSTANDARD = LVCMOS33; }
set_pin_assignment { RSTn } { LOCATION = A9; IOSTANDARD = LVCMOS33; }
set_pin_assignment { Count_P_Display } { LOCATION = B10; IOSTANDARD = LVCMOS33; }
set_pin_assignment { CLK } { LOCATION = R7; IOSTANDARD = LVCMOS33; }
set_pin_assignment { DigitronCS_Out[0] } { LOCATION = C9; IOSTANDARD = LVCMOS33; }
set_pin_assignment { DigitronCS_Out[1] } { LOCATION = B6; IOSTANDARD = LVCMOS33; }
set_pin_assignment { DigitronCS_Out[2] } { LOCATION = A5; IOSTANDARD = LVCMOS33; }
set_pin_assignment { DigitronCS_Out[3] } { LOCATION = A3; IOSTANDARD = LVCMOS33; }
set_pin_assignment { Digitron_Out[0] } { LOCATION = A4; IOSTANDARD = LVCMOS33; }
set_pin_assignment { Digitron_Out[1] } { LOCATION = A6; IOSTANDARD = LVCMOS33; }
set_pin_assignment { Digitron_Out[2] } { LOCATION = B8; IOSTANDARD = LVCMOS33; }
set_pin_assignment { Digitron_Out[3] } { LOCATION = E8; IOSTANDARD = LVCMOS33; }
set_pin_assignment { Digitron_Out[4] } { LOCATION = A7; IOSTANDARD = LVCMOS33; }
set_pin_assignment { Digitron_Out[5] } { LOCATION = B5; IOSTANDARD = LVCMOS33; }
set_pin_assignment { Digitron_Out[6] } { LOCATION = A8; IOSTANDARD = LVCMOS33; }
set_pin_assignment { Digitron_Out[7] } { LOCATION = C8; IOSTANDARD = LVCMOS33; }
set_pin_assignment { col[0] } { LOCATION = E11; IOSTANDARD = LVCMOS33; }
set_pin_assignment { col[1] } { LOCATION = D11; IOSTANDARD = LVCMOS33; }
set_pin_assignment { col[2] } { LOCATION = C11; IOSTANDARD = LVCMOS33; }
set_pin_assignment { col[3] } { LOCATION = F10; IOSTANDARD = LVCMOS33; }
set_pin_assignment { row[0] } { LOCATION = D9; IOSTANDARD = LVCMOS33; }
set_pin_assignment { row[1] } { LOCATION = F9; IOSTANDARD = LVCMOS33; }
set_pin_assignment { row[2] } { LOCATION = C10; IOSTANDARD = LVCMOS33; }
set_pin_assignment { row[3] } { LOCATION = E10; IOSTANDARD = LVCMOS33; }
set_pin_assignment { PWM_LED_Out } { LOCATION = F16; IOSTANDARD = LVCMOS33; }
set_pin_assignment { PWM_EPI_Out } { LOCATION = T4; IOSTANDARD = LVCMOS33; }
六、实验结果
本实验使用硬木课堂口袋实验平台观察PWM波形,使用LED7定性观察PWM波的占空比变化情况,使用数码管显示Duty、Count_D和Count_P的值。表1.1和表1.2分别是在调节PWM波时信号Duty和信号Count_P可能出现的数值,十六进制数值即数码管上所显示的数值,表1.2还列出了相应的PWM波的频率。
表1.1 Duty信号数值
十进制数值 | 00 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100 |
---|---|---|---|---|---|---|---|---|---|---|---|
十六进制数值 | 00 | 0A | 14 | 1E | 28 | 32 | 3C | 46 | 50 | 5A | 64 |
表1.2 Count_P信号数值
十进制 () | 50 | 100 | 150 | 200 | 250 | 300 | 350 | 400 | 450 | 500 |
---|---|---|---|---|---|---|---|---|---|---|
十六进制 | C350 | 186A0 | 249F0 | 30D40 | 3D090 | 493E0 | 55730 | 61A80 | 6DDD0 | 7A120 |
PWM的 频率(Hz) | 1000 | 500 | 333 | 250 | 200 | 167 | 143 | 125 | 111 | 100 |
图1.6是使用EPI观察到的初始状态时的PWM波形。当按下按键KEY0和KEY1后,波形、LED0的亮度、数码管上的数值都会有一定变化,请结合程序及表1.1、表1.2自行验证。
七、思考与拓展
(1)请仔细阅读代码,计算PWM信号的周期的可调范围,并与实际结果比对。
(2)请参照表1.1,列出当PWM信号的频率固定为100Hz时,Count_D可能出现的数值。