简介:这是一份聚焦控制系统响应带宽计算的专题文档,面向电机控制、伺服调试工程师及自动化专业学习者,帮助梳理机电系统带宽的定义、计算思路与工程测试方法。压缩包内为1个docx文件,约189KB,内容以公式推导和工程案例组织,便于查阅与笔记整理。文档从典型二阶反馈系统闭环传递函数出发,说明-3dB带宽频率与自然频率、阻尼比的关系,并延伸至PMSM双闭环控制系统,讨论电流环、速度环传递函数建模及带宽计算,同时给出伺服系统正弦扫频测试流程和主流驱动产品速度环带宽数据对比。已有4694人学习,适合需要理解带宽指标、核对计算过程或建立伺服参数直觉的读者参考。
1. 从一条跟不上的正弦指令说起:响应带宽到底卡在哪
伺服调试现场最常听到的一句话是「响应带宽不够」,但真追问下去,十个人里有八个说不清这个数字是怎么来的。电机控制里的响应带宽,说的是这套机电系统还能以多大比例、多小滞后跟住一条正弦指令;指令频率再往上走,幅值被压低、相位被拖后,系统就开始「听不见」了。它不是一个能拍脑袋报出去的指标——给定电机电感、载波周期和 PI 参数,带宽的上限基本已经被写死。这份资料做的事情,是把行业标准里的扫频测试方法、二阶系统的闭式解、以及永磁同步电机双闭环下的折算过程串成一条完整的线。适合两类人:正在整定电流环和速度环、想搞清楚手里的 Kp 到底换来了多少带宽的;以及需要出一份带宽测试报告、必须把数字的来源讲清楚的。
2. 把定义钉死:-3dB、90°相移与 0.01 倍额定的扫频法
2.1 低通滤波器视角:高频指令究竟去哪了
机电系统在带宽讨论的尺度上都可以线性化,线性系统当滤波器看,而且绝大多数是低通。这个视角一旦建立,很多争论就自动消解了:输入一条幅值恒定、频率缓慢上扫的正弦指令,输出不会是同样幅值的正弦,幅值会掉、相位会滞后,掉到某个门限以下,这条指令在反馈里就等于没发生过。
行业标准(JB/T 1643 那一类伺服系统通用技术条件)给的定义是两条判据二选一:相位滞后增大到 90° 时的频率,叫 90° 相移带宽;幅值衰减到低频段幅值的 1/√2 时的频率,叫 -3dB 带宽。注意这里的 1/√2 是相对低频增益而言的,不是相对 1。如果系统低频闭环增益本身就是 0.98,-3dB 点在 0.98×0.707 那个位置,不是 0.707。
这里有个高频混淆点必须分开:开环截止频率和闭环带宽不是一回事。开环截止频率是回路增益为 1 的那个频率,闭环带宽是闭环幅频掉 3dB 的频率,两者数值接近但物理含义不同,报报告时混着写,评审一追问就露馅。单位反馈、相位裕度接近 90° 时二者数值近似相等,裕度越小差距越大。
2.2 两个判据不等价:-3dB 带宽和 90° 相移带宽差多少
对典型的二阶闭环 Φ(s)=ωn²/(s²+2ξωn·s+ωn²),相位是 -arctan[2ξω/ωn / (1-ω²/ωn²)]。令相位等于 -90°,分母实部必须为零,也就是 1-ω²/ωn²=0,解出来 ω=ωn。这个结论很干净:二阶系统的 90° 相移频率恒等于自然频率 ωn,和阻尼比无关。
-3dB 带宽就没这么客气了,它随 ξ 变化。把不同 ξ 代进后面第 3 章的公式,能算出下面这张表:
| 阻尼比 ξ | ωb/ωn | 90° 相移频率/ωn | 说明 |
|---|---|---|---|
| 0.30 | 1.453 | 1.000 | 有明显谐振峰,-3dB 点被峰抬高 |
| 0.50 | 1.272 | 1.000 | 工程上常见的欠阻尼区间 |
| 0.707 | 1.000 | 1.000 | 最大平坦,两个判据重合 |
| 1.00 | 0.644 | 1.000 | 过阻尼,幅值早就掉下去了 |
| 1.50 | 0.374 | 1.000 | 带宽被阻尼吃掉大半 |
读这张表能得到一个很实用的判断:如果某台驱动器给出的带宽数字远大于同行的,先别急着信,去看看它的阶跃响应是不是有明显超调——超调大通常意味着 ξ 小,而 ξ 小会把 -3dB 点往上抬,数字自然好看。反过来说,用 90° 相移判据测出来的结果,对不同阻尼水平的系统可比性更好,这也是标准里两条判据并存的原因之一。
2.3 按标准复现一次扫频:幅值、频点、数据记录
测试条件在标准里写得很死:驱动器工作在速度模式,输入正弦转速指令,幅值取额定转速指令值的 0.01 倍,频率从 1Hz 起逐步升高,同步记录电机转速反馈曲线。0.01 倍这个数字经常被省略,但它是整场测试有效性的前提,第 5 章会专门说为什么。
实操顺序我一般这么走:
- 空载或带等效惯量负载,确认机械连接无松动,编码器分辨率足够分辨 0.01 倍额定转速对应的波形。
- 速度环、电流环参数固定并记录,整场测试中途不改参数。
- 频率从 1Hz 起,按 1、2、5、10、20、50、100…这样的等比序列取点,在预估 -3dB 点附近加密。
- 每个频点等幅值稳定后再截取数据窗,窗长取整数个指令周期。
- 对每个窗做正交解调,提取基波幅值比和相位差,画 Bode 图,读取 -3dB 点和 -90° 点。
第 5 步可以抄这段:
import numpy as np def amp_phase(cmd, fb, fs, f0): """从稳态片段提取基波幅值比与相位差 cmd/fb : 指令与反馈数组,同一时间窗、已去掉起始瞬态 fs : 采样率 Hz f0 : 注入频率 Hz 返回 (幅值比, 相位差 度) """ n = len(cmd) t = np.arange(n) / fs ref = np.exp(-1j * 2 * np.pi * f0 * t) # 正交参考信号 C = 2 / n * np.sum(cmd * ref) # 指令基波复幅值 F = 2 / n * np.sum(fb * ref) # 反馈基波复幅值 return np.abs(F) / np.abs(C), np.angle(F / C, deg=True) # 逐频点调用,累积成两条曲线 # ratio, ph = amp_phase(cmd_win, fb_win, fs=10000, f0=50.0)逻辑说明:正交解调等价于对单一频率做 DFT,比整段 FFT 更抗泄漏,因为它只关心注入的那根谱线。参数说明:fs必须和实际采样率一致,指令与反馈两路要用同一时钟;窗长n必须覆盖整数个指令周期,否则解调出来的幅值和相位都会带上泄漏误差,通常表现为相邻频点数据「跳」。如果编码器反馈有量化台阶,可以先做一次滑动平均,但平均窗不要超过最短周期的十分之一,否则会额外引入相位滞后,把带宽测小。
提示:指令和反馈如果走不同的采样通道或不同的滤波环节,两者之间存在固定的通道延时。这个延时会在高频段被误读成系统相位滞后,读 90° 相移点之前,先用低频段数据把这个固定偏移标定掉。
3. 二阶闭环的解析解:给定 ωn 和 ξ,ωb 不用试凑
3.1 从闭环传递函数到带宽方程
带宽的定义式本身就是一个方程:|Φ(jωb)|=0.707|Φ(j0)|。对二阶系统,|Φ(j0)|=1,于是要解的是
1/√[(1-ω²/ωn²)² + 4ξ²ω²/ωn²] = 1/√2
两边平方再取倒数,得 (1-x)²+4ξ²x = 2,其中 x=ω²/ωn²。展开整理成一元二次:
x² + (4ξ²-2)x - 1 = 0
取正根 x = (1-2ξ²) + √[(1-2ξ²)²+1],于是
ωb = ωn·√x = ωn·[(1-2ξ²)+√((1-2ξ²)²+1)]^0.5
这个式子值得记在脑子里,因为它是后面所有折算工作的终点。它同时告诉你两件事:带宽和 ωn 成正比,所以任何把 ωn 抬上去的手段(加大比例增益、减小电感、缩短载波周期)都直接换算成带宽;带宽和 ξ 是强非线性关系,ξ 从 0.7 掉到 0.3,ωb/ωn 从 1.0 涨到 1.45,看起来带宽涨了 45%,实际上系统已经在振荡边缘,这个「涨」是拿稳定性换的。
3.2 用代码把 ωb 算出来,再和 bode 图对一遍
手算容易错在括号层级上,直接让机器算。下面这段同时跑解析式和数值 Bode,两者对不上就说明公式抄错了:
import numpy as np from scipy import signal def wb_second_order(wn, xi): """二阶系统 -3dB 带宽 rad/s""" a = 1 - 2 * xi**2 return wn * np.sqrt(a + np.sqrt(a**2 + 1)) wn, xi = 100.0, 0.5 # 自然频率 rad/s,阻尼比 num = [wn**2] den = [1, 2 * xi * wn, wn**2] # s^2 + 2ξωn s + ωn^2 w = np.logspace(0, 4, 400000) _, mag, _ = signal.bode(signal.TransferFunction(num, den), w) idx = np.argmax(mag <= -3.0) # 首个跌破 -3dB 的频点 print(f"解析解 {wb_second_order(wn, xi):.2f} rad/s") print(f"数值解 {w[idx]:.2f} rad/s")逻辑说明:signal.bode返回的 mag 已经是 dB,直接和 -3.0 比较即可;np.argmax在布尔数组上返回第一个 True 的下标,比np.where(...)[0][0]更省事。参数说明:频率向量要够密,logspace取 40 万点能保证交点误差在 0.01% 量级;wn只影响缩放不影响形状,所以形状验证用任意wn都行。跑出来两个数应该都是 127.2 rad/s 附近,也就是 20.2Hz。
MATLAB 侧更省事,Control System Toolbox 里bandwidth(sys)直接返回 -3dB 带宽,单位 rad/s。要读 90° 相移频率,用bode出相频曲线后找 -90° 的穿越点,或者对二阶系统直接用wn,前面已经证明过二者相等。
3.3 ξ 三段的物理含义:单调区、峰值区与临界
ξ ≥ 1 时闭环幅频单调下降,没有谐振峰,-3dB 带宽小于 ωn。这时候系统很老实,但响应慢,阶跃上升时间被拉长。ξ 落在 0.707 附近是最大平坦,幅频在 ωn 之前基本是平的,之后 -40dB/dec 滚降,这是很多教材推荐的「最优阻尼」。ξ < 0.707 开始出现谐振峰,峰值频率 ωr = ωn√(1-2ξ²),峰值 Mr = 1/(2ξ√(1-ξ²))。
谐振峰对带宽读数的影响是实打实的干扰。以 ξ=0.3 为例,Mr≈1.75,也就是幅频先冲到 +4.9dB 再往下掉,-3dB 点(相对 0dB)被推到 1.45ωn,而这条曲线上 -3dB 出现在峰值之后的下降段,位置对参数极其敏感,ξ 再小一点数字就跳。这种系统在扫频测试里还有个特征:时域波形肉眼可见地「一大一小」,幅值不稳定。看到这种波形,先别记数据,回去把增益降下来。
反过来,如果只盯着 -3dB 带宽这一个数,ξ 从 0.707 加到 1.0,带宽掉 36%,但阶跃响应几乎不超调、调节时间反而可能更短。这就解释了为什么有些控制器带宽数字一般但手感很稳:它把阻尼留足了。
4. 双闭环折算:电流环怎么整定,速度环怎么降阶
4.1 电流环被控对象:从 dq 电压方程砍到 1/(Lq·s+R)
dq 坐标系下 q 轴电压方程是 uq = R·iq + Lq·diq/dt + ωr(Ld·id+ψf)。最后那一项是反电势和磁阻耦合项,对电流环来说它是一个缓变的外部扰动,带宽设计时先丢掉,剩下的就是标准的 RL 一阶环节:
Gm(s) = iq(s)/uq(s) = 1/(Lq·s + R)
这一步「忽略动态项」不是耍流氓,前提是电流环带宽远高于转速变化引起的反电势变化频率。实际工程里反电势通过前馈补偿掉,剩下的残差由 PI 的积分项吃掉,所以这个近似在电流环带宽设计阶段是成立的。
PI 控制器写成 Kcp + Kci/s,逆变器用一个增益 Kpwm 表示,再加上从占空比更新到实际发波之间的滞后。滞后的处理方式有两种:精确的 e^(-Tpwm·s),或者一阶泰勒近似 1/(Tpwm·s+1)。前者保相位,后者保计算简便,两者在 ωTpwm << 1 时几乎一致。Kpwm 这个系数看着玄学,其实只取决于 PI 输出变量的物理意义——它就是把调节器输出映射到逆变器输出电压的那个比例,标幺制下取 1 是很常见的做法,取值不同只影响 Kcp 的绝对数值,不影响带宽结论。
4.2 零极点对消与那个躲不掉的 Tpwm
把三部分串起来,开环是
GAcr = Kcp(s+Kci/Kcp)/s · Kpwm/(Tpwm·s+1) · 1/(Lq·s+R)
令 Kci/Kcp = R/Lq,PI 的零点正好抵消电机的电气极点,式子塌缩成
GAcr = (Kcp·Kpwm)/(Lq·s·(Tpwm·s+1))
闭环传递函数是 KcpKpwm/(LqTpwm·s² + Lq·s + KcpKpwm),化成标准形式对出
ωn = √[Kcp·Kpwm/(Lq·Tpwm)],ξ = ½·√[Lq/(Kcp·Kpwm·Tpwm)]
这两个式子相乘会得到一个很有意思的恒等式:ξ·ωn = 1/(2Tpwm)。也就是说,阻尼和自然频率的乘积只由载波周期决定,你加大 Kcp 抬 ωn 的时候,ξ 是被动下降的,二者不能同时调。想让 ξ 停在 0.707,ωn 就被钉死在 0.707/Tpwm 附近,带宽也就有了天花板。
把这个天花板算成数字更直观。取 ξ=0.707,则 ωb=ωn=0.707/Tpwm:
| 载波频率 | Tpwm | 可达 ωb(ξ=0.707) | 换算 Hz |
|---|---|---|---|
| 8 kHz | 125 μs | 5657 rad/s | 900 Hz |
| 16 kHz | 62.5 μs | 11314 rad/s | 1800 Hz |
| 20 kHz | 50 μs | 14142 rad/s | 2250 Hz |
| 40 kHz | 25 μs | 28284 rad/s | 4500 Hz |
主流伺服电流环带宽落在 2kHz~5kHz 这个区间,对回去就是 20kHz~40kHz 的载波,和实际产品对得上。反过来说,如果你的控制器跑 8kHz 载波却宣称 3kHz 电流环带宽,那多半是把 -3dB 和别的判据混着用了,或者 ξ 已经低到不敢看阶跃响应。
注意:这里只算了 PWM 更新滞后这一项。实际还有采样延时(通常按半个到一个采样周期计)和反馈滤波延时,串起来会进一步吃掉相位。按经验,把它们全算进去之后,同样的 ξ 目标下可达带宽要再打个七折。
4.3 从 ξ、ωn 反推 Kcp:一条能抄的整定链
由 ξ = ½√[Lq/(Kcp·Kpwm·Tpwm)] 反解:
Kcp = Lq/(4ξ²·Kpwm·Tpwm),Kci = Kcp·R/Lq
整定顺序是:先定目标 ξ(0.6~0.8 之间挑),再把已知的 Lq、Kpwm、Tpwm 代进去算 Kcp,最后用 R/Lq 把积分项配出来。下面这段可以当模板:
% 电流环整定与带宽核算(示例参数,仅演示量纲关系) Lq = 2e-3; % q 轴电感 H R = 0.15; % 定子相电阻 Ω Tpwm = 1/16000; % 载波周期 s,16kHz Kpwm = 1; % 逆变器等效增益,标幺制下取 1 xi = 0.707; % 目标阻尼比 Kcp = Lq/(4*xi^2*Kpwm*Tpwm); % 由阻尼比反解比例增益 Kci = Kcp*R/Lq; % 零极点对消,消掉电气极点 wn = 1/(2*xi*Tpwm); % 自然频率,与 Kcp 无关 s = tf('s'); Gm = 1/(Lq*s+R); % 电机电气环节 Gd = 1/(Tpwm*s+1); % PWM 更新滞后的一阶近似 Gpi = Kcp + Kci/s; % PI 调节器 L = Gpi*Kpwm*Gd*Gm; % 开环传函 T = feedback(L,1); % 闭环传函 wb = bandwidth(T); % -3dB 带宽 rad/s fprintf('wn=%.0f rad/s, wb=%.0f rad/s = %.0f Hz\n', wn, wb, wb/2/pi);逻辑说明:feedback(L,1)构造单位反馈闭环,bandwidth直接给 -3dB 点,不用手动画图找。参数说明:Kpwm取值决定了 Kcp 的数量级,但wn、wb和它无关——这正是前面说的「Kpwm 只影响绝对值」;Tpwm是唯一真正卡带宽的量,改载波频率比改任何增益都有效。如果算出来的wb和wn差很多,检查一下 ξ 是不是已经偏离 0.707,按第 3 章的公式,ξ=0.5 时 ωb≈1.27ωn,偏差属于正常。
4.4 速度环:把电流环压成一阶惯性,再拼开环传函
速度环设计时不会把电流环的二阶闭环原样搬进去,那样阶次太高没法手算。常见做法是把它压成一阶惯性:
Gc(s) ≈ 1/(Tc·s+1),Tc = Lq/(Kcp·Kpwm)
这个近似成立的前提是速度环穿越频率远低于电流环带宽,具体低多少,1/5 是底线,1/10 更稳。要注意 Tc 对应的转折频率 Kcp·Kpwm/Lq 比真实的电流环 -3dB 点低,在 ξ=0.707 时大约是 0.707 倍,也就是一阶近似会把电流环带宽低估约 1.4 倍。设计速度环时这个保守偏差是好事,它给降阶误差留了余量。
再往后接转矩和机械环节。id=0 控制下 Te = 1.5·pn·ψf·iq,运动方程 Te-TL = J·dωm/dt,转速换算 n = 30ωm/π,合起来从 iq 到转速的传函是 45·pn·ψf/(π·J·s),那个 45/π 就是常见的 14.32。拼上 PI 和前面的一阶惯性:
GAsr = Ksp(s+Ksi/Ksp)/s · 1/(Tc·s+1) · 45·pn·ψf/(π·J·s)
这是典型的 II 型系统,低频 -40dB/dec,相位在低频段就接近 -180°,所以积分时间常数不能乱取。若令 Ksp/Ksi 恰好等于 Tc,两个转折频率重合,回路退化成纯双积分,相位裕度归零,直接振荡。正确的做法是让速度环积分时间取电流环时间常数的若干倍,把两个转折频率拉开,穿越点落在几何中点附近,相位裕度能回到 45° 上下。
整定流程我一般这么走:先按「速度环穿越频率 = 电流环带宽的 1/10」定目标,只开比例项,把穿越频率顶到目标值;再加上积分项,从 Ksp/Ksi = 4·Tc 起调,看低频增益有没有抬起来;最后回 Bode 图确认相位裕度落在 40°~50°,超调可接受就收工。
% 速度环折算示例 J = 1e-4; % 转动惯量 kg·m^2 pn = 4; % 极对数 psi = 0.05; % 永磁磁链 Wb Kt = 45*pn*psi/pi; % iq 到转速的增益 (rpm/s)/A Tc = Lq/(Kcp*Kpwm); % 电流环等效时间常数 s = tf('s'); Gc = 1/(Tc*s+1); % 降阶后的电流环 Gm = Kt/(J*s); % 转矩与机械环节 Tsp = 4*Tc; % 积分时间,先取 4 倍 wcs = 2*pi*180; % 目标穿越 180Hz Ksp = Tsp*J*wcs^2/Kt; % 由穿越频率反解比例增益 Ksi = Ksp/Tsp; % 积分增益 Lasr = (Ksp + Ksi/s)*Gc*Gm; figure; margin(Lasr); grid; % 看相位裕度,不够就回头调 Tsp Tsr = feedback(Lasr,1); fprintf('速度环 -3dB = %.0f Hz\n', bandwidth(Tsr <p> <a href="https://download.csdn.net/download/linan1055/14504941" style="color:#ec7500;font-size:14px;"> 本文还有配套的精品资源,点击获取 </a> <img alt="menu-r.4af5f7ec.gif" src="https://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif" style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;"> </p>