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)")

运行与验证方法

  1. 环境依赖:Python 3.8+,需安装 numpy 和 matplotlib(pip install numpy matplotlib)。
  2. 运行方式:将上述代码保存为 foc_transform.py,在终端执行 python foc_transform.py。
  3. 通过判定标准:
    • 程序正常结束,无报错,并生成 foc_transform_verify.png 图像文件。
    • 图像中:αβ电流为幅值5A、频率50Hz的正交正弦波(β滞后α 90°);dq电流在约0.01s后收敛为水平直线。
    • 控制台输出的 i_d稳态均值 接近0(理论值0A),i_q稳态均值 接近5.0A(理论值等于相电流幅值),i_α/i_β幅值 均接近5.0A。

以上数值偏差应在±0.05A以内(由数值积分误差引起),若偏差过大需检查输入电流相位与θ定义是否一致。