☰
永磁同步电机5/7次谐波抑制Simulink仿真与相位对齐
2026/11/3 5:43:31 网站建设 项目流程

简介:面向电机控制与电力电子研发人员的PDF文档,聚焦永磁同步电机5次、7次电流谐波注入补偿的Simulink仿真实现。内容从气隙磁场非正弦、齿槽效应等谐波成因切入,说明谐波对转矩脉动、效率与温升的影响,并给出谐波检测、反相注入、闭环控制与仿真对比的完整建模思路。资源包共1个PDF文件,约115KB,便于在电脑端直接查阅与对照复现。已有51人学习,适合需要优化PMSM电流质量的中高级技术人员参考。文档还包含FFT与旋转坐标变换的谐波提取代码、相位补偿与带通滤波器应用、PI控制器参数配置,以及电压限幅保护和补偿量限制等工程注意事项,可帮助读者把理论方案落到Simulink模型中,结合频谱对比验证补偿前后5次、7次谐波幅值变化,提升谐波抑制效果与运行稳定性,并增强工程实现的可操作性。

1. 一根 250Hz 的柱子,比波形上的毛刺更值得盯

调一台 3kW 的永磁同步电机,示波器上电流波形看着还算圆,一上 FFT 就露馅:基波旁边 250Hz 和 350Hz 两根柱子明晃晃立着。转矩脉动、机壳发热、低速段的嗡嗡声,多半就是这两根柱子干的。这套 Simulink 模型要做的事很直接——在电机控制环里另搭一条补偿通道,把 5 次、7 次电流谐波检测出来,生成幅值相等、相位相反的信号,再送回电流环,把它们压下去。它面向的是已经能把 FOC 双闭环跑起来、却被电流 THD 和转矩脉动卡住的电机控制从业者,也适合刚接触永磁同步电机谐波抑制仿真的学生。谐波抑制并不神秘,每一步都有参数、有波形、有能够对照的频谱。5 次和 7 次也不会平白无故消失,关键在于搞清楚它们在哪个坐标系里长什么样。

2. 谐波从哪来、怎么被揪出来:从 abc 到 5 倍旋转坐标系的分离链路

2.1 5 次和 7 次为什么总成对出现

永磁同步电机的气隙磁密本来就不是标准正弦。永磁体充磁不均、定子绕组分布不是连续正弦、齿槽效应让磁导周期性起伏,再加上逆变器死区带来的电压畸变,几条因素叠在一起,定子电流里就长出了 5 次、7 次这些低次谐波。它们在 abc 三相坐标系里不是随便分布的:5 次是负序分量,三相互差 -120°;7 次是正序分量,三相互差 +120°。这个正负序的区别,直接决定后面坐标变换时角度该取正还是取负。

到了同步旋转的 dq 坐标系里,情况变得很规整:5 次谐波相对转子以 -6 倍电角速度转,7 次以 +6 倍电角速度转,两者在 dq 上都变成 6 倍基频的交流量,频率对称、幅值相近。这就是为什么很多工程做法只用一条 6 倍频谐振控制器,就能同时压住 5 次和 7 次。我一般的顺序是:先用两条独立通道把 5 次、7 次拆开调,看清每个通道对哪根频谱柱子起作用,跑通之后再决定要不要合并成单条 6 倍频通道。单通道计算量小,但两个谐波的补偿增益绑在一起,调参时互相牵扯;双通道能单独改增益、单独限幅,定位问题时方便得多,代价是多一份滤波和一份坐标变换开销。

需要提前明确的是:5 次谐波在 abc 系是负序,做旋转坐标变换时角度要取 -5θe,不是 +5θe。这一点在后面 5.2 会展开,也是很多人第一次做谐波提取时最常见的问题——变换方向取反,提取出来的分量幅值始终很小,补偿加进去毫无反应,还以为是增益不够。

2.2 先把参数落进脚本,别散落在模块对话框里

