摘要
本文面向伺服驱动、FOC 电机控制、丝杆平台、皮带传动机构和高动态运动平台等场景,系统说明如何利用 Bode 图和 Nyquist 图识别机械共振、结构谐振和编码器噪声问题,并给出基于频域分析的优化思路,包括陷波器设计、低通滤波、速度观测优化、机械刚度提升和环路重整定。文中重点回答以下问题:共振和噪声在 Bode 图上表现为什么;在 Nyquist 图上如何理解"稳定但危险"的状态;测试时输入、输出、注入点和观测量分别是什么;如何根据测试结果确定是否需要增加陷波器;陷波器参数如何选取;优化后如何验证效果。
1. 引言
在电机控制系统中,很多"电流环、速度环、位置环参数看起来没问题,但设备就是会叫、会振、会抖、会发热"的问题,本质上并不是单纯的 PI 参数问题,而是以下几类现象在作怪:
- 机械共振:例如联轴器、丝杆、皮带、悬臂负载带来的弹性振动;
- 结构谐振:例如安装底座、支架、平台、外壳的柔性模态;
- 编码器噪声:例如量化误差、插值误差、抖动、布线干扰、速度差分放大噪声;
- 控制与机械耦合:例如滤波器延时、低刚度结构、外环过高带宽共同导致稳定裕度下降。
这些问题在时域波形中通常表现为:
- 阶跃响应有振铃;
- 定点时有细小抖动;
- 特定速度段有啸叫;
- 位置保持时电流抖动增大;
- 某些频率附近噪声明显放大。
但如果只看时域,很容易看到现象,却看不清原因。因此工程上更有效的方法是:
- 用 Bode 图识别幅值峰值、相位突降和噪声抬升;
- 用 Nyquist 图判断系统距离稳定边界还有多远;
- 再根据峰值频率和裕度结果决定是否加入陷波器、调整增益、降低带宽或优化机械结构。
本文的目标,就是把"共振怎么测、噪声怎么看、陷波器怎么加、优化后怎么验"讲清楚。

1.1 本章小结
本章说明了本文的应用背景:很多振动和噪声问题仅靠时域难以定位,需要用 Bode 图和 Nyquist 图从频域与复平面角度做联合分析。后文将围绕测试对象、特征识别、陷波器设计和实际案例展开。
2. 测试对象与问题定义
在伺服系统中,机械共振、结构谐振和编码器噪声通常主要体现在速度环与位置环,但根源不一定都在控制器本身。
2.1 典型问题链路

这个链路中,问题可能出现在:
- 机械侧:柔性联轴器、长丝杆、皮带、悬臂、安装底座;
- 传感侧:编码器噪声、速度微分噪声、接地干扰;
- 控制侧:带宽过高、相位裕度不足、滤波延时过大。
2.2 本文测试关注点
本文重点关注三类频域特征:
- 机械共振峰:Bode 图上表现为某频率附近幅值显著抬升;
- 编码器噪声抬升区:高频段幅值曲线不再正常下降,甚至出现"噪声地板抬高";
- 结构谐振引起的相位突降:相位在某段频率快速下降,Nyquist 轨迹逼近临界点。
2.3 测试输入与输出定义
在实际测试时,常见定义如下:
-
速度环共振测试
- 输入:速度给定 ω∗\omega^*ω∗ 上叠加扫频扰动;
- 输出:反馈速度 ω\omegaω;
- 目标:识别机械共振峰、速度估计噪声和相位裕度变化。
-
位置环结构谐振测试
- 输入:位置给定 θ∗\theta^*θ∗ 上叠加小幅扫频扰动;
- 输出:反馈位置 θ\thetaθ 或位置误差 eθe_\thetaeθ;
- 目标:识别柔性结构峰值与稳定边界。
-
编码器噪声测试
- 输入:可在位置或速度指令上叠加极小幅扫频,也可在静止状态下采集反馈噪声频谱;
- 输出:位置反馈、速度反馈、速度估计值;
- 目标:判断噪声主要出现在编码器本体、速度微分还是控制闭环放大环节。
2.4 本章小结
本章把问题定义清楚了:我们不是单纯测"带宽",而是借助频域响应去定位机械共振、结构谐振和编码器噪声,并明确了测试时常用的输入输出定义。
3. 机械共振、编码器噪声和结构谐振在 Bode 图上的表现
3.1 机械共振的典型表现
机械共振在 Bode 图上最典型的表现是:
- 在某个频率附近出现幅值峰值;
- 峰值前后相位快速下滑;
- 峰值越高,通常表示阻尼越差。
例如,当速度闭环在 140 Hz 附近存在柔性联轴器模态时,可能出现:
- 幅值从 -2 dB 突然抬升到 +4 dB;
- 相位在 100 Hz ~ 180 Hz 内快速多下降 40° ~ 80°;
- 阶跃响应中伴随 120 Hz ~ 160 Hz 的振铃。
3.2 结构谐振的典型表现
结构谐振更常见于位置环,表现为:
- 闭环带宽附近或更高一点的频段出现窄峰;
- 峰值频率与平台、支架、丝杆、负载模态有关;
- 在位置保持或微小往返运动中会放大为尖锐啸叫或细碎振动。
3.3 编码器噪声的典型表现
编码器噪声通常不是"窄峰",而更像:
- 高频段幅值不正常抬高;
- 低速时速度反馈抖动加重;
- 使用差分求速度时,噪声频谱被高频放大。
在 Bode 图上常见现象是:
- 高频段曲线不再平滑下降;
- 幅值曲线出现起伏毛刺;
- 相位数据在高频段明显发散;
- 重复测试时高频结果不一致。
3.4 三类问题的对比识别
| 问题类型 | 幅值曲线特征 | 相位曲线特征 | 时域表现 |
|---|---|---|---|
| 机械共振 | 局部明显峰值 | 峰值附近快速下滑 | 振铃、啸叫、某频段抖动 |
| 结构谐振 | 窄峰或多峰 | 多模态相位快速下降 | 平台抖动、壳体共鸣 |
| 编码器噪声 | 高频段抬高、曲线毛刺 | 高频相位发散 | 静止抖动、速度估计毛刺 |
3.5 本章小结
本章给出了三类问题在 Bode 图上的辨识方法:共振更像"峰值",噪声更像"高频抬高与毛刺",结构谐振则常表现为多模态窄峰和相位急剧下降。
4. Nyquist 图如何判断风险与稳定边界
4.1 为什么看 Nyquist 图
Bode 图善于读峰值、带宽和相位,但 Nyquist 图更适合回答一个更本质的问题:
这个共振峰会不会把系统推到失稳边界附近?
4.2 Nyquist 判据的基本形式
闭环特征方程为:
1+L(s)=0(4-1) 1+L(s)=0 \tag{4-1} 1+L(s)=0(4-1)
Nyquist 判据指出:
Z=N+P(4-2) Z=N+P \tag{4-2} Z=N+P(4-2)
其中:
- ZZZ 是闭环右半平面零点数;
- PPP 是开环右半平面极点数;
- NNN 是 Nyquist 曲线对 (−1,0)(-1,0)(−1,0) 的包围数。
在大多数伺服系统设计中,目标是 P=0P=0P=0,因此只要 Nyquist 轨迹危险地逼近或错误包围 (−1,0)(-1,0)(−1,0),系统就会变得脆弱甚至失稳。
4.3 共振与 Nyquist 轨迹的关系
当共振峰存在时,通常会带来:
- 幅值上升;
- 相位额外下降;
- Nyquist 轨迹在某个频率附近向 (−1,0)(-1,0)(−1,0) 方向凸出。
这时即便系统还没有失稳,也可能已经进入:
- 轻微碰撞就振;
- 负载一换就振;
- 温度变化后就变差;
- 增益略升就失稳。
4.4 Nyquist 图示意流程

