这一篇在干嘛?

让电机转起来容易,让它按你想要的速度转才是控制问题。这一篇用 FPGA 生成 PWM 波对直流电机做调速、换向,再用红外光电对码盘测转速,构成一套「发波—驱动—测量」的小型测控系统。原文篇幅不长,本文把模拟 PWM 与数字 PWM 的对比、测频原理展开讲清。

实验目标与原理

实验任务原文:

学习直流电机 PWM 的 FPGA 控制。掌握 PWM 控制的工作原理,对直流电机进行闭环速度控制、旋转方向控制、变速控制。

从模拟 PWM 到数字 PWM

先看教科书式的模拟 PWM 是怎么产生的,原文描述:

一般的脉宽调制 PWM 信号是通过模拟比较器产生的,比较器的一端接给定的参考电压,另一端接周期性线性增加的锯齿波电压。当锯齿波电压小于参考电压时输出低电平,当锯齿波电压大于参考电压时输出高电平。改变参考电压就可以改变 PWM 波形中高电平的宽度。若用单片机产生 PWM 信号波形,需要通过 D/A 转换器产生锯齿波电压和设置参考电压,通过外接模拟比较器输出 PWM 波形,因此外围电路比较复杂。

再看 FPGA 的做法:

FPGA 中的数字 PWM 控制与一般的模拟 PWM 控制不同。用 FPGA 产生 PWM 波形,只需 FPGA 内部资源就可以实现。用数字比较器代替模拟比较器,其一端接设定值计数器输出,另一端接线性递增计数器输出。当线性计数器的计数值小于设定值时输出低电平,当计数值大于设定值时输出高电平。与模拟控制相比,省去了外接的 D/A 转换器和模拟比较器,FPGA 外部连线很少、电路更加简单、便于控制。脉宽调制式细分驱动电路的关键是脉宽调制,转速的波动随着 PWM 脉宽细分数的增大而减小。

两个方案结构完全同构,只是「载波」不同:

对比项模拟 PWMFPGA 数字 PWM
锯齿波D/A + 模拟电路产生线性递增计数器
比较器模拟比较器数字比较器(大于/小于判断)
调节量参考电压设定值(寄存器里的数)
外围电路D/A、运放、比较器无,纯内部逻辑

把 PWM 读成「占空比旋钮」

直流电机的平均电压正比于 PWM 占空比,占空比高转速快、占空比低转速慢。所以「调速」在硬件上就是「改设定值」——一个 8 位设定值从 0 到 255,占空比从 0% 到 100% 线性可调。计数器计数值小于设定值输出低、大于设定值输出高,高电平的宽度自然随设定值变化,这就是数字 PWM 的全部。

顶层结构:三大组成部分


图 1 直流电机驱动控制电路顶层设计

图 1 是直流电机控制电路顶层设计,主要由以下 3 个大部分组成:

(1)PWM 脉宽调制信号发生模块 SQU1

此模块是 FPGA 中的 PWM 脉宽调制信号产生电路。它的输出接电机转向控制电路模块,此模块输出的两个端口接电机。通过控制 SL 端(键 K1),可以改变电机转向。SQU1 的输入端之一来自模块 CNT8B。这是一个 8 位计数器,输出的数据相当于锯齿波信号,此信号的频率就是输出 PWM 波的频率,它由来自锁相环的 C0 的频率决定,频率选择 4096Hz。SQU1 模块的另一端来自键控的 8 位数据,其中低 4 位 CIN[3..0] 设定为恒定 1111,高 4 位由计数器 CNT4B 产生,计数器的时钟来自键。于是可以通过手动按键控制电机的转速。如果键有抖动,在键输入进计数器前加了一个消抖动模块 ERZP,由于键抖动的脉冲频率比较低,故 ERZP 的工作时钟选择 4096Hz。

