1. FOC控制基础
任务目标
本案例面向无刷电机FOC控制,完成两项核心工作:建立永磁同步电机(PMSM)在静止坐标系下的数学模型,并实现Clarke变换与Park变换的代码,最后通过给定输入验证变换结果与理论一致。
电机模型与坐标变换原理
PMSM的定子电压方程在自然坐标系(A-B-C)下为:
u_a = R·i_a + dψ_a/dt(b、c相类似),其中磁链包含转子永磁体耦合项,导致方程非线性且时变。FOC的核心思想是通过两次坐标变换将交流电机等效为直流电机控制:
- Clarke变换(3s→2s):将三相静止ABC坐标系变换到两相静止αβ坐标系,保持幅值不变(等幅值变换):
i_α = i_a,i_β = (i_a + 2·i_b)/√3 - Park变换(2s→2r):将两相静止αβ坐标系旋转θ角变换到两相旋转dq坐标系:
i_d = i_α·cosθ + i_β·sinθ,i_q = -i_α·sinθ + i_β·cosθ
变换后,d轴与转子磁极对齐,q轴正交,实现解耦。本案例使用Python实现上述变换,并验证:给定三相对称正弦电流,经Clarke变换后αβ分量应为正交正弦波;再经Park变换(θ=电角度)后,dq分量应为直流量。
关键完整代码
import numpy as np
import matplotlib.pyplot as plt
def clarke_transform(ia, ib, ic):
"""等幅值Clarke变换:ABC -> αβ"""
i_alpha = ia
i_beta = (ia + 2 * ib) / np.sqrt(3)
return i_alpha, i_beta
def park_transform(i_alpha, i_beta, theta):
"""Park变换:αβ -> dq(θ为电角度,rad)"""
i_d = i_alpha * np.cos(theta) + i_beta * np.sin(theta)
i_q = -i_alpha * np.sin(theta) + i_beta * np.cos(theta)
return i_d, i_q
# 验证参数
freq = 50 # 电频率 Hz
omega = 2 * np.pi * freq
dt = 1e-4
t = np.arange(0, 0.04, dt) # 仿真2个电周期
I_m = 5.0 # 相电流幅值 A
# 生成三相对称电流(A相初始相位为0)
ia = I_m * np.cos(omega * t)
ib = I_m * np.cos(omega * t - 2 * np.pi / 3)
ic = I_m * np.cos(omega * t + 2 * np.pi / 3)
# 执行变换
i_alpha_list, i_beta_list = [], []
i_d_list, i_q_list = [], []
theta_list = omega * t # 假设转子电角度与A相电压同相位
for k in range(len(t)):
a, b = clarke_transform(ia[k], ib[k], ic[k])
i_alpha_list.append(a)
i_beta_list.append(b)
d, q = park_transform(a, b, theta_list[k])
i_d_list.append(d)
i_q_list.append(q)
# 绘制结果
plt.figure(figsize=(10, 6))
plt.subplot(2, 1, 1)
plt.plot(t, i_alpha_list, label='i_α')
plt.plot(t, i_beta_list, label='i_β')
plt.legend(); plt.grid(True); plt.title('Clarke变换输出(αβ轴电流)')
plt.subplot(2, 1, 2)
plt.plot(t, i_d_list, label='i_d')
plt.plot(t, i_q_list, label='i_q')
plt.legend(); plt.grid(True); plt.title('Park变换输出(dq轴电流)')
plt.tight_layout()
plt.savefig('foc_transform_verify.png', dpi=100)
plt.show()
# 数值验证:打印稳态dq值(取最后一个周期均值)
steady_idx = len(t)//2
print(f"i_d稳态均值: {np.mean(i_d_list[steady_idx:]):.4f} A")
print(f"i_q稳态均值: {np.mean(i_q_list[steady_idx:]):.4f} A")
print(f"i_α幅值: {np.max(i_alpha_list):.4f} A (理论值 {I_m:.1f} A)")
print(f"i_β幅值: {np.max(i_beta_list):.4f} A (理论值 {I_m:.1f} A)")
运行与验证方法
- 环境依赖:Python 3.8+,需安装
numpy和matplotlib(pip install numpy matplotlib)。 - 运行方式:将上述代码保存为
foc_transform.py,在终端执行python foc_transform.py。 - 通过判定标准:
- 程序正常结束,无报错,并生成
foc_transform_verify.png图像文件。 - 图像中:αβ电流为幅值5A、频率50Hz的正交正弦波(β滞后α 90°);dq电流在约0.01s后收敛为水平直线。
- 控制台输出的
i_d稳态均值接近0(理论值0A),i_q稳态均值接近5.0A(理论值等于相电流幅值),i_α/i_β幅值均接近5.0A。
- 程序正常结束,无报错,并生成
以上数值偏差应在±0.05A以内(由数值积分误差引起),若偏差过大需检查输入电流相位与θ定义是否一致。