做FOC的都知道永磁同步电机PMSM的转矩脉动是台架测试里的常客。前阵子我调一台2 kW的表贴式PMSM额定转速3000 r/min空载运行还能接受一带上负载扭矩传感器波形就像在跳舞。打开FFT一看能量几乎都集中在6倍电气频率上也正是因为这样我才开始认真研究5、7次谐波注入和死区补偿这两招。这篇文章把整套思路完整记录一遍先说清转矩脉动为什么总和6倍频过不去再讲谐波注入和死区补偿各自的消脉动逻辑最后给出我实测的数据和几个容易踩的坑供正在做PMSM电流环、振动噪声抑制的朋友参考。1. 为什么转矩脉动总和“6倍频”过不去先把病灶找到1.1 三类来源叠加别急着只怪谐波转矩脉动的来源不止一个。拿到FFT结果后第一步不是急着加补偿而是先判断这个6倍频是哪来的。按我的调试习惯一般分三类排查齿槽转矩永磁体和定子齿槽相互作用产生的阻力矩和电流大小没关系。空载状态下盘车或者让电机在零电流附近匀速旋转用扭矩传感器就能看到周期性波动。齿槽转矩通常和极槽配合、极弧系数强相关频率由槽数和极对数决定不是简单的6倍频关系。反电动势谐波永磁体磁链在气隙里不是标准正弦绕组系数也决定反电动势里存在5、7、11、13次谐波。基波电流和这些谐波磁链一乘就会在转矩上拍出6倍频、12倍频脉动。逆变器非线性与电流谐波死区时间、管压降、PWM量化误差都会让实际输出电压失真电流里就会多出5次、7次谐波。这些谐波电流再和基波磁链作用同样形成6倍频转矩脉动。这三类来源有个很实用的判别方法来源主要特点判别手段齿槽转矩与负载电流无关空载就存在零电流旋转直接测盘车阻力矩或空载转矩波动反电动势谐波随转速升高近似线性放大反拖电机测线反电动势并做FFT逆变器非线性轻载、低速时占比高对比死区补偿前后电流THD的变化如果你在轻载工况看到明显6倍频转矩脉动死区基本上是主要嫌疑如果是重载工况反电动势谐波和磁阻效应的权重会明显上升。我这次用的电机是表贴式磁阻项很小所以问题基本集中在反电动势谐波和死区电流畸变这两个头上。1.2 5次和7次为什么总是成对出现三相系统有个规律只要三相绕组对称非线性负载产生的特征谐波次数基本是6k±1。也就是说电流谐波里最常见的是5次、7次然后是11次、13次再高次的幅值就很小了。5次是负序7次是正序这两个分量在同步旋转dq坐标系里都会变成6倍频的交流量是引起6f_e转矩脉动的直接推手。我把这个关系整理成一张表方便对账相电流谐波次数序性质在dq同步旋转系中的表现产生的转矩脉动频率5次负序dq中6倍频分量负向旋量6f_e7次正序dq中6倍频分量正向旋量6f_e11次负序dq中12倍频分量负向旋量12f_e13次正序dq中12倍频分量正向旋量12f_e拿我这台电机举例4对极、额定转速3000 r/min时电气频率f_e200 Hz转矩脉动的主峰就在1200 Hz也就是6f_e次级峰在2400 Hz也就是12f_e。所以我做谐波注入时主要处理5次和7次就抓住了主矛盾11次和13次可以先放一放等主成分处理完再决定要不要加。2. 5/7次谐波注入的对消原理不是把谐波“加上去”而是“顶回去”2.1 一个矢量三角形的工程直觉很多人一听“谐波注入”就以为是在电流指令上叠加一组5次、7次正弦波让电机电流更“花哨”。其实谐波注入的核心不是主动制造谐波而是“顶回去”。把自然存在的转矩脉动看成一个矢量幅值是A相位是φ。谐波电流注入后会产生一个同样的6倍频转矩分量它的幅值和相位可以通过注入电流的幅值和相位来调整。目标就是让这两个矢量大小相等、方向相反[ \vec{R}_0 \vec{R}_1 0 ]这就是一个矢量对消问题。工程直觉是只要注入电流能在dq轴上生成一个幅相可调的6倍频小信号就能对消掉任意一个固定频率、固定相位的6倍频转矩脉动。理论上单用5次或单用7次就可以做到因为一个谐波分量有幅值、相位两个自由度同时用5次和7次的好处在于可以把dq系里正、负两个旋向的分量分开控制还能兼顾d轴电流和相电流峰值分配实际调节起来更灵活。2.2 从转矩脉动反推注入指令对于表贴式PMSM电磁转矩近似可以写成[ T_e \frac{3}{2}p\psi_f i_q ]如果已经测到6倍频转矩脉动分量 (T_6 A\sin(6\theta_e\varphi))那么对应的q轴6倍频注入电流就是[ i_{q6}^* -\frac{A}{1.5 p \psi_f}\sin(6\theta_e\varphi) ]这个式子看着简单真正麻烦的是A和φ怎么来。如果台架上有动态扭矩传感器可以在不同转速、不同负载下做一组离线测试用FFT提取A和φ做成Lookup Table运行时查表得到dq轴6倍频指令再做反Park变换就自然变成了abc三相里的5次负序和7次正序谐波电流。这就是标题里“5/7次谐波注入”和“dq系6倍频电流注入”能对上的根本原因。如果不想离线标定也可以在线估计。用公式估算电磁转矩后做6倍频带通滤波再用谐振控制器闭环调节注入量让残余转矩脉动最小。我实际做的时候是混合思路先用离线LUT把大头的脉动顶掉再让谐振控制器处理残余这样系统稳定又不会在工况切换时出现明显的补偿跳变。2.3 电流环怎么把6倍频指令跟住常规dq轴PI电流环只能对直流指令做到无静差跟随对6倍频交流指令的增益会掉下去所以必须给电流环加额外的谐振通道。三种常见做法对比方法实现复杂度频率跟随性适用场景电流环并联6ω谐振控制器低需要按ω_e实时更新谐振频率转速恒定或慢变谐波同步旋转坐标PI中坐标变换天然跟随转速频繁变速推荐重复控制中依赖基波周期固定基频稳态运行我这次用的是谐波同步旋转坐标法先把dq电流分别变换到以-6ω和6ω旋转的两个坐标系里5次负序和7次正序在其中都变成了直流各用一组PI就能压到零。这样做的好处是转速变化时不需要像谐振控制器那样反复调系数坐标变换自然帮你跟住频率。3. 死区补偿为什么能治转矩脉动逆变器的“电压丢量”问题3.1 死区电压误差的定量估算逆变器上下桥臂切换时为了防止直通必须插入一段死区时间。死区时间内电流靠续流二极管维持实际输出电压和PWM指令并不一致。平均来看每个开关周期相当于“丢”了一块电压单相平均电压误差可以写成[ \Delta u \approx \frac{t_d}{T_s} V_{dc} \operatorname{sgn}(i) ]符号取决于相电流方向补偿方向要跟着电流极性走。举个例子母线电压310 V开关频率10 kHzTs100 μs死区2 μs那么平均电压损失大约是[ \Delta u \frac{2,\mu s}{100,\mu s} \times 310V 6.2V ]轻载低速时基波电压可能只有3040V这6.2V的误差占比非常大到了重载高速基波电压可能已经200V以上死区误差占比就小很多。这也是轻载时死区补偿效果特别明显的本质原因。3.2 死区误差如何变成5/7次电流(\operatorname{sgn}(i)) 本质上是随相电流方向变化的方法周期信号里天然含有大量奇次谐波。在闭环电流环带宽有限的情况下这些谐波不可能全部被调平最终电流里就会留下明显的5次、7次分量。换句话说逆变器死区是相电流里5/7次谐波的重要制造者而死区补偿消灭的是“源头”谐波注入消灭的是“结果”两者并不重复而是递进关系。补偿的伪代码示意如下float volt_loss Vdc * deadtime / pwm_period; // 平均电压损失 if (phase_current threshold) { u_ref_comp u_ref volt_loss; } else if (phase_current -threshold) { u_ref_comp u_ref - volt_loss; } else { u_ref_comp u_ref; // 过零区间不补偿避免抖动 }需要特别提醒这个方波电压补偿只是平均意义上的模型。实际电流过零点附近会出现“箝位”现象二极管续流时间被拉长简单加方波补偿并不能完全消除所以工程上还要配合电流过零检测的滞环、或者根据功率管实际导通状态做细化。3.3 工程上两套死区补偿做法第一套是时间补偿法直接在PWM比较值里加减死区时间对应的计数。电流为正时把有效导通时间拉长(t_d)电流为负时把有效导通时间缩短(t_d)。优点是和母线电压解耦抗母线波动能力强。第二套是电压前馈法在电压指令里叠加一个符号相反的补偿电压改起来最简单也不会干扰PWM中断时序。缺点是母线电压变化时补偿量要跟着重建模否则误差又跑回来。如果后续要做量产我建议优先采用时间补偿法并把电流极性判断放在SVPWM更新前一个比较时刻这样补偿动作不会跨周期相位延迟更小。4. 联合应用的调试流程与实测数据一台2kW表贴电机的对比结果4.1 模块划分与控制流程把死区补偿和谐波注入同时放在系统里要特别注意分工死区补偿工作在电压指令层面在SVPWM之前对三相电压指令做修正它的目标是消除逆变器非线性带来的5/7次电流谐波。谐波注入工作在电流环参考层面通过dq轴6倍频电流指令目标是对消反电动势谐波和残余电流谐波产生的6倍频转矩脉动。我实现的流程是速度环输出基波q轴电流参考 - 电流环并联6ω谐波通道 - 输出dq电压 - 反Park变换 - 死区时间补偿 - SVPWM。两个模块一个管“源头”一个管“结果”不会打架。4.2 台架参数与对比工况被测电机和控制器主要参数如下项目数值额定功率2 kW额定转速3000 r/min极对数4额定转矩6.4 N·m母线电压310 V DCPWM开关频率10 kHz死区时间2 μs电流环带宽约800 Hz测试用动态扭矩传感器直接测轴端转矩数据采集用转速同步触发FFT分析时锁定基频和6倍频分量避免转速波动造成频谱泄漏。4.3 实测结果解读两种典型工况的结果如下表中的“6f幅值”指FFT在6倍电气频率处的幅值“P-P”指转矩波形峰峰值轻载10%平均转矩约0.64 N·m项目基线仅死区补偿仅5/7次注入两者同时转矩P-P0.42 N·m0.20 N·m0.26 N·m0.10 N·m6f幅值0.16 N·m0.07 N·m0.09 N·m0.03 N·m额定负载80%平均转矩约5.12 N·m项目基线仅死区补偿仅5/7次注入两者同时转矩P-P0.85 N·m0.55 N·m0.38 N·m0.21 N·m6f幅值0.32 N·m0.18 N·m0.12 N·m0.05 N·m轻载工况下死区补偿的收益明显更大这符合前面电压损失占比高的分析额定负载下谐波注入的作用更突出因为反电动势谐波在高载时贡献变大。两者同时打开后6倍频转矩脉动幅值在两个工况都降到基线值的五分之一左右效果不是简单叠加而是互补。5. 哪些坑我踩过谐波注入与死区补偿的排错指引5.1 死区补偿极性反了的判别死区补偿最经典的坑就是极性反了。症状是补偿后电流THD不仅没降5/7次谐波反而更大低速轻载时电机还会发出更加明显的“哒哒”声。排查方法很简单极低速下给一个固定的q轴电流让电机缓慢爬行记录A相电流方向和A相补偿电压符号然后翻转补偿符号跑一次FFT对比。如果翻转后6倍频明显变小说明原来写反了。5.2 固定频率谐振器在变速时失效如果用了固定中心频率的6ω谐振器转速一变谐振点就对不上补偿效果立刻消失而且还会在频谱上多出一组“拍频”波动。解决思路有两种要么在谐振器系数里实时代入当前电角速度要么干脆改用谐波同步旋转坐标PI让坐标变换去跟频率。我自己的习惯是使用后者省去每换一台电机就重新整定谐振频率的麻烦。5.3 采样噪声和电流环延迟的相位问题谐波提取对电流采样质量非常敏感。如果ADC没有和PWM载波同步采样点上会混入开关纹波和振铃6倍频谐振通道很容易把这些噪声当误差信号放大。另一个隐藏问题是电流环延迟。算法一拍延迟加上PWM零阶保持至少1.5到2个开关周期。在6倍频处这个延迟带来的相位滞后不可忽略[ \theta_{lag} \approx 1.5 \times 2\pi f_6 T_s ]还是用f_e200 Hz、Ts100 μs算f_61200 Hz滞后约65°。如果谐振控制器不做相位补偿你以为是顶回去实际是斜着顶效果会打折扣。解决方式是在补偿通道里加一个随转速变化的前馈相位角。5.4 注入量不是越大越好谐波注入的本质是用额外的谐波电流换取转矩脉动下降付出的代价是铜耗增加、相电流峰值升高。我的经验是额定转矩下5/7次电流幅值控制在基波幅值的3%到8%就够了超过10%以后转矩脉动几乎不再下降反而会让驱动器过流保护和电机发热变得很紧张。判断效果一定以转矩FFT为准不要只看时域P-P因为时域峰峰值里往往混着机械共振和高频噪声。5.5 测转矩时的滤波和采样陷阱用动态扭矩传感器评估效果时滤波截止频率要精心选择。带宽太低会把1200 Hz的6倍频脉动直接滤掉带宽太高又把机械安装共振引进来。建议先用宽频带做一次扫描找到机械共振峰再选一个把6f_e留在通带内、同时压掉共振峰的低通截止频率。另外FFT截断尽量和转速同步做不到就加汉宁窗否则频谱泄漏会让1200 Hz处的幅值读数虚高。最后分享一个我每次换硬件平台都会做的检查在极低速下用固定电压矢量驱动电机对比死区补偿打开和关闭时的电流波形。如果补偿方向正确电流波形的“平顶扭曲”会明显减轻如果方向错误波形会比不补偿时更扭曲而且产生额外的高次噪声。这一步只需要几分钟却能省掉后面大量的调试时间。另外要注意死区电压补偿公式里的Vdc最好做归一化处理写成(t_d/T_s)乘以实时母线电压而不是写一个固定绝对值。实验室稳压电源看不出问题一上波动较大的直流母线就露馅了。把这些细节做扎实谐波注入和死区补偿才能成为量产时稳定复现的效果而不是调试台上的一次性魔法。