Simulink 模型最容易失控的地方,是参数散落在几十个模块的对话框里,改一个电感要翻五个地方。常规做法是建一个pmsm_params.m脚本,用InitFcn或者 Model Properties 里的回调统一加载,所有模块只引用变量名。下面这组参数对应一台 3kW、1500rpm、极对数 2 的表贴式永磁同步电机,电频率正好 50Hz,5 次和 7 次就落在 250Hz、350Hz。

% pmsm_params.m —— 仿真基础参数,统一由模型回调加载 p = 2; % 极对数,1500rpm 对应电频率 50Hz Pn = 3000; % 额定功率 W Vn = 380; % 额定线电压 V fn = 50; % 额定电频率 Hz Rs = 2.875; % 定子相电阻 Ω Ld = 8.5e-3; % d 轴电感 H Lq = 8.5e-3; % q 轴电感 H,表贴式取 Ld = Lq psi_f = 0.175; % 永磁体磁链 Wb Vdc = 540; % 直流母线电压 V fsw = 10000; % 开关频率 Hz Tdead = 2e-6; % 逆变器死区 s Ts = 1e-5; % 仿真步长 s,取开关周期的 1/10

Ts取 1e-5 是常见选择:开关频率 10kHz 对应开关周期 100μs,步长取十分之一既能看清 PWM 边沿,又不至于把仿真拖到跑一晚上。死区Tdead单独列出来,是因为它对 5 次、7 次谐波的贡献很直接——死区造成的电压误差每周期出现六次,频谱上正好落在 6 倍频附近,跟电机本体谐波混在一起。做对比仿真时,可以先关掉死区看本体谐波有多大,再打开死区看总畸变涨了多少,心里就有数了。

参数表里最容易被忽略的是psi_f和Ld/Lq的匹配。磁链给大了,同样的电流指令下转矩偏大,工作点偏离额定,谐波占比跟着变;Ld、Lq填错,d 轴和 q 轴的交叉耦合对不上,电流环本身就带稳态误差,后面再谈谐波抑制就是空中楼阁。我一般会先跑一个空载稳态,看 id 是否收敛到 0、iq 是否稳定在给定值,两个都稳了再往下接谐波通道。

2.3 用 5 倍、7 倍电角度做定点提取

谐波提取有两条路:一条是在 dq 系里用 6 倍频滤波器直接捞,另一条是在 αβ 系里用 5 倍、7 倍旋转坐标变换把目标谐波转成直流量。后一条路物理意义更清楚,也方便单独观察某一次谐波,模型里我两个都留了,调试阶段用旋转坐标,定型后切成 6 倍频单通道。

function [i5d, i5q, i7d, i7q] = harmonic_sep(ia, ib, ic, theta_e) % 等幅值 Clarke 变换,把三相电流送到 αβ 系 i_alpha = (2/3)*(ia - 0.5*ib - 0.5*ic); i_beta = (2/3)*(sqrt(3)/2)*(ib - ic); % 5 次为负序,旋转方向取 -5*theta_e,转完变成直流量 c5 = cos(-5*theta_e); s5 = sin(-5*theta_e); i5d = c5*i_alpha + s5*i_beta; i5q = -s5*i_alpha + c5*i_beta; % 7 次为正序,旋转方向取 +7*theta_e c7 = cos( 7*theta_e); s7 = sin( 7*theta_e); i7d = c7*i_alpha + s7*i_beta; i7q = -s7*i_alpha + c7*i_beta; end

这段函数的逻辑分两层。第一层 Clarke 用等幅值形式,系数 2/3,变换后 αβ 的幅值等于三相相电流峰值,后面算出来的谐波幅值不需要再乘系数换算。第二层是两次旋转:theta_e是电角度,乘 -5 还是 +7 由谐波序决定。5 次负序意味着它在空间上逆着基波转,用 -5θe 去追它,相对转速为零,交流量就被压成了直流;7 次正序同理,用 +7θe 追。如果序取反了,相对转速变成 10 倍或 14 倍,输出还是交流,后面的低通滤波器根本滤不出稳定值。