拆解这段话里的设计要点:

  • PWM 频率由「锯齿波计数器」决定:8 位计数器 CNT8B 计满 256 回零,输出就是数字锯齿波;它的时钟 C0 = 4096Hz,所以 PWM 频率 = 4096 / 256 = 16Hz。设定值是「高 4 位来自 CNT4B + 低 4 位恒 1111」拼成的 8 位数,按键一次、CNT4B 加一,占空比就跨一级。
  • 换向不在 PWM 里:SQU1 的输出先经过转向控制电路,再由两个端口 DM1、DM2 接电机——改变 H 桥(或驱动电路)两端的电流方向即可换向,SL 端就是那个换向开关。
  • 按键必须消抖:按键抖动会让 CNT4B 一次跳好几级,转速就乱了。ERZP 消抖模块工作在 4096Hz 低速时钟,正好匹配毫秒级的抖动时间窗。

(2)电机转速测试系统

电机转速的测定很重要,一方面可以直观了解电机的转动情况,更重要的是,可以据此构成电机的闭环控制,即可以设定电机的某一转速后,确保负载变动时仍旧能保持不变转速和恒定输出功率。本项实验是通过红外光电测定转速的。每转一圈光电管发出一个负脉冲,由图 1 的左上的 CNIN 口进入。由于此类方法测转速,会附带大量毛刺脉冲,所以在 CNIN 的信号后必须接入消毛刺模块 ERZP,其工作时钟频率是 5MHz。ERZP 的输出信号进入一个 2 位十进制显示的频率计。图中频率测量功能模块 clk_div 是测频时序控制电路;模块 CNT10D 是双十位计数器,模块 LOCK8 是 8 位寄存器,由 74374 担任。两位十进制频率数显示在系统实验电路模式上数码管 LEDA、LEDB。

测速链路是「传感器 → 滤波 → 计数 → 锁存 → 显示」五段:

  • 红外对管对着电机轴上的码盘,每转一圈送出一个负脉冲(CNIN 口输入);
  • 光电信号毛刺多,先用工作在 5MHz 的 ERZP 消毛刺——注意它和按键消抖用的 ERZP 是同一模块、不同时钟,一个 4096Hz 一个 5MHz,体现了模块复用的价值;
  • 频率计在固定闸门时间内对脉冲计数,CNT10D 计数、LOCK8(74374)在闸门结束时锁存结果,数码管 LEDA/LEDB 显示两位十进制转速值。

(3)工作时钟发生器

这主要由分频电路 clk_div 担任,或直接由主系统直接提供。其输入频率是 50MHz;输出两个频率:C0=4096Hz,C1=8Hz。

50MHz 进来,4096Hz 给 PWM 与按键消抖,8Hz 给测频时序控制——一个模块喂饱全系统的时钟需求。

时钟分配一览

整个系统只有一个 50MHz 晶振输入,各路工作频率由分频电路 clk_div(或锁相环)统一派生,用途如下:

时钟频率供给模块用途
输入时钟50MHzclk_div分频源
C04096HzCNT8B、ERZP(按键路径)PWM 锯齿波时钟 / 按键消抖
C18Hzclk_div 测频时序控制测频节拍(计数、锁存、清零)
ERZP 测速路径时钟5MHzERZP(CNIN 路径)光电脉冲消毛刺

看懂这张表,再看顶层框图就不会迷路:频率决定职责——4096Hz 的慢时钟负责「人的手速能跟上的事」(PWM 基频、消抖),5MHz 的快时钟负责「跟得上电信号的事」(毛刺滤除),8Hz 负责「秒级的测量节拍」。

换向是怎么回事

PWM 只解决「多快」,不解决「往哪边转」。直流电机的转向取决于电枢电流方向,而电流方向由驱动电路(H 桥或双向驱动器)决定:SQU1 的 PWM 输出先送入转向控制电路模块,该模块的两个端口 DM1、DM2 接电机两端,SL 端(key1)切换的就是这两端谁高谁低——两端电位互换,电流反向,电机倒转。这就是为什么顶层图里 PWM 模块和电机之间永远隔着一级「转向控制」:调速和换向是两个解耦的自由度,一个控占空比、一个控极性,互不干扰。

测频法算一算:数码管上的数到底代表什么

