下冰雹 · 2022年03月06日

【安路 EG4S20 版本】综合性实验设计与实现:实验11 PWM

实验设计目标

  1. 编写程序,使用FPGA产生脉冲调制(PWM)信号,且信号的周期和占空比可通过按键调节。
  2. 进一步巩固之前学习到的矩阵键盘、按键消抖的功能。

实验设计思路

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

image.png
image.png
图1.1 一个PWM信号
要产生这样的PWM信号,基本思想就是使用一个计数器,当计数值Cnt1小于脉冲宽度时,让PWM信号为1;当Cnt1大于等于脉冲宽度时,让PWM信号为0;当Cnt1的值等于Period-1时,计数器复位,Cnt1变为0。循环往复便产生了一个连续的PWM信号。
该PWM信号发生器系统由占空比、周期调整模块,PWM信号产生模块和数码管显示模块组成,图1.2是该系统的示意图。
image.png
图1.2 PWM信号发生器示意图
占空比、周期调整模块用于调整PWM信号的占空比Duty和周期Period,设置四个按键开关,分别控制占空比增加、占空比减少、周期增加和周期减少。输出信号Duty用于控制PWM波的占空比,取值范围为0~100;Count_P内存储了一个数值,用于表征周期Period。需要注意的是,当按下一次按键开关时,FPGA可能识别到多次操作或未识别到操作,所以,U1模块内增加“按键消抖模块”用于准确识别按键操作。
PWM信号产生模块用于产生PWM信号。Count_D内存储了一个数值,用于表征脉冲宽度,计算公式为
image.png
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’b1110;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的部分代码:
image.png
图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 = E10; IOSTANDARD = LVCMOS33; }
set_pin_assignment { row[1] } { LOCATION = C10; IOSTANDARD = LVCMOS33; }
set_pin_assignment { row[2] } { LOCATION = F9; IOSTANDARD = LVCMOS33; }
set_pin_assignment { row[3] } { LOCATION = D9; 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信号数值
image.png
表1.2 Count_P信号数值
image.png
图1.6是使用EPI观察到的初始状态时的PWM波形。当按下按键KEY0和KEY1后,波形、LED0的亮度、数码管上的数值都会有一定变化,请结合程序及表1.1、表1.2自行验证。
image.png

思考与拓展

  1. 请仔细阅读代码,计算PWM信号的周期的可调范围,并与实际结果比对。
  2. 请参照表1.1,列出当PWM信号的频率固定为100Hz时,Count_D可能出现的数值。

END

文章来源:https://www.yuque.com/yingmuketang/01/khuvg3

推荐内容

更多内容请关注走进FPGA专栏
推荐阅读
关注数
1615
内容数
27
本专栏将以【安路EG4S开发板】为例,从基础板卡信息及使用教程,基础实验设计与实现及综合性实验设计与实现带大家学习FPGA。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息