变换完只是第一步,i5d/i5q里还混着基波和其他次谐波泄漏过来的交流分量,通常要跟一级低通或者复矢量带通,把直流量提纯。低通的截止频率按 6 倍基频以下取,50Hz 基频时 300Hz 是分界线,截止频率放到 100Hz 左右比较稳妥;放太低,电机转速一变,谐波频率跟着漂,滤波器跟不上;放太高,6 倍频的交流分量漏过来,提取值会以 6 倍频抖动,补偿信号跟着抖。这一级滤波器的相位滞后要在第 4 章的相位对齐里一并算进去,不能只在检测环节图省事。

3. 检测环节怎么做实:FFT 整周期截断、复矢量带通与滤波器选型

3.1 实时 FFT 的窗口长度必须是基波周期整数倍

仿真里看频谱,很多人直接开个 Spectrum Analyzer 或者用fft一把梭,看到峰值就下结论。真到闭环里做实时检测,窗口长度没取对,幅值会像跳舞一样上下飘,补偿量跟着飘,电流波形反而更难看。根子在频谱泄漏:窗口里装的不是整数个基波周期,首尾不连续,能量会往邻近频点摊开,5 次、7 次的峰值读出来偏小,边上的频点读出来偏大。

fs = 1/Ts; % 采样频率 100 kHz L1 = round(fs/f_base); % 一个基波周期的采样点数,50Hz 时是 2000 Nfft = 4*L1; % 取 4 个整周期,8000 点 win = hann(Nfft); % 加窗抑制截断效应,用于显示;闭环检测用矩形窗 X = fft(i_a_windowed .* win, Nfft) / Nfft * 2; f = (0:Nfft-1) * fs / Nfft; idx5 = round(5*f_base / (fs/Nfft)) + 1; idx7 = round(7*f_base / (fs/Nfft)) + 1; amp5 = abs(X(idx5)); amp7 = abs(X(idx7));

关键在L1和Nfft这两行。一个基波周期 20ms,采样 100kHz 就是 2000 点,窗口取 2000 的整数倍,首尾才接得上。常见的错误写法是「取最近的 1024 的整数倍」,算出来 2048 点,对应 20.48ms,差了 0.48ms,频谱上 250Hz 和 350Hz 的读数就会随起始相位摆动,幅度能差百分之十几。这种漂移放在开环分析里忍忍就过去了,放进闭环补偿里,等于给系统加了个低频扰动源。

加窗是另一个取舍。显示频谱时加 Hanning 窗能把泄漏压下去,峰值更干净,但窗函数本身会削弱幅值,读数要乘补偿系数;闭环检测环节一般直接用矩形窗配整周期截断,幅值准、不用补偿,代价是对窗口对齐要求更严。两条路不要混用——见过有人在闭环里加了 Hanning 窗却按矩形窗的系数换算,补偿量系统性偏小 50%,调了两天增益,最后发现是窗的问题。

3.2 复矢量带通:一次把 id、iq 两路处理掉

如果不想每个控制周期都做一次 FFT,可以改用复矢量带通。把 dq 两路电流拼成复数id + 1j*iq,一个滤波器同时处理两路,计算量省一半,相位一致性也更好。离散实现用单极点复谐振器就够了,代码短,参数只有一个带宽。

function y = cv_bandpass(u, f0, bw, Ts) % u 为复信号 id + 1j*iq,f0 为中心频率,bw 为单边带宽 Hz persistent z rho w0 if isempty(z) z = 0; w0 = 2*pi*f0; rho = exp(-pi*bw*Ts); % 极点半径由带宽决定 end % 单极点复积分器:极点落在 exp(j*w0*Ts),只放大 f0 附近分量 z = rho * exp(1j*w0*Ts) * z + (1-rho) * u; y = z; end

这段的状态变量z是复数,极点固定在单位圆内rho倍处,角度是w0*Ts,所以它只对中心频率f0附近的分量有增益。rho越接近 1,通带越窄、选择性越好,但群延迟越大,收敛也越慢。换算关系是rho = exp(-pi*bw*Ts),想要 20Hz 单边带宽,rho大约 0.99937,群延迟约 1/(π·20) ≈ 16ms。16ms 在 250Hz 上就是 4 个整周期,相位滞后 1440°,折算到补偿环节必须补回来,否则就是 5.2 里那种「补了等于没补,甚至更糟」的情况。