频率计的原理是「固定闸门时间 + 计数脉冲个数」:闸门开 1 秒,数进来的脉冲有多少个,频率就是多少 Hz。本系统里 CNIN 每转一圈来一个脉冲,所以 1 秒闸门内计到的数 = 电机每秒转数 = 转速(转/秒)。数码管 LEDA、LEDB 显示两位十进制数,也就是每秒转数在 0~99 之间。C1 = 8Hz 的低频时钟正是给测频时序控制电路用的——用低频时钟产生规整的计数、锁存、清零节拍,让计数结果在两次显示之间保持稳定,数码管不会闪烁跳变。

毛刺不清除,读数会虚高

光电对管输出的脉冲边沿带着大量机械与电气毛刺,若直接送入计数器,一次抖动可能被数成十几个脉冲,转速读数严重虚高。所以 CNIN 之后必须先进工作在 5MHz 的 ERZP 消毛刺模块,再进频率计——「传感器信号先滤波、后计数」是测控系统的通用纪律。

硬件准备与引脚锁定


图 2 直流步进电机模块
图 3 直流步进电机模块 40 芯连接图

原文引脚锁定:

DM1、DM2 电机正反转分别锁定:引脚 N14,P15(34、36 引脚位)。 CLK 锁定核心板 50MHz 晶振。 Sl 转向接 key1 A2 脚 K8 速度控制接 key2 C5 脚

整理成速查表:

信号方向引脚说明
CLK输入核心板 50MHz 晶振系统时钟
SL输入A2(key1)电机转向控制
K8输入C5(key2)速度控制(CNT4B 计数时钟)
DM1输出N14(34 引脚位)电机驱动端口 1
DM2输出P15(36 引脚位)电机驱动端口 2
CNIN输入红外光电输入转速脉冲(经 ERZP 消毛刺)

上板流程与现象

按原文完成工程建立、引脚锁定与下载后,上板验证按三条线走:

  1. 换向:按 key1 切换 SL 端电平,观察电机 DM1/DM2 电流方向反转,电机倒转。
  2. 调速:反复按 key2,每按一次 CNT4B 加一,PWM 设定值高 4 位抬高一档,占空比增大,可以听到、看到转速台阶式上升。
  3. 测速:数码管 LEDA、LEDB 显示两位十进制频率值,即红外对管测得的每秒转数,转速应随占空比提高而增大;用手轻捏电机轴加载负载,观察读数变化,体会开环控制的局限。

验证时建议按「先低速后高速」的顺序逐档按键,每档停留几秒、记下数码管读数,你会得到一组占空比-转速对应关系;再捏住电机轴增加负载,读数下降——这就是开环系统的软肋,也是引出闭环控制的最好现场演示。

现象与总结

这个实验的完整度在于它同时覆盖了控制的「输出侧」和「输入侧」:

  • 输出侧(PWM 调速):数字锯齿波 + 数字比较器 = 无外围的 PWM 发生器。转速波动随脉宽细分数增大而减小,这意味着提高 PWM 频率(本例受 4096Hz 时钟与 8 位计数器限制为 16Hz)能让转速更平稳,代价是开关损耗上升——频率与损耗的权衡是所有功率电子设计的永恒话题。
  • 输入侧(光电测速):一圈一个脉冲,闸门时间内计数即得转速。「传感器信号永远先滤波再计数」这条纪律请记牢:光电管输出里的毛刺如果直接进计数器,读数会虚高好几倍。
  • 闭环的雏形:本实验把设定、执行、测量三个环节都摆上了桌面,只是还没有把测量值反馈回设定端。把频率计读数与目标转速比较、用误差去自动调整 PWM 设定值,就是一个完整的 PID(或最简单的比例)调速器——这正是下一阶段可以动手扩展的方向。

对比实验开始前的两张表:模拟方案要 D/A、比较器、运放一堆外围;FPGA 方案只要内部两个计数器和一个比较器。这不是简单的省元件,而是把「控制」从模拟量的物理世界搬进了数字寄存器的世界——可复现、可参数化、可一键改设计。

自测