4.5 本章小结
本章说明了 Nyquist 图的价值:它不是替代 Bode 图,而是帮助判断"峰值是否已经危险地接近稳定边界"。对共振问题,Bode 用来定位,Nyquist 用来判风险。
5. 测试方法与流程
5.1 速度环机械共振测试流程

5.2 位置环结构谐振测试流程

5.3 编码器噪声测试流程

5.4 扫频参数建议
| 测试对象 | 工作点示例 | 扰动幅值 | 频率范围 | 采样建议 |
|---|---|---|---|---|
| 速度环机械共振 | 300 rpm | 10~20 rpm | 1~300 Hz | 每点 10~12 周期 |
| 位置环结构谐振 | 0° 附近 | 0.1°~0.5° | 0.5~100 Hz | 每点 8~10 周期 |
| 编码器噪声 | 静止/10 rpm | 极小或不注入 | 频谱观察到 500 Hz 以上 | 长时间采样 FFT |
5.5 本章小结
本章给出的是落地测试流程。工程上最常见做法是:速度环找机械峰,位置环找结构峰,编码器噪声则通过静止/低速采样和高频响应异常联合判断。
6. 怎样解决与优化共振问题
共振问题的优化思路通常不是单一手段,而是多种方法组合。
6.1 调低带宽或回退增益
这是最直接但有性能代价的方法。
适用于:
- 峰值就在交越频率附近;
- PM 已明显不足;
- 设备以稳定优先而不是动态优先。
优点:
- 实施简单;
- 风险小;
- 易快速验证。
缺点:
- 响应变慢;
- 无法根治结构问题;
- 可能影响跟随性能。
6.2 加入陷波器 Notch Filter
陷波器是工程上最常用的共振抑制方法之一,用于在某个共振频率附近做局部衰减。
常见连续域二阶陷波器形式:
Gnotch(s)=s2+2ζzωns+ωn2s2+2ζpωns+ωn2(6-1) G_{notch}(s)=\frac{s^2+2\zeta_z\omega_n s+\omega_n^2}{s^2+2\zeta_p\omega_n s+\omega_n^2} \tag{6-1} Gnotch(s)=s2+2ζpωns+ωn2s2+2ζzωns+ωn2(6-1)
其中:
- ωn=2πfn\omega_n=2\pi f_nωn=2πfn 为目标陷波中心频率;
- ζz\zeta_zζz 决定零点阻尼;
- ζp\zeta_pζp 决定极点阻尼;
- 通常要求 ζz<ζp\zeta_z < \zeta_pζz<ζp,这样在 fnf_nfn 附近形成衰减槽。
6.3 低通滤波与观测滤波优化
除了陷波器,低通滤波器也是非常常见的处理方法,特别适合以下情况:
- 高频噪声整体抬高,而不是单一窄峰;
- 编码器速度估计存在明显高频毛刺;
- 共振频率远高于控制带宽,只需要削弱高频激发。
常见做法包括:
- 对速度反馈增加一阶或二阶低通;
- 对位置微分得到的速度估计增加平滑窗口;
- 对电流前馈或转矩指令增加适度滚降;
- 降低噪声耦合通道的高频增益。
但低通的缺点也很明显:
- 会引入相位滞后;
- 可能降低相位裕度;
- 若截止频率设得过低,会直接拖慢环路动态。
因此,低通滤波更适合处理"高频噪声宽带抬升",而不适合替代对明确窄峰的陷波处理。
6.4 Lead/Lag 校正与相位补偿
当问题不只是峰值过高,而是交越频率附近相位余量不足时,可以考虑加入超前校正(Lead)或适度的滞后-超前组合补偿。
典型用途:
- 在不明显降低带宽的前提下补一点相位;
- 在峰值附近改善开环形状;
- 配合陷波器一起使用,抵消部分额外相位损失。
优点:
- 可以直接改善 PM;
- 对提升 Nyquist 安全距离很有帮助;
- 适合"系统不一定有很强共振,但裕度偏紧"的场景。
缺点:
- 参数整定比单纯降增益更复杂;
- 如果共振峰很高,仅靠 lead 往往不够;
- 需要反复看 Bode 和 Nyquist 才能确认效果。
6.5 输入整形与指令预滤波
有些振动问题,并不是闭环本身一直不稳,而是指令激发了机械模态。这时除了改闭环,还可以从命令端做优化。
常见方法包括:
- 指令预滤波;
- S 曲线加减速;
- 输入整形(Input Shaping);
- 对特定频率做前馈抑制。
这类方法尤其适合:
- 机械模态频率明确;
- 问题主要发生在启停、换向、快速定位;
- 不希望大改闭环控制器本体。
优点:
- 不一定增加闭环相位损失;
- 对"激励型振动"常非常有效;
- 可以与现有控制器并行叠加。
缺点:
- 对外部扰动抑制有限;
- 更适合轨迹激发问题,不适合纯反馈噪声问题;
- 参数依赖模态识别准确度。
6.6 双惯量建模、观测器与主动阻尼
对于电机---联轴器---负载这类明显双惯量或多惯量系统,单纯加陷波器只是表层处理。更深入的方法包括:
- 建立双惯量模型;
- 引入扭振观测器;
- 加主动阻尼(Active Damping);
- 使用负载侧速度或扭矩估计补偿。
这类方法适合:
- 共振峰随工况变化明显;
- 单一陷波器效果有限;
- 设备是高性能伺服或高端运动平台。
优点:
- 更接近系统真实物理结构;
- 对抑制扭振更有针对性;
- 在复杂机械系统中往往比堆叠滤波器更稳健。
缺点:
- 建模和整定复杂;
- 对参数准确性要求高;
- 工程实现门槛高于普通 PI + notch。
6.7 提高结构刚度或机械阻尼
如果问题根源在机械结构,则应考虑:
- 提高安装底座刚度;
- 更换更高刚度联轴器;
- 缩短悬臂长度;
- 改善丝杆支撑;
- 增加阻尼材料或结构支撑。
6.8 更换传动方案或传感方案
如果系统长期受限于结构模态或测量品质,工程上还可以从硬件方案层面优化:
- 联轴器改为更高刚度型号;
- 丝杆改短或更换支撑方式;
- 皮带传动改为更高刚度传动结构;
- 编码器从低分辨率增量式升级为高分辨率绝对式;
- 必要时增加负载侧传感器。
这种方法虽然成本较高,但优点也最直接:
- 从源头降低共振和噪声;
- 降低控制补偿复杂度;
- 往往能带来最稳健的长期效果。
6.9 优化编码器与速度观测
若问题根源是编码器噪声,则可考虑:
- 优化编码器布线和接地;
- 提升编码器分辨率或插值质量;
- 调整速度估计算法;
- 使用合适的低通滤波,但避免过大延时;
- 降低差分噪声放大。
6.10 多种优化方法对比表
| 方法 | 更适合解决的问题 | 优点 | 缺点 | 是否需重点复查 PM/GM |
|---|---|---|---|---|
| 陷波器 | 明确窄带共振峰 | 定点压峰效果好 | 会引入局部相位影响 | 是 |
| 低通滤波 | 高频宽带噪声、编码器毛刺 | 实现简单 | 延时增加明显 | 是 |
| Lead/Lag 补偿 | 裕度偏紧、交越区相位不足 | 可提升相位裕度 | 参数整定更复杂 | 是 |
| 输入整形/预滤波 | 启停换向激发模态 | 不一定损伤闭环裕度 | 对外扰抑制有限 | 需要 |
| 主动阻尼/观测器 | 双惯量扭振、多模态复杂系统 | 针对性强 | 建模门槛高 | 是 |
| 机械加固 | 结构柔性、安装刚度不足 | 根治能力强 | 成本高、改动大 | 需要复测 |
| 传感器升级 | 编码器噪声、测量品质差 | 从源头改善噪声 | 成本较高 | 需要复测 |
6.11 优化顺序建议
推荐顺序:
- 先确认是不是测试假象;
- 再区分机械峰还是编码器噪声;
- 若是机械峰,优先确认是否可接受回退带宽;
- 若需要保留动态性能,再设计陷波器;
- 若峰值太多或漂移太大,优先改机械结构。
进一步细化时,可按下面顺序执行:
- 先区分是窄峰还是宽带噪声;
- 窄峰优先考虑陷波、主动阻尼或机械加固;
- 宽带噪声优先考虑观测优化和低通滤波;
- 若主要在启停时被激发,优先考虑输入整形;
- 若 Nyquist 轨迹整体过近,需考虑 lead 补偿或整体降带宽;
- 若问题随工况变化太大,优先改机械方案,而不是堆补偿器。
6.12 优化方法选型流程图
下面给出一个适合现场使用的"按现象选方法"流程图。实际使用时,建议先用 Bode 图判断问题形态,再结合 Nyquist、PM/GM 和阶跃波形做二次确认。

