
永磁同步电机的矢量控制总带着点玄学色彩,尤其是当 MTPA、弱磁、过调制这些词堆在
一起的时候。这次咱们直接拆开仿真模型,看看那些公式到底是怎么落地成代码的。
先说 MTPA 的实现吧,这玩意儿核心就一句话:让电流矢量沿着最小铜损轨迹走。用公式
表示就是 i_d = (ψ_f)/(2(L_q - L_d)) - sqrt( (ψ_f/(2(L_q - L_d)))^2 + i_q^2 )。但在代码里可
不能直接这么硬算,得搞个查表法或者在线迭代。这里用的是离线计算+二维查表:
```matlab
% MTPA 查表生成
id_ref = @(iq) (psi_pm/(2*(Lq-Ld))) - sqrt( (psi_pm/(2*(Lq-Ld)))^2 + iq.^2 );
iq_array = linspace(0, Imax, 200);
id_mtpa = arrayfun(id_ref, iq_array);
lookup_table = [iq_array' id_mtpa'];
```
这么干的好处是实时控制时不用做复杂运算,直接查表取值,DSP 里跑起来贼快。不过得
注意电感参数的温度影响,实际项目里得做在线参数辨识。
前馈解耦这块有个坑,新手常把耦合项当误差处理。其实电压方程里的 ωLqiq 和 ωLdid
这两项得直接当前馈补偿:
```c
// 电流环输出
Vd = (id_ref - id) * Kp + ω * Lq * iq;
Vq = (iq_ref - iq) * Kp - ω * (Ld * id + ψ_pm);
```
注意这里的符号,Ld 项前面是负号,别搞反了。仿真时如果发现 q 轴电流有静差,八成
是 ψ_pm 没补偿到位。
过调制区域的处理才是重头戏。当电压饱和时,普通的 SVPWM 就得跪,这时候得重构电
压矢量。模型里用了幅值相位补偿法:
```matlab
function [Vd_new, Vq_new] = over_modulation(Vd, Vq, Vdc)
Vmax = Vdc/sqrt(3);
Vmag = sqrt(Vd^2 + Vq^2);
if Vmag > Vmax
theta = atan2(Vq, Vd);
Vd_new = Vmax * cos(theta);
Vq_new = Vmax * sin(theta);
else
Vd_new = Vd;
Vq_new = Vq;
end