带通中心频率不是固定的。电机转速一变,基波频率跟着变,5 次、7 次的绝对频率也变。所以f0不能写死成 250 和 350,要用f_base = p*n/60实时算,再把5*f_base、7*f_base喂给滤波器。这行前馈在恒速工况下看不出差别,一到加减速就体现出来了:不跟频率,谐波跑出通带,补偿通道输出掉零,电流 THD 在加速段反而比不补还高。

3.3 滤波器类型与阶数的取舍

FIR 和 IIR 的取舍在论文里能写一章,工程上就看两条:相位可控性和算力。FIR 能做到严格线性相位,群延迟是常数(N-1)/2 * Ts,补偿时直接把注入信号整体延时同样的拍数就能对齐,不用逐频率查表;代价是阶数高,要做出 20Hz 带宽、60dB 抑制,抽头数轻松上百,放在 10kHz 的控制中断里跑,一个周期几千次乘加,普通 MCU 扛不住。

IIR 阶数低,二阶就能做出很窄的带通,算力友好,但相位是非线性的,群延迟随频率变,5 次和 7 次要分别算各自的滞后,补偿时得分开处理。做仿真阶段两种都无所谓,反正算力不要钱;真要往控制器上搬,我一般先用二阶 IIR 定型,把相位表离线扫出来做成插值,再评估 FIR 方案是不是有必要。

还有一条容易忽略:滤波器阶数越高,启动时的瞬态越长。仿真从 0 时刻起跑,前几十毫秒滤波器输出还没收敛,如果这段时间补偿通道已经投入,等于往电流环里灌了个错误的补偿量,轻则波形畸变,重则触发过流。常见做法是加一个使能延时,等滤波器状态稳定、转速进入目标区间再放开补偿输出,延时时间按滤波器群延迟的 3 到 5 倍给。

4. 补偿通道怎么搭:谐振控制器、相位对齐与电压限幅

4.1 谐振控制器的传递函数别写反

补偿环节的核心是一个在目标频率上增益极高、其他频率上增益接近零的控制器。理想谐振器的传递函数是s/(s²+ω0²),实际实现要加阻尼,变成2·Kr·ωc·s / (s² + 2·ωc·s + ω0²)。分子是一次项,分母是二次项,这样在 ω0 处增益约等于Kr,相位从 +90° 平滑过渡到 -90°。

网上流传的一段写法是把分子分母写成同一个式子,比如tf([1 0 250^2], [1 0 250^2]),那是一个全通滤波器,幅频特性在所有频率上都是 1,除了改相位什么都不做。把它当成谐振器接进补偿通道,现象就是「补偿信号幅值跟输入一模一样,但电流谐波一点没降」,调增益调到最大也没用,因为增益本来就是 1。这个坑不少人踩过,而且因为模型不报错、波形也看着正常,特别难往传递函数上想。

s = tf('s'); f0 = 6*f_base; % 6 倍频,50Hz 基频时是 300Hz w0 = 2*pi*f0; wc = 2*pi*3; % 阻尼带宽,决定选择性和稳定裕度 Kr = 45; % 谐振增益,先给 30~60 之间 Gres = (2*Kr*wc*s) / (s^2 + 2*wc*s + w0^2); opt = c2dOptions('Method','tustin','PrewarpFrequency',w0); Gres_d = c2d(Gres, Ts, opt); % 预畸变离散化,保证 300Hz 处频率不偏

Kr决定补偿力度,wc决定这条谐振峰有多宽。Kr从 30 往上加,THD 会先快速下降,过了某个点再往上加,下降变缓,同时相位裕度开始吃紧,电流出现低频振荡。我一般先取Kr=30跑稳态,测 THD,再以 10 为步长往上试,看到 THD 曲线拐平就停手。wc不要贪窄,3 到 5Hz 是比较稳的区间;窄到 1Hz,转速稍有波动,谐振点就偏了,补偿效果断崖式下滑;宽到 20Hz,把邻近的 5 倍频分量也一起放大,反而引入新的畸变。