6.13 现场选型简化口诀
为了方便现场快速判断,也可以直接按下面口诀理解:
- 看到窄峰先想 notch;
- 看到高频噪声地板抬高先想低通和观测;
- 看到交越区相位掉得快先想 lead 或降带宽;
- 只在启停换向时振先想输入整形;
- 多峰、漂移大、换负载就变,优先怀疑机械结构。
6.14 本章小结
本章补充说明了:处理共振和噪声并不只有陷波器一种办法。除了 notch,还可以用低通滤波、lead 补偿、输入整形、主动阻尼、机械加固和传感器升级等多种手段。工程上应根据"窄峰 / 宽带噪声 / 裕度不足 / 结构柔性"不同问题类型选择组合方案。
7. 陷波器设计方法
7.1 什么时候该加陷波器
通常满足以下条件之一时,可以考虑加陷波器:
- Bode 图存在明显窄峰;
- 峰值频率比较稳定;
- 峰值正好卡在速度环或位置环的有效工作频段;
- 回退带宽会明显损害性能;
- Nyquist 轨迹因该峰值明显逼近 (−1,0)(-1,0)(−1,0)。
7.2 陷波中心频率如何选
中心频率一般选在峰值频率附近:
fn≈fpeak(7-1) f_n \approx f_{peak} \tag{7-1} fn≈fpeak(7-1)
例如 Bode 图在 148 Hz 出现峰值,则可先取:
fn=148 Hz(7-2) f_n=148\text{ Hz} \tag{7-2} fn=148 Hz(7-2)
工程上也可取 145 Hz、150 Hz 附近做对比试验。
7.3 陷波深度与带宽如何选
陷波太浅压不住峰值,太深又会引入不必要相位影响。一般可按以下思路:
- 峰值高出周围 3 dB ~ 5 dB:先试中等陷波;
- 峰值高出周围 6 dB 以上:考虑更深陷波;
- 峰值很窄:陷波带宽可窄一些;
- 峰值随工况漂移:陷波带宽要略宽,但要重新检查相位裕度。
7.4 陷波器设计流程

