实验十一 PWM

一、实验设计目标

(1)编写程序,使用FPGA产生脉冲调制(PWM)信号,且信号的周期和占空比可通过按键调节。

(2)进一步巩固之前学习到的矩阵键盘、按键消抖的功能。

二、实验设计思路

PWM信号可用于控制步进电机的工作,图1.1是一个PWM信号的示意图。这个脉冲的周期为Period,宽度为1的那段时间称为脉冲宽度,占空比定义为高电平信号占整个脉冲周期的百分比,即:

img (1.1)

img

1.1 一个PWM信号

要产生这样的PWM信号,基本思想就是使用一个计数器,当计数值Cnt1小于脉冲宽度时,让PWM信号为1;当Cnt1大于等于脉冲宽度时,让PWM信号为0;当Cnt1的值等于Period-1时,计数器复位,Cnt1变为0。循环往复便产生了一个连续的PWM信号。

该PWM信号发生器系统由占空比、周期调整模块,PWM信号产生模块和数码管显示模块组成,图1.2是该系统的示意图。

img

1.2 PWM信号发生器示意图

占空比、周期调整模块用于调整PWM信号的占空比Duty和周期Period,设置四个按键开关,分别控制占空比增加、占空比减少、周期增加和周期减少。输出信号Duty用于控制PWM波的占空比,取值范围为0~100;Count_P内存储了一个数值,用于表征周期Period。需要注意的是,当按下一次按键开关时,FPGA可能识别到多次操作或未识别到操作,所以,U1模块内增加“按键消抖模块”用于准确识别按键操作。

PWM信号产生模块用于产生PWM信号。Count_D内存储了一个数值,用于表征脉冲宽度,计算公式为

img (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的部分代码:

img

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信号数值

十进制 (img 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自行验证。

img

七、思考与拓展

(1)请仔细阅读代码,计算PWM信号的周期的可调范围,并与实际结果比对。

(2)请参照表1.1,列出当PWM信号的频率固定为100Hz时,Count_D可能出现的数值。