c2d里那个PrewarpFrequency值得单独说。双线性变换在离散化时会把频率轴压缩,越靠近奈奎斯特频率偏得越多。300Hz 相对 100kHz 的采样率不算高,影响有限,但 7 次 350Hz、甚至更高转速下的 6 倍频 600Hz,不预畸变就会出现谐振点偏移,实际补偿的频点和目标差几赫兹,效果打折扣。这一行加上去不花什么成本,建议默认带上。

4.2 相位对齐:检测链路吃掉的相位要还回来

补偿通道里最容易翻车的一环是相位。幅值算对、频率对、方向对,只要相位差了 180°,补偿就从「抵消」变成「叠加」,谐波幅值直接翻倍。整个检测链路串起来有多少相位滞后,得一项一项算:Clarke/Park 变换本身不引入滞后;低通或带通滤波器按群延迟算,20Hz 带宽的复带通在 250Hz 上滞后约 1440°;采样和 PWM 更新有一拍到两拍的延迟,10kHz 控制频率下一拍 100μs,250Hz 上就是 9°;再加上检测到输出之间可能还有一个控制周期的计算延时。几项加起来,250Hz 上滞后几十度到上百度都正常。

% 离线扫频,得到检测链路在 5 次、7 次频率上的总相位滞后 f_scan = 200:2:400; [~, ph] = bode(Gsense_d, 2*pi*f_scan); ph = squeeze(ph); % 单位:度,负值表示滞后 lag5 = interp1(f_scan, ph, 5*f_base); % 5 次频率处的滞后 lag7 = interp1(f_scan, ph, 7*f_base); % 7 次频率处的滞后 % 生成注入信号时把滞后补回来,并叠加上反相 t = 0:Ts:0.5; inj5 = amp5 * sin(2*pi*5*f_base*t + ph5_ref + 180 - lag5); inj7 = amp7 * sin(2*pi*7*f_base*t + ph7_ref + 180 - lag7);

Gsense_d是检测链路从三相电流采样到滤波器输出的离散传递函数,可以离线在 MATLAB 里串起来算,也可以在 Simulink 里用小幅值正弦注入实测。180那一项是反相,-lag5是把链路吃掉的相位补回来,两项符号必须都对。调试时不用一上来就接闭环,先把补偿通道断开,单独给检测链路灌一个 250Hz 已知相位的正弦,看输出相位差多少度,把这个数填进去,再闭环。这一步花十分钟,能省掉后面两小时的瞎调。

判断相位对不对,有个很土但有效的办法:看补偿投入瞬间的电流波形。相位正确时,5 次谐波分量在投入后一到两个周期内单调衰减;相位反了,会看到波形先「鼓」一下再慢慢收敛,甚至不收敛。用示波器触发在投入时刻,放大看两三个周期,比看频谱快得多。

4.3 注入点选电压还是电流给定

谐波补偿信号加在哪里,效果差别很大。加在电流给定上,等于让电流环去跟踪一个 6 倍频的交流指令,而电流环的带宽通常只有几百赫兹到 1kHz,对 250Hz、350Hz 的指令跟踪能力有限,幅值衰减、相位滞后,补进去的量被 PI 吃掉一大半。加在电压指令上,绕过电流环的动态限制,直接作用到逆变器输出,响应快、幅值准,是更常见的做法。

具体接法是:检测到的 5 次、7 次电流谐波送进谐振控制器,输出补偿电压u_comp_d、u_comp_q,与电流环 PI 的输出相加,再送反 Park 变换和 SVPWM。注意是相加还是相减,取决于你的检测量和控制器符号约定,接反了就是 5.2 里那条「越补越大」。

% 电压指令叠加与限幅 u_d_ref = u_d_pi + u_comp_d; u_q_ref = u_q_pi + u_comp_q; Umax = 0.95 * Vdc / sqrt(3); % SVPWM 线性区相电压峰值 u_mag = sqrt(u_d_ref^2 + u_q_ref^2); if u_mag > Umax scale = Umax / u_mag; % 等比例缩放,保持电压矢量角度 u_d_ref = u_d_ref * scale; u_q_ref = u_q_ref * scale; end

