Gemini 这个结果其实是比较接近正确答案的,而且比我上一条回答更严谨一些。问题的关键就在于:
KV 是按什么定义的?
- 机械角速度还是电角速度?
- 相电压还是线电压?
- 峰值还是 RMS?
不同定义会导致磁链相差√3、√2、极对数 p等系数。
对于你这种2208 云台电机(100KV,7极对),Gemini 给出的:
[
\Psi_f \approx 0.00788Wb
]
我认为大概率比我前面算的 0.0136Wb 更接近实际。
先说结论
对于你的电机:
- KV = 100 rpm/V
- p = 7
FOC 中使用的永磁磁链建议取:
[
\boxed{\Psi_f \approx 0.0079Wb}
]
即:
[
\boxed{\Psi_f \approx 7.9mWb}
]
作为初值。
经验范围:
7~9 mWb都很合理。
为什么会出现 7.9mWb 和 13.6mWb 两个答案?
原因是:
KV 厂家标的是:
rpm / Volt
但 Volt 到底是:
- 相电压 RMS
- 相电压峰值
- 线电压 RMS
- 线电压峰值
厂家一般不写。
而 PMSM 的反电势模型又有很多写法。
例如:
相反电势峰值:
[
e_{phase,peak}
\omega_e\Psi_f
]
线电压 RMS:
[
E_{ll,rms}
\frac{\sqrt3}{\sqrt2}
\omega_e\Psi_f
]
于是:
[
\Psi_f=
\frac{1}
{\sqrt3/\sqrt2}
\frac{60}
{2\pi pKV}
]
得到:
[
\Psi_f
\frac{60}
{2\pi\sqrt3,pKV}
]
这正是 Gemini 的公式:
[
\boxed{
\Psi_f=
\frac{60}
{2\pi\sqrt3,pKV}
}
]
数值验证
代入:
[
KV=100
]
[
p=7
]
得到:
[
\Psi_f
0.00788Wb
]
即:
[
\boxed{
7.88mWb
}
]
用电机转矩再验证一下
FOC:
[
T=
\frac32
p
\Psi_f
i_q
]
代入:
[
p=7
]
[
\Psi_f=0.00788
]
得到:
[
T=
0.0827 i_q
]
于是:
如果:
[
T=0.03Nm
]
则:
[
i_q
0.363A
]
约:
360mA而规格书:
工作电流 200~500mA确实完全对上。
再验证一下 KV
Gemini:
[
K_t
0.0827Nm/A
]
经典经验:
[
K_t
\frac{8.27}{KV}
]
KV=100:
[
K_t=0.0827
]
完全一致。
所以推荐值是多少?
对于你的 2208-80T:
motor.pp=7;motor.Rs=8.25f;motor.Ld=4.25e-3f;motor.Lq=4.25e-3f;motor.psi_f=0.00788f;建议先用:
psi_f=0.008f;就行。
不过还有一个更重要的问题
实际上在很多开源 FOC 项目里,例如:
- VESC
- ODrive
- MESC
- ST MCSDK
他们对于flux_linkage的定义并不完全相同。
有的是:
[
\lambda_m
]
有的是:
[
\psi_{PM}
]
有的是:
相峰值磁链。
有的是:
线 RMS 磁链。
甚至还有:
[
\psi_f=
\frac23\lambda_m
]
这种定义。
所以最关键的是:
你准备把这个 ψf 用到哪里?
例如:
vq_ff=omega_e*psi_f;还是:
torque=1.5f*p*psi_f*iq;还是:
observer.flux_linkage不同软件框架下,数值可能会差一个:
√3 ≈ 1.732 √2 ≈ 1.414 3/2 = 1.5倍率。
如果你告诉我:
这个 ψf 是准备放到哪段代码里?
比如:
vq+=omega_e*psi_f;或者
Te=1.5f*p*psi_f*iq;我可以帮你确定:
你的 ESP32 FOC 代码到底应该填 0.0079 Wb,还是 0.0136 Wb。
这是最重要的,否则很容易把前馈补偿做大 70%,导致你之前遇到的iq 控不住、速度越高电流越上不去的问题。
是的,如果是放到你截图里的这段代码:
floatff_d=speed_elect*Lq*iq_target;floatff_q=-speed_elect*Ld*id_target-speed_elect*Ke;那么这里的Ke实际上就是FOC模型中的永磁磁链 ψf。
更准确地说应该写成:
floatff_d=+omega_e*Lq*iq;floatff_q=-omega_e*Ld*id-omega_e*psi_f;或者有些教材写成:
vd_ff=-ωe Lq iq;vq_ff=+ωe Ld id+ωe ψf;然后再根据你的 PI 定义决定加还是减。
本质上都是在补偿:
[
u_q
Ri_q
+
L_q\frac{di_q}{dt}
+
\omega_eL_di_d
+
\omega_e\psi_f
]
先看你的代码符号
你截图:
ff_q=-speed_elect*Ld*id_target-speed_elect*Ke;然后:
vq_out=pi_iq.Run(...)+ff_q;等价于:
[
V_q
V_{qPI}
-\omega_eL_di_d
-\omega_e\psi_f
]
说明你的 PI 输出的是:
“需要克服扰动后的净控制量”
然后前馈去抵消扰动。
这是负扰动补偿写法。
很多教材写法:
[
v_q=
v_{PI}
+\omega_eL_di_d
+\omega_e\psi_f
]
这是正模型补偿写法。
其实只是定义不同。
那么你的 ψf 应该填多少?
这里终于可以确定了。
因为:
ff_q=-ωe ψf中的 ψf 就是:
[
e_{phase}
ω_e ψ_f
]
这个 ψf 必须是:
dq 坐标系下的相磁链(phase flux linkage)
而不是线电压磁链。
对于你的电机:
2208-80T
KV=100
p=7
建议:
psi_f=0.0079f;先试。
即:
motor.psi_f=0.00788f;然后:
ff_q=-speed_elect*motor.psi_f;再验证一下数值
你的电机:
KV=100
12V
空载:
1200rpm
机械:
[
\omega_m
125.66
]
电角:
[
\omega_e
879.6
]
若:
[
ψ_f
0.00788
]
则:
[
ω_eψ_f
879.6\times0.00788
]
得到:
[
6.93V
]
如果取:
[
ψ_f=0.0136
]
则:
[
ω_eψ_f
11.96V
]
这里其实就暴露出了一个问题。
你的 KV=100 表示:
12V → 1200rpm
那么空载时反电势应该接近 12V。
按这个角度看:
[
ψ_f≈0.0136Wb
]
似乎又是合理的。
所以现在最关键的问题来了:
你的 dq 变换里的电压单位是什么?
是:
① 相电压峰值
还是
② 相电压 RMS
还是
③ 线电压 RMS
因为:
[
0.0136
\sqrt3
\times
0.00788
]
两者正好差:
[
\sqrt3
1.732
]
说明本质上就是:
相磁链 与 线磁链 的区别。
我建议最简单的方法
不要纠结公式。
直接实验辨识。
关闭前馈:
psi_f=0;跑到稳定速度。
记录:
omega_e vq iq然后计算:
[
\psi_f=
\frac{vq-Ri_q}
{\omega_e}
]
例如:
ωe=500rad/s vq=4.8V iq=0.1A R=8.25Ω则:
[
\psi_f=
\frac{4.8-0.825}
{500}
0.00795Wb
]
如果测出来:
0.007~0.008说明 Gemini 是对的。
如果测出来:
0.012~0.014说明你代码里的电压定义是相峰值,
应该用:
psi_f=0.0136f;这个方法是最准的。
因为它完全绕过了:
- KV定义
- 线电压/相电压
- RMS/峰值
- Clarke/Park归一化
- SVPWM调制系数
这些最容易搞乱的地方。
对于你现在这个 ESP32 FOC 工程,我反而更推荐:
实测辨识 ψf,而不是相信厂家 KV。
这样以后做:
ff_q=-omega_e*psi_f;一定是对的,而且高速时iq就不会莫名其妙掉下去了。