7.5 陷波器设计经验表
| 项目 | 工程建议 |
|---|---|
| 中心频率 | 取峰值频率或略低/略高做微调 |
| 陷波宽度 | 峰值窄则窄,峰值漂移大则略加宽 |
| 陷波深度 | 以"压低峰值且不过度损失相位"为原则 |
| 验证方式 | 必须复测 Bode、PM/GM、Nyquist 和阶跃 |
| 风险点 | 陷波器过多会叠加相位延时 |
7.6 数字陷波器、Lead 和低通的离散化实现
在驱动器、DSP、MCU 或 FPGA 中,补偿器最终都要落到离散时间差分方程上。工程上最常见做法是:
- 先在连续域设计目标传递函数;
- 再用 Tustin(双线性变换)或匹配极零法离散化;
- 最后整理成二阶或一阶 IIR 差分方程写入代码。
常用双线性变换为:
s≈2Ts⋅1−z−11+z−1(7-3) s \approx \frac{2}{T_s}\cdot\frac{1-z^{-1}}{1+z^{-1}} \tag{7-3} s≈Ts2⋅1+z−11−z−1(7-3)
其中 TsT_sTs 为控制周期。
7.6.1 数字二阶陷波器的一般形式
连续域二阶陷波器:
Gnotch(s)=s2+2ζzωns+ωn2s2+2ζpωns+ωn2(7-4) G_{notch}(s)=\frac{s^2+2\zeta_z\omega_n s+\omega_n^2}{s^2+2\zeta_p\omega_n s+\omega_n^2} \tag{7-4} Gnotch(s)=s2+2ζpωns+ωn2s2+2ζzωns+ωn2(7-4)
离散化后通常可写成:
Gnotch(z)=b0+b1z−1+b2z−21+a1z−1+a2z−2(7-5) G_{notch}(z)=\frac{b_0+b_1 z^{-1}+b_2 z^{-2}}{1+a_1 z^{-1}+a_2 z^{-2}} \tag{7-5} Gnotch(z)=1+a1z−1+a2z−2b0+b1z−1+b2z−2(7-5)
对应差分方程:
yk=−a1yk−1−a2yk−2+b0xk+b1xk−1+b2xk−2(7-6) yk=-a_1 yk-1-a_2 yk-2+b_0 xk+b_1 xk-1+b_2 xk-2 \tag{7-6} yk=−a1yk−1−a2yk−2+b0xk+b1xk−1+b2xk−2(7-6)
其中:
- xkxkxk 是输入,例如速度误差、速度反馈或位置指令;
- ykykyk 是滤波输出;
- a1,a2,b0,b1,b2a_1,a_2,b_0,b_1,b_2a1,a2,b0,b1,b2 是离散化后的系数。
如果用"数字谐振频率 + 半径"的常见工程写法,也可直接写成:
Gnotch(z)=1−2cos(ω0)z−1+z−21−2rcos(ω0)z−1+r2z−2(7-7) G_{notch}(z)=\frac{1-2\cos(\omega_0)z^{-1}+z^{-2}}{1-2r\cos(\omega_0)z^{-1}+r^2 z^{-2}} \tag{7-7} Gnotch(z)=1−2rcos(ω0)z−1+r2z−21−2cos(ω0)z−1+z−2(7-7)
其中:
- ω0=2πfnTs\omega_0=2\pi f_n T_sω0=2πfnTs;
- fnf_nfn 为目标陷波频率;
- rrr 越接近 1,陷波越窄;
- rrr 越小,陷波越宽。
对应差分方程可写成:
yk=2rcos(ω0)yk−1−r2yk−2+xk−2cos(ω0)xk−1+xk−2(7-8) yk=2r\cos(\omega_0)yk-1-r^2 yk-2+xk-2\cos(\omega_0)xk-1+xk-2 \tag{7-8} yk=2rcos(ω0)yk−1−r2yk−2+xk−2cos(ω0)xk−1+xk−2(7-8)
这类写法特别适合现场快速实现窄带 notch。
7.6.2 数字 Lead 补偿器的离散化
连续域 Lead 补偿器常写为:
Glead(s)=K⋅1+Tzs1+Tps,Tz>Tp(7-9) G_{lead}(s)=K\cdot\frac{1+T_z s}{1+T_p s},\quad T_z>T_p \tag{7-9} Glead(s)=K⋅1+Tps1+Tzs,Tz>Tp(7-9)
它的作用是在某个频段提供正相位补偿,从而提升 PM。
用 Tustin 离散化后:
Glead(z)=b0+b1z−11+a1z−1(7-10) G_{lead}(z)=\frac{b_0+b_1 z^{-1}}{1+a_1 z^{-1}} \tag{7-10} Glead(z)=1+a1z−1b0+b1z−1(7-10)
其一阶差分方程为:
yk=−a1yk−1+b0xk+b1xk−1(7-11) yk=-a_1 yk-1+b_0 xk+b_1 xk-1 \tag{7-11} yk=−a1yk−1+b0xk+b1xk−1(7-11)
如果把双线性变换直接代入,可得到:
b0=K⋅1+2TzTs1+2TpTs,b1=K⋅1−2TzTs1+2TpTs,a1=1−2TpTs1+2TpTs(7-12) b_0=K\cdot\frac{1+\frac{2T_z}{T_s}}{1+\frac{2T_p}{T_s}},\qquad b_1=K\cdot\frac{1-\frac{2T_z}{T_s}}{1+\frac{2T_p}{T_s}},\qquad a_1=\frac{1-\frac{2T_p}{T_s}}{1+\frac{2T_p}{T_s}} \tag{7-12} b0=K⋅1+Ts2Tp1+Ts2Tz,b1=K⋅1+Ts2Tp1−Ts2Tz,a1=1+Ts2Tp1−Ts2Tp(7-12)
工程上使用 Lead 时要特别注意:
- Lead 虽然能补相位,但也可能提高高频增益;
- 若机械峰就在补偿频段附近,必须结合 notch 一起验证;
- 加完后一定复查 Nyquist 轨迹是否更安全,而不是只看 PM 数值。
7.6.3 数字一阶低通滤波器的离散化
连续域一阶低通:
Glp(s)=ωcs+ωc(7-13) G_{lp}(s)=\frac{\omega_c}{s+\omega_c} \tag{7-13} Glp(s)=s+ωcωc(7-13)
其中截止频率 fc=ωc/(2π)f_c=\omega_c/(2\pi)fc=ωc/(2π)。
离散后可写成:
Glp(z)=b0+b1z−11+a1z−1(7-14) G_{lp}(z)=\frac{b_0+b_1 z^{-1}}{1+a_1 z^{-1}} \tag{7-14} Glp(z)=1+a1z−1b0+b1z−1(7-14)
对应差分方程:
yk=−a1yk−1+b0xk+b1xk−1(7-15) yk=-a_1 yk-1+b_0 xk+b_1 xk-1 \tag{7-15} yk=−a1yk−1+b0xk+b1xk−1(7-15)
若采用 Tustin 形式,则:
b0=b1=ωcTs2+ωcTs,a1=ωcTs−22+ωcTs(7-16) b_0=b_1=\frac{\omega_c T_s}{2+\omega_c T_s},\qquad a_1=\frac{\omega_c T_s-2}{2+\omega_c T_s} \tag{7-16} b0=b1=2+ωcTsωcTs,a1=2+ωcTsωcTs−2(7-16)
如果采用更常见的指数平滑写法,也可直接写为:
yk=αyk−1+(1−α)xk(7-17) yk=\alpha yk-1+(1-\alpha)xk \tag{7-17} yk=αyk−1+(1−α)xk(7-17)
其中:
α=e−2πfcTs(7-18) \alpha=e^{-2\pi f_c T_s} \tag{7-18} α=e−2πfcTs(7-18)
这在 MCU 中实现最简单,但频率特性与严格 Tustin 形式略有差异。
7.6.4 三种离散补偿器的代码实现模板
下面给出现场最常用的 C 代码:
c
typedef struct
{
float a1, a2;
float b0, b1, b2;
float x1, x2;
float y1, y2;
} IIR2_Filter;
float IIR2_Run(IIR2_Filter *f, float x)
{
float y = -f->a1 * f->y1 - f->a2 * f->y2
+ f->b0 * x + f->b1 * f->x1 + f->b2 * f->x2;
f->x2 = f->x1;
f->x1 = x;
f->y2 = f->y1;
f->y1 = y;
return y;
}
若是一阶 Lead 或低通,则可用更简单的模板:
c
typedef struct
{
float a1;
float b0, b1;
float x1;
float y1;
} IIR1_Filter;
float IIR1_Run(IIR1_Filter *f, float x)
{
float y = -f->a1 * f->y1 + f->b0 * x + f->b1 * f->x1;
f->x1 = x;
f->y1 = y;
return y;
}
7.6.5 离散实现时的工程注意事项
- 陷波器中心频率不能太接近 Nyquist 频率,否则离散误差明显;
- 采样频率至少应为目标补偿频率的 15~20 倍,这样频率特性更可信;
- 离散化后必须重新画离散系统 Bode 图,不能只看连续域设计值;
- 多级滤波器串联时,量化误差和数值溢出要单独检查;
- 固定点实现时,要验证系数量化对 PM/GM 的影响;
- 所有补偿器上线前都应做阶跃、扫频和 Nyquist 三重验证。
7.6.6 数值示例
设控制周期为:
Ts=0.0005 s(2 kHz 采样)(7-19) T_s=0.0005\text{ s} \quad (2\text{ kHz 采样}) \tag{7-19} Ts=0.0005 s(2 kHz 采样)(7-19)
若要设计 150 Hz 的数字陷波器,则数字角频率为:
ω0=2π×150×0.0005≈0.4712 rad(7-20) \omega_0=2\pi \times 150 \times 0.0005 \approx 0.4712\text{ rad} \tag{7-20} ω0=2π×150×0.0005≈0.4712 rad(7-20)
若先取 r=0.95r=0.95r=0.95,则:
cos(ω0)≈0.8910(7-21) \cos(\omega_0)\approx 0.8910 \tag{7-21} cos(ω0)≈0.8910(7-21)
可得分母项近似为:
1−2×0.95×0.8910 z−1+0.952z−2(7-22) 1-2\times0.95\times0.8910\,z^{-1}+0.95^2 z^{-2} \tag{7-22} 1−2×0.95×0.8910z−1+0.952z−2(7-22)
即:
1−1.6929z−1+0.9025z−2(7-23) 1-1.6929z^{-1}+0.9025z^{-2} \tag{7-23} 1−1.6929z−1+0.9025z−2(7-23)
分子项近似为:
1−1.7820z−1+z−2(7-24) 1-1.7820z^{-1}+z^{-2} \tag{7-24} 1−1.7820z−1+z−2(7-24)
因此差分方程近似可写为:
yk=1.6929yk−1−0.9025yk−2+xk−1.7820xk−1+xk−2(7-25) yk=1.6929yk-1-0.9025yk-2+xk-1.7820xk-1+xk-2 \tag{7-25} yk=1.6929yk−1−0.9025yk−2+xk−1.7820xk−1+xk−2(7-25)
这个例子说明:只要确定了目标频率、采样周期和带宽参数,就能直接写出数字滤波器差分方程,方便嵌入控制代码。
7.7 本章小结
本章除了给出陷波器的工程设计思路,还补充了数字陷波器、Lead 和低通滤波器的离散化公式与差分方程。对驱动器实际开发而言,连续域设计只是第一步,离散实现与系数量化验证同样关键。
8. MATLAB 画图与陷波器设计代码
8.1 机械共振模型与 Bode 图示例
matlab
clear; clc; close all;
s = tf('s');
fn = 150; % 共振频率 Hz
wn = 2*pi*fn;
zeta1 = 0.03; % 低阻尼共振
G_res = wn^2 / (s^2 + 2*zeta1*wn*s + wn^2);
G_lp = 2*pi*120 / (s + 2*pi*120);
G = G_lp * G_res;
figure;
bode(G);
grid on;
title('机械共振示例 Bode 图');
8.2 Nyquist 图示例
matlab
clear; clc; close all;
s = tf('s');
L = 30 / ((0.002*s+1)*(0.01*s+1)) * (2*pi*150)^2 / (s^2 + 2*0.03*2*pi*150*s + (2*pi*150)^2);
figure;
nyquist(L);
grid on;
title('存在共振峰时的 Nyquist 图');
8.3 陷波器设计示例
matlab
clear; clc; close all;
s = tf('s');
fn = 150;
wn = 2*pi*fn;
zeta_z = 0.02;
zeta_p = 0.15;
Notch = (s^2 + 2*zeta_z*wn*s + wn^2) / (s^2 + 2*zeta_p*wn*s + wn^2);
G0 = 30 / ((0.002*s+1)*(0.01*s+1)) * (2*pi*150)^2 / (s^2 + 2*0.03*2*pi*150*s + (2*pi*150)^2);
G1 = G0 * Notch;
figure;
margin(G0);
grid on;
title('补偿前裕度图');
figure;
margin(G1);
grid on;
title('加入陷波器后的裕度图');
8.4 连续域到离散域的 MATLAB 仿真对比代码
下面这段代码用于把前文的连续域机械共振模型、陷波器和低通滤波器离散化,并对比:
- 连续域与离散域的 Bode 曲线差异;
- 连续域与离散域的 Nyquist 轨迹差异;
- 加入数字陷波器前后的时域响应变化;
c2d离散化结果与手工差分方程实现是否一致。
适用场景:
- 验证 7.6 节离散化后的补偿器是否仍满足设计预期;
- 检查采样周期是否足够支撑目标补偿频率;
- 在驱动器代码落地前,先离线验证数字滤波器效果。
matlab
clear; clc; close all;
%% 1) 连续域模型
s = tf('s');
Ts = 0.0005; % 2 kHz 采样
fn_res = 150; % 机械共振频率
wn_res = 2*pi*fn_res;
zeta_res = 0.03;
fc_lp = 120; % 速度观测低通
wc_lp = 2*pi*fc_lp;
% 连续域机械共振 + 低通对象
G_res_c = wn_res^2 / (s^2 + 2*zeta_res*wn_res*s + wn_res^2);
G_lp_c = wc_lp / (s + wc_lp);
G_c = G_lp_c * G_res_c;
%% 2) 连续域陷波器设计
fn_notch = 150;
wn_notch = 2*pi*fn_notch;
zeta_z = 0.02;
zeta_p = 0.15;
Notch_c = (s^2 + 2*zeta_z*wn_notch*s + wn_notch^2) / ...
(s^2 + 2*zeta_p*wn_notch*s + wn_notch^2);
G_comp_c = minreal(G_c * Notch_c);
%% 3) 离散化
G_d = c2d(G_c, Ts, 'tustin');
Notch_d = c2d(Notch_c, Ts, 'tustin');
G_comp_d = minreal(c2d(G_comp_c, Ts, 'tustin'));
disp('连续域陷波器 Notch_c = ');
Notch_c
disp('离散域陷波器 Notch_d = ');
Notch_d
%% 4) Bode 对比:连续域 vs 离散域
figure('Name','Bode对比:连续域/离散域');
bode(G_c, 'b', G_d, 'r--', {2*pi*5, 2*pi*800});
grid on;
legend('连续域 G_c', '离散域 G_d');
title('机械共振对象:连续域与离散域 Bode 对比');
figure('Name','Bode对比:加陷波后');
bode(G_comp_c, 'b', G_comp_d, 'r--', {2*pi*5, 2*pi*800});
grid on;
legend('连续域 G_{comp,c}', '离散域 G_{comp,d}');
title('加陷波后:连续域与离散域 Bode 对比');
%% 5) Nyquist 对比
figure('Name','Nyquist对比:未补偿');
nyquist(G_c, 'b', G_d, 'r--');
grid on;
legend('连续域 G_c', '离散域 G_d');
title('未补偿系统 Nyquist 对比');
figure('Name','Nyquist对比:加陷波后');
nyquist(G_comp_c, 'b', G_comp_d, 'r--');
grid on;
legend('连续域 G_{comp,c}', '离散域 G_{comp,d}');
title('加陷波后 Nyquist 对比');
%% 6) 裕度对比
[Gm_c, Pm_c, Wcg_c, Wcp_c] = margin(G_comp_c);
[Gm_d, Pm_d, Wcg_d, Wcp_d] = margin(G_comp_d);
fprintf('\n===== 加陷波后裕度对比 =====\n');
fprintf('连续域: PM = %.2f deg, GM = %.2f dB, Wcp = %.2f Hz\n', ...
Pm_c, 20*log10(Gm_c), Wcp_c/(2*pi));
fprintf('离散域: PM = %.2f deg, GM = %.2f dB, Wcp = %.2f Hz\n', ...
Pm_d, 20*log10(Gm_d), Wcp_d/(2*pi));
%% 7) 时域对比:扫频附近的正弦输入
t = 0:Ts:0.25;
f_test = 150; % 在共振附近测试
u = sin(2*pi*f_test*t);
y_c0 = lsim(G_c, u, t);
y_c1 = lsim(G_comp_c, u, t);
y_d0 = lsim(G_d, u, t);
y_d1 = lsim(G_comp_d, u, t);
figure('Name','时域正弦响应对比');
subplot(2,1,1);
plot(t, u, 'k:', t, y_c0, 'b', t, y_d0, 'r--', 'LineWidth', 1.1);
grid on; xlabel('Time (s)'); ylabel('Amplitude');
legend('输入','连续域未补偿','离散域未补偿');
title('150 Hz 附近:未补偿时域响应');
subplot(2,1,2);
plot(t, u, 'k:', t, y_c1, 'b', t, y_d1, 'r--', 'LineWidth', 1.1);
grid on; xlabel('Time (s)'); ylabel('Amplitude');
legend('输入','连续域加陷波','离散域加陷波');
title('150 Hz 附近:加陷波后时域响应');
%% 8) 手工差分方程验证数字陷波器
[b_notch, a_notch] = tfdata(Notch_d, 'v');
x = u(:);
y_manual = zeros(size(x));
for k = 3:length(x)
y_manual(k) = -a_notch(2)*y_manual(k-1) - a_notch(3)*y_manual(k-2) ...
+ b_notch(1)*x(k) + b_notch(2)*x(k-1) + b_notch(3)*x(k-2);
end
y_builtin = lsim(Notch_d, u, t);
figure('Name','手工差分方程验证');
plot(t, y_builtin, 'b', t, y_manual, 'r--', 'LineWidth', 1.1);
grid on; xlabel('Time (s)'); ylabel('Amplitude');
legend('lsim(Notch_d)','手工差分方程');
title('数字陷波器:系统函数与差分方程结果对比');
%% 9) 离散极点零点图
figure('Name','离散陷波器极零图');
pzmap(Notch_d); grid on;
title('数字陷波器零极点图');
8.5 根据实验数据识别峰值频率
matlab
clear; clc; close all;
f = [10 20 30 50 80 100 120 140 150 160 180 200 250];
mag_db = [-0.1 -0.2 -0.4 -0.8 -1.4 -2.0 -1.5 1.2 3.6 2.0 -1.0 -3.2 -6.0];
phase_deg = [-5 -9 -12 -20 -30 -40 -55 -78 -96 -118 -135 -148 -160];
[peak_val, idx] = max(mag_db);
fprintf('Peak frequency = %.1f Hz\n', f(idx));
fprintf('Peak magnitude = %.2f dB\n', peak_val);
figure;
subplot(2,1,1); semilogx(f, mag_db, 'o-'); grid on; ylabel('Mag(dB)');
subplot(2,1,2); semilogx(f, phase_deg, 's-'); grid on; ylabel('Phase(deg)'); xlabel('Hz');
8.6 本章小结
本章提供了可直接扩展的 MATLAB 代码,覆盖共振模型、Nyquist 图、陷波器设计、连续域/离散域对比以及峰值识别。工程中可以把这些脚本作为离线验证工具,与实测数据表和驱动器代码实现相互校验。
9. 详细案例 1:速度环机械共振识别与陷波优化
9.1 已知条件
某伺服平台速度环在 300 rpm 附近工作时存在明显啸叫,参数如下:
| 参数 | 数值 |
|---|---|
| 电流环带宽 | 1.2 kHz |
| 速度 PI 参数 | Kp=0.42K_p=0.42Kp=0.42,Ki=10K_i=10Ki=10 |
| 速度工作点 | 300 rpm |
| 扰动函数 | ω∗(t)=300+12sin(2πft)\omega^*(t)=300+12\sin(2\pi f t)ω∗(t)=300+12sin(2πft) rpm |
| 扫频范围 | 10 ~ 250 Hz |
| 采样周期 | 1 ms |
| 每点采样周期数 | 12 |
测试波形示意图