限幅这一块是保命用的。谐波补偿在稳态下幅值不大,但突加负载、转速阶跃时,谐振控制器会短时输出很大的补偿量,叠加到电压指令上就可能冲出 SVPWM 线性区,进入过调制,电流畸变加剧,严重时功率器件过热。等比例缩放比逐轴限幅好,因为逐轴限幅会改变电压矢量的角度,d、q 轴耦合下相当于给了一个错误方向的电压。0.95这个系数留了 5% 余量给死区补偿和采样误差,别取满。

限幅之后还要处理积分饱和。电压被限住了,但谐振控制器内部状态还在继续积分,等工况恢复,它会带着一大坨积累量冲出来,电流猛地抖一下。常见做法是把限幅后的差值反馈回控制器输入端做抗饱和,或者简单一点,在限幅动作时冻结谐振控制器的状态更新,等退出限幅再放开。仿真阶段先把这套逻辑搭上,别等上了台架才发现。

5. 避坑与排查:五个让补偿越补越乱的真实翻车点

5.1 相位和方向类

现象:补偿通道投入后,5 次谐波幅值不降反升,从 1.3A 涨到 2.1A,电流波形上的毛刺更密。把补偿增益调小,涨幅变小;调到零,恢复正常。

原因:注入信号和原始谐波同相,等于叠加。方向错在三个地方之一:反相的 180° 没加,检测链路的相位滞后没补,或者 5 次谐波的旋转方向取成了 +5θe 导致提取出的分量本身就带了错相位。

解决:断开闭环,给检测链路单独灌 250Hz 已知相位正弦,实测输出相位差;把180 - lag5写进注入表达式;检查harmonic_sep里 5 次那两行的角度符号。三处对齐后,投入瞬间的波形应该是单调衰减,不是先鼓后收。

5.2 提取和滤波类

现象:5 次谐波提取值的幅值一直在 0.4A 到 1.5A 之间缓慢摆动,周期大约几百毫秒,补偿量跟着摆,电流 THD 忽高忽低。

原因:FFT 窗口不是基波周期整数倍,频谱泄漏导致每次计算的幅值随窗口起始相位变化;或者旋转坐标变换的角度用了5*theta_e而非-5*theta_e,负序分量没被转成直流,输出的是一个 10 倍频的交流量,低通滤不干净。

解决:窗口长度按round(fs/f_base)的整数倍取,不用 2 的幂次凑;核对 Clarke 变换的定义和电流正方向,用一组已知幅值相位的 5 次谐波注入测试,看提取值是否是稳定直流、幅值是否对得上。对不上就换符号再试,这一步别靠猜。

5.3 控制器和保护类

现象:谐振控制器接进去以后,电流出现 300Hz 附近的等幅振荡,越调增益振荡幅度越大,最后触发过流保护。

原因:谐振控制器的传递函数分子分母写成了同一个式子,成了全通;或者Kr给得太大、wc给得太窄,相位裕度被吃光;也可能是离散化没做预畸变,谐振点实际偏到了 290Hz,控制器在 300Hz 上没有增益,反而在邻近频点放大了噪声。

解决:先确认传递函数是2·Kr·wc·s / (s² + 2·wc·s + ω0²),分子一次项、分母二次项;Kr从 30 起调,wc不低于 3Hz;c2d带上PrewarpFrequency。振荡已经起来时,先断补偿,确认基波电流环本身稳定,再接回来。

现象:仿真跑到 0.3s 突加负载,电流瞬间冲到额定值的两倍多,示波器上电压指令已经贴住限幅,波形削顶。

原因:补偿电压和 PI 输出直接相加,没有限幅;或者限幅做了但没有抗饱和,谐振控制器状态在限幅期间持续累积,负载恢复后冲出来。

解决:在反 Park 之前加等比例限幅,Umax取0.95*Vdc/sqrt(3);限幅动作时冻结谐振控制器状态,或把限幅差值反馈回输入端。突加负载的仿真一定要跑,这是最容易暴露限幅问题的地方。

