永磁同步电机5次7次谐波补偿:FFT整周期与相位对齐避坑 简介电流谐波抑制是电机控制中提升波形质量与运行平稳性的基础环节。以FFT进行谐波检测时采样窗口需覆盖基波整周期否则频谱泄漏和栅栏效应会使5次、7次分量幅值与相位读数漂移补偿信号还需经过滤波、坐标变换、电流环和PWM延时反相180°到绕组处可能已偏移需用相位补偿与扫频实测校正。双通道并联时电压指令叠加、检测带宽重叠和dq轴6倍频耦合会引发互相激励常通过窄带带通、陷波隔离及准比例谐振控制器先单后双整定。结合过调制限幅、变速重算与THD、相电流峰值联合验收可把永磁同步电机5次7次谐波补偿从“一投就翻车”推进到可复现的工程调试流程。1. 谐波补偿一投就翻车5 次 7 次幅值反升的典型现场永磁同步电机的 5 次和 7 次电流谐波补偿在 Simulink 仿真里属于那种“原理三句话讲完、一使能就翻车”的活。谐波注入补偿的思路确实直白检出 5 次、7 次分量的幅值和相位生成一个等幅反相的信号怼回去。可真跑起来最常见的现场是 FFT 里两根柱子一个劲儿地跳补偿模块一投5 次谐波从 0.6A 涨到 1.2ATHD 从 6% 爬到 11%转速环跟着一起抖。这篇笔记按我在谐波抑制调试里踩过的顺序把检测抖动、反相失效、双通道耦合、过调制这几类故障的根因和解法拆开写每条都落到能直接抄进模型的参数和操作上适合正在搭 PMSM 谐波补偿仿真、被波形反复教育的人。2. FFT 读出的 5 次 7 次幅值一直跳采样窗口没卡整周期的连锁反应先还原一个特别常见的场景模型跑起来示波器上看相电流明明是个稳定的周期波形FFT 分析模块输出的 5 次谐波幅值却在 0.5A 到 1.1A 之间来回摆7 次更夸张相位读数每次刷新都不一样。有人第一反应是电机参数不对回头去改定子电阻和电感改完发现读数还是跳。这时候基本可以判定问题不在电机模型在谐波检测这条链路的取样方式上。2.1 幅值抖动的根因窗口没落在基波整周期上FFT 的本质是把一段有限长的信号拆成若干个整数倍频的复指数。它默认你截取的这段信号在首尾是连续的也就是刚好包含整数个基波周期。一旦窗口长度不是整周期首尾拼接处就会出现一个阶跃这个阶跃在频谱上会向两侧扩散把能量糊到邻近的频点上这就是频谱泄漏。5 次和 7 次谐波离基波不算远泄漏过来的能量足以让它们的幅值读数漂移十几个百分点。还有一层是栅栏效应。FFT 的频率分辨率是 fs/N只有正好落在 k·fs/N 这个格点上的频率才能被准确读出。如果 250Hz 不落在格点中心读出来的幅值是真实值乘以一个 sinc 包络的衰减系数而且这个系数随窗口滑动不断变化表现出来就是读数在跳。很多人给 FFT 加汉宁窗想压住抖动结果幅值整体偏小又得回头补一个窗函数增益系数越修越乱。根子上还是窗口长度的问题。第三个容易被忽略的点是转速。基波频率跟着转速走你用额定 50Hz 算出来的窗口长度在 1200r/min 工况下就不成立泄漏重新出现。所以整周期这件事不是配一次参数就完事得跟着基波频率动态算。2.2 把采样窗口卡到基波整周期我一般的做法是先固定工况把窗口长度对齐到基波周期确认检测链路本身没问题再去处理变速工况。下面这段参数配置可以直接放进模型的初始化回调里。% ---- FFT 采样窗口配置窗口长度必须是基波周期的整数倍 ---- f0 50; % 基波频率 Hz对应额定转速 Ts 1e-5; % 仿真步长 s采样频率 100 kHz fs 1/Ts; % 采样频率 N_T0 round(1/(f0*Ts)); % 一个基波周期内的采样点数这里等于 2000 Nfft N_T0; % 取单周期点数频率分辨率 fs/Nfft 50 Hz逻辑说明N_T0是基波一个周期里能采到多少个点把它直接作为 FFT 点数窗口时长就严格等于 20ms。此时频率分辨率 fs/Nfft 刚好等于 50Hz5 次谐波 250Hz 落在第 5 个频点上7 次 350Hz 落在第 7 个频点上能量全部集中在一个 bin 里不会向邻居泄漏。参数上唯一要动的是f0和TsTs改了N_T0自动跟着变不用手算。如果要更细的分辨率把Nfft取成2*N_T0或4*N_T0也就是截两个或四个完整基波周期。这时候分辨率变成 25Hz 或 12.5Hz5 次谐波落在第 10 或第 20 个频点上同样是对齐的。千万别取 1024、2048 这种“看起来整齐”的 2 的幂点数1024 点对应 10.24ms既不是整周期也不是半周期抖动就是从这儿来的。变速工况下窗口要在线重算下面这段放在每个采样步或每个控制周期里执行% ---- 变速工况根据当前电频率动态调整窗口长度 ---- p 4; % 极对数 n_rpm 1200; % 当前机械转速 f0_now p * n_rpm / 60; % 当前电频率这里等于 80 Hz N_T0 round(1/(f0_now*Ts)); % 当前基波周期的采样点数 Nfft floor(N_T0/64)*64; % 向下取整到 64 的倍数兼顾实时性参数说明极对数p必须和电机模型里配的一致配错了电频率整体偏移后面所有谐波频点全错。floor(N_T0/64)*64是为了让点数尽量规整代价是窗口不是严格整周期会残留少量泄漏但通常能压到 1% 以内。如果对精度要求高就别取整直接让Nfft N_T0用可变长度的缓冲实现。2.3 检测值可不可信用三步自检确认调补偿之前先确认检测通道本身是准的这一步能省掉后面大量的误判。我的习惯是绕开电机模型直接灌一个已知幅值和相位的合成信号进 FFT 模块看读出来的数对不对。% ---- 用已知信号自检 FFT 链路 ---- t (0:Nfft-1)*Ts; i_test 10*sin(2*pi*f0*t) ... 0.80*sin(2*pi*5*f0*t 0.30) ... 0.50*sin(2*pi*7*f0*t - 0.70); Y fft(i_test) * 2 / Nfft; % 乘 2 得到单边幅值谱 k5 5*f0*Nfft/fs 1; % 5 次谐波对应的 bin 下标MATLAB 从 1 开始 k7 7*f0*Nfft/fs 1; A5 abs(Y(k5)); P5 angle(Y(k5)); A7 abs(Y(k7)); P7 angle(Y(k7)); fprintf(5 次: %.3f A / %.1f deg\n, A5, rad2deg(P5)); fprintf(7 次: %.3f A / %.1f deg\n, A7, rad2deg(P7));逻辑说明合成信号的 5 次分量是 0.80A、相位 0.30rad约 17.2°7 次是 0.50A、相位 -0.70rad约 -40.1°。如果读出来幅值误差在 2% 以内、相位误差在 2° 以内检测链路就是可信的。fft后乘2/Nfft是为了把双边谱折算成单边幅值漏掉这个系数读出来的幅值只有真实值的一半很多人就是被这个系数坑到怀疑电机参数。第二个检查是看谱线是否落在 bin 中心。把abs(Y)在 5 次和 7 次附近几个点都打出来如果能量只集中在一个点上说明对齐了如果左右两个点各占一半说明频率正好卡在两个 bin 中间需要调整Nfft。第三个检查是对比滑窗 FFT 和理论值。真实模型里电流是时变的窗内幅值本身就在变读数有波动是正常的关键看波动幅度。稳态下如果 5 次谐波读数波动超过 10%就说明窗口或滤波环节还有问题别急着往下调补偿。3. 补偿后谐波不降反升反相 180° 失效的相位对齐排查检测确认准了把补偿量投进去本该往下走的谐波柱子纹丝不动甚至更高这是谐波注入补偿里最打击人的一类故障。绝大多数情况下不是算法写错了是补偿信号的相位在链路里被拖偏了等它到达电流环的时候已经不再是反相。3.1 理想反相在真实链路里会偏多少课本上写的是“注入一个与目标谐波幅值相等、相位相反的信号”。这里的相反指的是在电机绕组处相反而补偿信号从检测点到绕组要经过滤波器、坐标变换、电流环、PWM 调制和功率器件每一级都带延时和相移。把这些串起来实际到达绕组的补偿信号相位已经偏离理想值几十度。偏差有多大影响可以直接算。设残余谐波为 A·|1 - e^(jΔθ)| 2A·|sin(Δθ/2)|Δθ 是相位偏差。偏差 5° 时残余只剩 8.7%对应衰减 21dB这就是为什么正文里把 5° 当作验收线偏差 30° 时残余 51.8%只衰减 5.7dB看起来“补了但没效果”偏差 60° 时残余 100%等于没补偏差超过 90° 就是负优化谐波比不补还大。现场遇到的“越补越大”基本都是 Δθ 落在 90° 到 180° 之间。还有一层是检测环节自己引入的相移。带通滤波器在通带边缘有相位变化截止频率附近的群延时会把 5 次和 7 次信号分别拖后不同的角度。如果用 FIR 滤波器做检测线性相位还相对好算用 IIR 的话两个谐波频点的相移不一样一套统一的相位补偿角度根本盖不住。3.2 用二阶相位补偿网络把偏差拉回 5° 以内补偿通道里串一个相位校正环节是最直接的做法。一个二阶差分网络在 250Hz 到 350Hz 这个窄频段里能提供可控的超前量。function y phase_compensator(u) % 二阶相位补偿网络在 250~350 Hz 段提供可调的超前角 persistent x1 x2 y1 y2 if isempty(x1) x1 0; x2 0; y1 0; y2 0; end b [0.02, 0.02]; % 分子系数决定高频增益 a [1, -1.80, 0.81]; % 分母系数双极点半径 0.9 y b(1)*u b(2)*x1 - a(2)*y1 - a(3)*y2; x2 x1; x1 u; y2 y1; y1 y; end逻辑说明这是个标准的直接 II 型二阶 IIRx1、x2存输入历史y1、y2存输出历史。a(1)恒为 1所以计算式里只出现a(2)和a(3)这一点在抄代码时最容易写错写成a(1)*y1就整体发散。参数说明极点半径由sqrt(a(3))决定取 0.81 的平方根就是 0.9极点越靠近单位圆相位曲线在目标频率附近越陡可调范围越大但数值敏感性也越高。零点位置由-b(2)/b(1)决定这里等于 -1落在奈奎斯特频率上。这组系数不是唯一解也不该照抄。更工程化的做法是用一阶全通滤波器相位公式是闭式的容易反解参数function y allpass1(u, a) % 一阶全通H(z) (a z^-1)/(1 a*z^-1)|H| 1只改相位 persistent x1 y1 if isempty(x1) x1 0; y1 0; end y a*u x1 - a*y1; x1 u; y1 y; end参数说明在目标角频率 ω 处这个全通环节提供的相位是 φ -2·atan((1-a)/(1a)·tan(ω/2))。基波 50Hz、目标 250Hz 时 ω 2π·250·Ts 0.0157rad代入不同 a 值就能画出相位对照表。实际调的时候我先按计算值设一个 a跑扫频看残差再微调 ±0.02一般两三轮就能压到 5° 以内。一阶全通只在一个频点精确5 次和 7 次要分别串一个别指望一个环节同时校正两个频点。3.3 扫频测相位别信公式信实测从检测端到绕组端的真实相移靠手算很难算准PWM 延时、电流环带宽、滤波器群延时都在里面。我一般直接用单频相关法测总传函的相位比看 FFT 稳得多。% ---- 单频相关法测补偿通道总相位 ---- f_list [5*f0, 7*f0]; % 250 Hz 和 350 Hz N 20 * round(fs/f0); % 至少 20 个基波周期去掉暂态 for k 1:numel(f_list) f f_list(k); t (0:N-1)*Ts; u sin(2*pi*f*t); y lsim(H_total, u, t); % H_total检测端到注入端的总传函 num sum(y .* exp(-1j*2*pi*f*t)); den sum(u .* exp(-1j*2*pi*f*t)); fprintf(%d Hz 通道相位 %.1f deg\n, f, rad2deg(angle(num/den))); end逻辑说明用exp(-j2πft)对输出和输入分别做单点 DFT两者相除就是该频点的复频响取角度就是相移。这种方法只关心一个频点不受其他谐波和噪声的干扰比对着 FFT 谱线估相位可靠得多。参数说明N取 20 个基波周期是为了让暂态衰减干净如果电流环带宽低得加到 50 个周期。H_total可以把检测滤波、相位补偿、电流环闭环传函、PWM 延时串起来用series或connect求也可以直接在 Simulink 里打断点灌正弦测。测出来的角度如果和目标值差得多不要硬调补偿网络先回头查 1.5 个开关周期的数字延时是不是没算进去。10kHz 开关频率下1.5 个开关周期对应 150μs在 250Hz 上就是 13.5° 的滞后这个量级足以让补偿从有效变成无效。4. 5 次和 7 次一起补就打架双通道耦合的根因与隔离手段单补 5 次的时候 THD 从 8.2% 掉到 3.1%看着挺美把 7 次通道一开THD 反而回到 5.8%两个通道的补偿量还都在往上涨最后顶到限幅。这种“一加一小于一”的现象在双次谐波补偿里非常普遍根因是两个通道不是独立的。4.1 耦合从哪来三条共享路径第一条是电压指令叠加。两个谐振控制器并联在同一个 q 轴电压指令上5 次通道的输出会被 7 次通道当作扰动去抑制7 次通道的输出同样会被 5 次通道追着调形成一个正反馈的拉锯。谐振控制器在谐振点附近的增益很高两个高增益环节共用一个执行器稳定性裕度会被吃掉一大块。第二条是检测带宽重叠。如果用带通滤波器提取 5 次和 7 次分量带宽设到 ±50Hz5 次通道的通带就盖到了 300Hz把 6 倍频的脉动也放进来。7 次通道反过来也会捡到 5 次泄漏过来的能量两个通道的“检测值”互相污染补偿方向自然就乱了。第三条是坐标变换的交叉耦合。5 次谐波是负序分量在同步旋转坐标系下表现为 -6 倍频7 次是正序表现为 6 倍频。两者在 dq 轴上都是 6 倍频脉动只是旋转方向相反。如果你用同一个低通滤波器去分离两个方向的脉动会混在一起分不干净。4.2 带通和陷波把两个通道关进隔离舱最省事的隔离手段是给每个检测通道配一个窄带带通带宽压到 20Hz 以内让 5 次和 7 次的通带完全不重叠。% ---- 5 次、7 次检测用窄带带通隔离 ---- fs 1/Ts; bw 20; % 带宽 20 Hz覆盖转速 ±5% 波动 [b5, a5] iirpeak(5*f0/(fs/2), bw/(fs/2)); % 中心 250 Hz [b7, a7] iirpeak(7*f0/(fs/2), bw/(fs/2)); % 中心 350 Hz % 离线分析用 filtfilt 做零相位滤波避免检测通道自己带相移 i5 filtfilt(b5, a5, i_alpha); i7 filtfilt(b7, a7, i_alpha);逻辑说明iirpeak生成的是二阶峰值滤波器Wo是归一化中心频率实际频率除以奈奎斯特频率BW是归一化带宽。中心 250Hz、带宽 20Hz意味着通带大致覆盖 240Hz 到 260Hz7 次谐波 350Hz 完全在阻带里两个通道互不干扰。参数说明bw别超过 30Hz太宽会把相邻次谐波和基波泄漏一起抓进来也别低于 10Hz否则转速稍有波动谐波就跑出通带检测值直接掉零。filtfilt是零相位滤波正反各滤一遍相位完全抵消代价是需要整段数据只能离线用。实时仿真里只能用单向滤波这时检测通道会引入相位滞后得用第 3 章的方法补回来。我一般的处理是实时模型里用单向 IIR 带通把它的群延时算进相位补偿角里一起校正。除了带通在每个补偿通道的输出前再串一个陷波器把对方频点的能量挡掉相当于给两个通道各加一道防火墙。陷波器的 Q 值取 5 到 10太高的 Q 对参数漂移太敏感转速一变就失谐。4.3 谐振控制器参数整定先单后双两个通道都靠准比例谐振控制器生成补偿电压参数整定顺序直接决定能不能收敛。function Gr pr_resonant(fh, Kr, wc) % 准比例谐振控制器fh 谐振频率 HzKr 谐振增益wc 截止带宽 rad/s s tf(s); w0 2*pi*fh; Gr (2*Kr*wc*s) / (s^2 2*wc*s w0^2); end % 整定顺序先只开 5 次通道收敛后再并联 7 次 Kr5 0.10; wc5 10; R5 pr_resonant(5*f0, Kr5, wc5); Kr7 0.08; wc7 10; R7 pr_resonant(7*f0, Kr7, wc7);逻辑说明准 PR 控制器在谐振频率 w0 处增益接近 Kr离开谐振点后增益迅速衰减所以它只对目标次谐波“使劲”不会干扰直流分量。分母里的2*wc*s是阻尼项wc越大谐振峰越宽对频率漂移的容忍度越高但选择性变差。参数说明wc取 5 到 15rad/s 比较合适对应 0.8Hz 到 2.4Hz 的带宽能覆盖转速的小幅波动。Kr的量级可以用 1/(2π·fh·L) 估一下电感 8.5mH、目标 250Hz 时算出来约 0.075实际从 0.1 起调边加边看 THD 和电流纹波。整定顺序上我坚持先单通道跑到稳态记录 THD 和补偿电压峰值再开第二个通道。两个通道同时从零开始加增益很容易在中间某个时刻互相激励起来波形看着像随机振荡根本分不清是谁的问题。如果双通道运行后仍然不收敛把 7 次通道的Kr降到 5 次的一半再试先保证稳定再慢慢把增益补回去。5. 避坑清单五条谐波补偿踩坑记录和现场处置下面这五条是调试过程中反复出现的每条我都按“看到什么现象、根因在哪、怎么处置”记下来方便对号入座。5.1 突加载就过调制相电流削顶现象负载从零突加到额定相电流波形顶部被削平转速环输出顶在限幅上THD 从 3% 恶化到 9%仿真里能看到补偿电压和基波电压叠加后超过了母线能支撑的范围。原因谐波补偿电压是在基波电压之上叠加的稳态时两者相位关系还算温和突加载瞬间基波电压已经接近调制上限补偿量再叠上去就进入过调制区。过调制会让实际输出的电压波形畸变产生新的低次谐波反过来又激励补偿通道形成恶性循环。解决在 PWM 生成前加幅值限幅加斜率限制把合成后的电压指令约束在线性调制区内。% ---- 基波与补偿电压合成后的动态限幅 ---- Vdc 380; % 母线电压 V Vmax 0.95 * Vdc / sqrt(3); % 线性调制区上限留 5% 裕量 Tsw 1e-4; % 开关周期对应 10 kHz rate Vmax / (0.5*Tsw); % 允许的电压变化率 persistent V_prev if isempty(V_prev) V_prev 0; end V_raw V_ref V_comp; % 基波 谐波补偿 V_lim min(max(V_raw, -Vmax), Vmax); % 先做幅值限幅 dV min(max(V_lim - V_prev, -rate*Ts), rate*Ts); % 再做斜率限制 V_out V_prev dV; V_prev V_out;逻辑说明Vmax取母线电压除以根号三再乘 0.95是 SVPWM 线性调制区的常用上限留 5% 裕量给死区和管压降。斜率限制的作用是防止限幅瞬间电压指令跳变跳变会在电流里激起高频振荡。参数说明rate取Vmax/(0.5*Tsw)意思是半个开关周期内最多走完整个线性区这个值可以根据实际动态响应要求调紧或放松。5.2 转速一变谐波就跑出检测带现象额定转速下补偿效果很好升到 1200r/min 后 5 次谐波读数掉了一半补偿量跟着变小THD 反弹。原因带通滤波器的中心频率是按 50Hz 基波写死的转速升到 1200r/min、极对数 4 时电频率变成 80Hz5 次谐波从 250Hz 移到 400Hz直接掉出 20Hz 带宽的通带检测值自然塌掉。解决把基波频率作为变量实时传给滤波器和谐振控制器系数在线重算。% ---- 谐振频率跟随转速在线更新 ---- p 4; % 极对数必须与电机模型一致 n_rpm 1200; % 当前转速 f0_now p * n_rpm / 60; % 电频率这里等于 80 Hz R5 pr_resonant(5*f0_now, Kr5, wc5); % 谐振点从 250 Hz 移到 400 Hz R7 pr_resonant(7*f0_now, Kr7, wc7); % 谐振点从 350 Hz 移到 560 Hz参数说明p和n_rpm的乘积除以 60 得到电频率这是标准换算关系别把机械角速度和电角速度搞混。在线重算的频率不建议每个仿真步都做按 1ms 或 10ms 周期更新一次就够tf对象的创建有开销每步重建会拖慢仿真。如果嫌在线重算麻烦另一种做法是用 5 倍频、7 倍频的旋转坐标变换提取谐波再用低通滤波取直流分量。这种方法的检测中心频率天然跟着电角度走转速变化时不需要重算任何系数。5.3 两个通道互相喂饭越补越乱现象单独开 5 次通道THD 从 8.2% 降到 3.1%再开 7 次通道THD 回到 5.8%两个通道的补偿电压都在缓慢爬升最后顶到限幅。原因两个 PR 控制器并联在同一电压指令上互相把对方的输出当作扰动去抑制检测带通带宽过宽两个通道的输入信号互相污染。解决检测端带宽压到 20Hz 以内输出端各串一个对方频点的陷波器整定时先单通道收敛再并联。这三条做完还不收敛就把 7 次通道的增益降到 5 次的一半先保证系统稳定再看能补多少。5.4 改了开关频率相位补偿全废现象10kHz 开关频率下相位补偿调得挺好改成 8kHz 后补偿效果断崖式下降谐波幅值反而上升。原因采样、零阶保持、PWM 更新合起来大约有 1.5 个开关周期的等效延时这个延时折算成相位角是随开关频率变化的。10kHz 时 150μs 在 250Hz 上对应 13.5°8kHz 时变成 16.9°固定的相位补偿角盖不住这 3.4° 的差值。解决把延时折算成角度跟着开关频率在线算。% ---- 数字延时对应的相位滞后随开关频率变化 ---- Tsw 1/fsw; % 开关周期 Td 1.5 * Tsw; % 采样 零阶保持 PWM 等效延时 for fh [5*f0_now, 7*f0_now] phi_delay 2*pi*fh*Td; % 延时在目标频点上的相位滞后rad % 该角度要叠加进补偿通道的相位校正量里 end参数说明1.5 这个系数是平均值单采样单更新时取 1.5双采样双更新时可以取 0.75具体要看模型里的采样和更新配置。把算出来的phi_delay和扫频实测的通道相位相加才是最终要补的总角度。5.5 只盯 THD掩盖了时域尖峰现象THD 从 8% 降到 2%看着很漂亮但相电流峰值比补偿前高了 40%长时间跑下去电机模型里的铜耗明显上升。原因谐波补偿在频域上压低了 5 次和 7 次分量但时域上补偿信号和基波叠加后可能形成尖峰尤其是相位没完全对齐的时候。THD 是个全局指标对局部尖峰不敏感只看它容易被骗。解决验收时同时看四个量THD、相电流峰值、有效值、dq 轴电流纹波。四个量里任何一个恶化超过 10%就说明补偿参数还没调到位别急着收工。6. 快速定位二十分钟跑完的谐波补偿排查顺序谐波补偿模型的故障排查最怕一上来就盯着总波形看。总波形里所有环节的输出都叠在一起看不出是谁的问题。我现在的固定顺序是逐级打断点、逐级验证二十分钟能过一遍。第一步先验检测。断掉补偿通道只留 FFT灌合成信号自检看幅值和相位误差。这一步不过关后面所有调试都是白费。第二步开环注入单频信号只留 5 次通道看补偿信号到达电流环时的相位偏差有多大。第三步闭环单通道把 5 次的 THD 贡献压下去记录补偿电压峰值。第四步再开 7 次通道观察两个通道的输出是否互相爬升。最后才加上突加载和变速工况验证限幅和前馈。下面这张表是我贴在工位上的对照表看到症状先查对应信号现象先查哪个信号大概率原因5 次 7 次幅值读数跳动FFT 窗口长度与谱线位置窗口不是基波整周期频谱泄漏补偿投了没效果补偿通道总相位偏差相位偏 30° 到 60°衰减不足 5dB补偿后谐波变大相位偏差是否超过 90°反相失效变成本文还有配套的精品资源点击获取