9.2 Bode 图测试结果
| 频率 Hz | 输入幅值 rpm | 输出幅值 rpm | 幅值 dB | 相位 deg |
|---|---|---|---|---|
| 10 | 12 | 11.9 | -0.07 | -6 |
| 20 | 12 | 11.8 | -0.15 | -10 |
| 30 | 12 | 11.5 | -0.37 | -14 |
| 50 | 12 | 10.9 | -0.84 | -22 |
| 80 | 12 | 10.0 | -1.58 | -33 |
| 100 | 12 | 9.2 | -2.31 | -44 |
| 120 | 12 | 10.1 | -1.49 | -58 |
| 140 | 12 | 13.8 | 1.22 | -79 |
| 150 | 12 | 18.2 | 3.62 | -96 |
| 160 | 12 | 15.1 | 2.00 | -118 |
| 180 | 12 | 10.7 | -1.00 | -135 |
| 200 | 12 | 8.3 | -3.20 | -148 |
可见 150 Hz 附近存在明显共振峰,峰值约 +3.6 dB。
9.3 Nyquist 风险判断
根据开环频响换算可知,150 Hz 附近的额外峰值和相位突降导致 Nyquist 轨迹明显向 (−1,0)(-1,0)(−1,0) 点凸出。系统尚未失稳,但负载稍变化就可能进入高风险区。
9.4 陷波器设计与优化
根据峰值,初选:
- 中心频率 fn=150f_n=150fn=150 Hz;
- 中等陷波深度;
- 窄带陷波,避免影响过多低频相位。
优化后复测结果示意:
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 峰值频率 | 150 Hz | 150 Hz |
| 峰值高度 | +3.6 dB | -1.2 dB |
| 相位裕度 PM | 38° | 52° |
| 听感啸叫 | 明显 | 基本消失 |
| 阶跃振铃 | 明显 | 可接受 |
参数整定建议表
| 观察现象 | 当前表现 | 可能原因 | 调整建议 |
|---|---|---|---|
| 150 Hz 峰值 | +3.6 dB | 机械柔性共振 | 优先在 150 Hz 附近设计陷波器 |
| PM 偏低 | 38° | 峰值叠加相位下降 | 加陷波后重新调整速度 PI |
| 啸叫明显 | 有 | 共振被速度环激发 | 除陷波外检查联轴器和安装刚度 |
| 阶跃振铃 | 明显 | 峰值阻尼不足 | 陷波后再评估是否适当回退 KpK_pKp |
9.5 结论
这是典型的"单一主峰机械共振"案例。对这类问题,陷波器最有效,但一定要在优化后重新检查 PM、GM 和 Nyquist 轨迹,而不是只看峰值是否被压低。
9.6 本章小结
本章给出了一个标准的机械共振优化案例:先用 Bode 图识别峰值,再用 Nyquist 判断风险,最后设计陷波器并复测验证。
10. 详细案例 2:编码器噪声识别与速度观测优化
10.1 已知条件
某平台低速爬行时速度反馈抖动明显,但机械部分未发现明显共振。测试条件如下:
| 参数 | 数值 |
|---|---|
| 编码器类型 | 增量式 2500 线 |
| 电子齿轮换算后分辨率 | 10000 counts/rev |
| 低速工作点 | 10 rpm |
| 速度采样周期 | 1 ms |
| 速度算法 | 差分 + 一阶低通 |
| 位置环状态 | 关闭 |
测试波形示意图