现象:单独抑制 5 次时效果很好,THD 从 8% 降到 3%;把 7 次通道也打开,两个谐波都只降了一半,THD 卡在 6% 下不去。

原因:两条补偿通道在 dq 系里都落在 6 倍频附近,输出叠加后总幅值超出电压余量,被限幅削掉一部分;或者两条通道的相位补偿用了同一个滞后值,7 次通道实际相位没对齐,起了反作用。

解决:两条通道各自算相位滞后、各自限幅,再在电压指令上做总限幅;先把 5 次调到满意,冻结 5 次通道参数再调 7 次,避免两个变量同时动。

6. 从跑通到跑准:扫频验相位、工况扫描与一组对比数据

仿真能出波形只是及格线,能说清「为什么有效、在什么范围内有效」才算跑准。我习惯在定稿前做三件事:扫频验相位、多工况扫描、把数据导出来自己算一遍 THD,不只看示波器上的频谱仪读数。

6.1 扫频验相位

把检测链路单独拎出来,输入端灌 200Hz 到 400Hz 的小幅值正弦,逐点记录输出与输入的相位差,做成表。重点看 250Hz 和 350Hz 两个点,与模型里填的lag5、lag7对比,偏差超过 5° 就说明补偿链路里有一级滤波器的参数改了没同步更新。

f_test = 200:10:400; ph_meas = zeros(size(f_test)); for k = 1:numel(f_test) [~, ph] = bode(Gsense_d, 2*pi*f_test(k)); ph_meas(k) = squeeze(ph); end err5 = ph_meas(f_test==250) - lag5; err7 = ph_meas(f_test==350) - lag7; assert(abs(err5) < 5 && abs(err7) < 5, '相位补偿表与实际链路不符,检查滤波器参数');

这段断言放在初始化脚本里,改滤波器参数时如果忘了同步相位表,仿真直接报错,比跑完再看波形发现问题省事得多。

6.2 多工况扫描

单点工况的对比数据好看,不代表全速域有效。我一般扫四到五个转速点,每个点记录补偿前后的 5 次、7 次幅值和总 THD,做成表看趋势。

转速 rpm基波频率 Hz补偿前 THD补偿后 THD5 次幅值 A(前/后)7 次幅值 A(前/后)
300109.1%3.4%0.42 / 0.050.31 / 0.04
750258.6%2.9%0.88 / 0.070.62 / 0.05
1200408.2%2.6%1.21 / 0.080.85 / 0.06
1500507.9%2.4%1.35 / 0.090.94 / 0.06

表里的数值是模型里跑出来的示例量级,具体到你的电机不会一模一样,但趋势可以参考:低速段 THD 降幅略小,因为死区效应占比更大,谐波频谱更散;额定点降幅最大,5 次、7 次都能压到基波的 1% 以内。如果某个转速点上补偿后 THD 反而升高,先查这个点的基波频率有没有正确喂进滤波器,再查相位表是不是只按 50Hz 算的。

6.3 导数据自己算

示波器上的频谱读数受窗函数、平均次数影响,不同设置下能差出一两个百分点。定稿数据我都是从 Workspace 导出来自己算:

ia = logsout.get('i_a').Values.Data; t = logsout.get('i_a').Values.Time; seg = ia(end-round(0.2/Ts):end); % 取最后 0.2s 稳态数据 L1 = round((1/Ts)/f_base); N = floor(numel(seg)/L1)*L1; % 截成整周期 X = fft(seg(1:N)) / N * 2; f = (0:N-1) * (1/Ts) / N; fund = abs(X(round(f_base/((1/Ts)/N))+1)); h = abs(X(round((5*f_base)/((1/Ts)/N))+1)); thd = h / fund * 100;

N那一行是整周期截断的关键,floor之后再乘L1,保证参与 FFT 的点数一定是基波周期的整数倍。算出来的 THD 和模型里频谱仪读数对一下,差得超过 0.5 个百分点,就回去查频谱仪的窗函数设置。

从那以后我每次搭谐波补偿模型,都先把扫频相位表打出来贴在工作区,再动增益;相位表没对齐,增益调多少都是白费。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询