10.2 测试结果
静止和低速时做频谱分析,得到:
| 频率 Hz | 噪声幅值(归一化) |
|---|---|
| 20 | 0.05 |
| 50 | 0.08 |
| 100 | 0.13 |
| 150 | 0.18 |
| 200 | 0.24 |
| 300 | 0.31 |
| 400 | 0.36 |
| 500 | 0.39 |
特点是:
- 没有很尖锐的单峰;
- 高频整体抬升;
- 多次测试曲线有轻微波动。
这更符合编码器量化噪声与速度差分噪声放大的特征。
10.3 优化方法
尝试以下优化:
- 调整速度估计算法窗口;
- 适度降低速度低通截止频率;
- 优化编码器接地和屏蔽;
- 保持速度环带宽不过度逼近噪声主区。
优化后结果示意:
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 300 Hz 噪声幅值 | 0.31 | 0.19 |
| 500 Hz 噪声幅值 | 0.39 | 0.22 |
| 低速速度抖动 | 明显 | 明显减轻 |
| 速度环 PM | 48° | 45° |
说明:优化后噪声下降了,但也引入了一点额外相位滞后,因此不能无限加强滤波。
参数整定建议表
| 观察现象 | 当前表现 | 可能原因 | 调整建议 |
|---|---|---|---|
| 高频噪声抬升 | 明显 | 编码器量化 + 差分放大 | 优化速度估计算法和采样窗口 |
| 无明显窄峰 | 是 | 不是典型机械共振 | 不建议直接上陷波器 |
| 低速抖动 | 明显 | 测量噪声主导 | 优先调滤波和布线,不是优先调 PI |
| PM 略下降 | 优化后略降 | 低通滤波带来延时 | 滤波后必须重新检查 PM |
10.4 结论
这个案例说明:不是所有"抖"都是共振。编码器噪声在频域上通常更像高频地板抬高,而不是窄峰。对此优先应做传感和观测优化,而不是直接加陷波器。
10.5 本章小结
本章强调了"先分型,再下药"的原则。编码器噪声问题和机械共振问题在 Bode 图上的形态不同,对应优化方法也不同。
11. 详细案例 3:位置环结构谐振与多手段联合优化
11.1 场景描述
某丝杆平台位置环在 0° 附近保持时有细碎振动,阶跃时出现长尾振铃。参数如下:
| 参数 | 数值 |
|---|---|
| 电流环带宽 | 1 kHz |
| 速度环带宽 | 110 Hz |
| 位置环比例增益 | 28 |
| 扰动函数 | θ∗(t)=0+0.3∘sin(2πft)\theta^*(t)=0+0.3^\circ\sin(2\pi f t)θ∗(t)=0+0.3∘sin(2πft) |
| 扫频范围 | 0.5 ~ 80 Hz |
| 采样周期 | 1 ms |
测试波形示意图

11.2 Bode 结果
| 频率 Hz | 输入幅值 deg | 输出幅值 deg | 幅值 dB | 相位 deg |
|---|---|---|---|---|
| 1 | 0.30 | 0.30 | 0.00 | -2 |
| 2 | 0.30 | 0.30 | -0.02 | -4 |
| 5 | 0.30 | 0.29 | -0.29 | -10 |
| 10 | 0.30 | 0.28 | -0.60 | -21 |
| 20 | 0.30 | 0.25 | -1.58 | -45 |
| 30 | 0.30 | 0.23 | -2.31 | -67 |
| 40 | 0.30 | 0.24 | -1.94 | -92 |
| 45 | 0.30 | 0.29 | -0.30 | -110 |
| 50 | 0.30 | 0.34 | 1.09 | -129 |
| 60 | 0.30 | 0.21 | -3.10 | -151 |
50 Hz 附近存在明显结构峰值。
对应裕度结果:
| 指标 | 数值 |
|---|---|
| 开环交越频率 | 34 Hz |
| 相位裕度 PM | 31° |
| 增益裕度 GM | 5 dB |
11.3 优化方法
该案例没有只采用一种手段,而是联合处理:
- 将位置环比例增益从 28 降到 24;
- 在 50 Hz 附近增加窄带陷波;
- 检查平台安装支撑,增加侧向刚度。
优化后结果:
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 50 Hz 峰值 | +1.09 dB | -2.20 dB |
| PM | 31° | 49° |
| GM | 5 dB | 8.5 dB |
| 保持抖动 | 明显 | 基本消失 |
| 阶跃振铃 | 长尾 | 明显缩短 |
参数整定建议表
| 观察现象 | 当前表现 | 可能原因 | 调整建议 |
|---|---|---|---|
| 50 Hz 结构峰 | 明显 | 支撑刚度不足、外环过高 | 先回退位置增益,再加窄带陷波 |
| PM 偏低 | 31° | 峰值带来额外相位损失 | 目标提升到 45°以上 |
| 保持抖动 | 明显 | 峰值被外环持续激发 | 降外环增益优先级高于继续追带宽 |
| 振铃长尾 | 明显 | 阻尼不足 | 联合机械刚度优化更有效 |
11.4 结论
这个案例说明:结构谐振往往不是单靠陷波器就能完美解决。对于柔性平台,更常见的有效方案是"回退外环增益 + 陷波补偿 + 机械加固"的联合优化。
11.5 本章小结
本章展示了结构谐振类问题的典型处理方式:不能只盯控制参数,还要结合机械改造与补偿器设计,才能兼顾动态与稳定性。
12. 测试报告建议写法
12.1 基本信息
建议写清:
- 电机和驱动器型号;
- 负载形式;
- 编码器类型;
- 控制周期与采样周期;
- 当前控制参数版本。
12.2 测试条件
建议写清:
- 工作点;
- 扰动函数;
- 扫频范围;
- 每点采样周期数;
- 测量量和滤波设置;
- 环境或安装状态。
12.3 结果字段示例
| 问题类型 | 工作点 | 峰值频率/噪声区 | PM | GM | 优化方式 | 优化后结果 |
|---|---|---|---|---|---|---|
| 机械共振 | 300 rpm | 150 Hz | 38° | 5.5 dB | 150 Hz 陷波 | 峰值显著下降 |
| 编码器噪声 | 10 rpm | 300~500 Hz | 48° | 8 dB | 观测优化+低通调整 | 高频噪声下降 |
| 结构谐振 | 0° 保持 | 50 Hz | 31° | 5 dB | 回退增益+陷波+机械加固 | 保持振动减轻 |
12.4 本章小结
本章给出的是测试报告写法建议。对共振与噪声类问题,报告不能只写"有问题/已解决",而应把峰值频率、裕度变化和优化手段一起记录。
13. 常见误区
- 看到振动就直接加陷波器;
- 没分清机械共振和编码器噪声;
- 陷波器加完后不复测 PM、GM 和 Nyquist;
- 只关注某个峰值下降,不关注整体相位损失;
- 结构刚度问题完全依赖控制补偿解决;
- 编码器噪声问题单纯靠提高带宽压制。
13.1 本章小结
本章强调的是方法论:先识别类型,再选择手段,再闭环验证结果。避免"先补偿、后理解"的错误顺序,能大幅减少反复试错。