PMSM 电流矢量控制 (CVC) 驱动系统参数与最优控制原理分析 – 炸管小王子

本文基于 motulator 框架,对一台内置式永磁同步电机 (IPMSM) 的电流矢量控制 (Current-Vector Control, CVC) 驱动系统进行完整参数梳理,并系统分析最大转矩电流比 (MTPA)、最大转矩电压比 (MTPV)、参考指令生成链及 CurrentVectorController 的核心原理与代码实现。

pump_load_FLUXTorqueControl 中 flux-vector 控制的关键区别在于:CVC 在参考发生器与电压输出之间插入了显式的 d-q 电流 PI 内环 (CurrentController),而参考发生器本身的 5 步约束链(MTPA → flux limit → voltage weakening → current limit → MTPV)保持不变。


1. 电机与驱动系统参数

仿真基于 config.py 中定义的参数构建。以下分别列出电机本体、两种直流母线方案(传统大电容 vs Slim DC-link)、机械系统、控制器及标幺值基值。

1.1 永磁同步电机参数

参数 符号 数值 单位 说明
极对数 \(n_p\) 3 6 极电机
定子电阻 \(R_s\) 0.65 Ω
d 轴电感 \(L_d\) 2.6 mH
q 轴电感 \(L_q\) 3.49 mH \(L_q \gt L_d\),证实为内置式 (IPMSM)
永磁体磁链 \(\psi_f\) 0.1333 Vs 0.4 / 3
最大定子电流 \(I_{s,\max}\) 58 A (峰值) 对应 2.0 pu
额定转速 \(\omega_{M,\text{nom}}\) 376.99 rad/s 3600 rpm
额定功率 \(P_{\text{nom}}\) 2765 W
额定转矩 \(\tau_{\text{nom}}\) 7.33 Nm

1.2 直流母线参数

本项目对比两种直流母线方案:

参数 传统大电容 (post_222) Slim DC-link (本仿真)
直流电容 \(C_{dc}\) 22 mF 88 µF
直流侧电感 \(L_{dc}\) 0.9516 mH
电网线电压 \(U_g\) 220 V (RMS) 127.3 V (RMS)
电网频率 \(f_g\) 50 Hz 60 Hz

Slim DC-link 采用小电容 (88 µF) 方案,直流母线电压存在显著的六脉波动。FrequencyConverter 模型内部已包含 \(C_{dc}\)\(L_{dc}\) 的动态状态。

1.3 机械系统参数

参数 符号 数值 单位
转动惯量 \(J\) \(4.9 \times 10^{-4}\) kg·m²
摩擦系数 \(B_L\) 0 Nm/(rad/s)

1.4 控制器参数

参数 符号 数值 单位 说明
采样周期 \(T_s\) 125 µs 开关频率 8 kHz
电流环带宽 \(\alpha_c\) \(2\pi \times 400\) rad/s CVC 专用参数
积分作用带宽 \(\alpha_i\) \(2\pi \times 100\) rad/s
观测器极点 \(\alpha_o\) \(2\pi \times 50\) rad/s
电压利用系数 \(k_u\) 0.9 \(u_{s,\max} = k_u u_{dc}/\sqrt{3}\)
MTPV 裕量 \(k_{\text{mtpv}}\) 0.85 转矩软上限系数
控制方式 无传感器 sensorless=True

注意:与 flux-vector 控制相比,CVC 用 alpha_c(电流环带宽)替代了 alpha_tau(转矩环带宽)和 alpha_psi(磁链环带宽)。电流环通常设计为比外环快 3~5 倍,这里取 \(2\pi \times 400\) rad/s,约为外环带宽的 4 倍。

1.5 标幺值系统基值

基值 表达式 数值 单位
电角频率 \(\omega_{\text{base}} = n_p \omega_{M,\text{nom}}\) 1131.0 rad/s
电压 \(u_{\text{base}} = \psi_f \omega_{\text{base}}\) 150.8 V
电流 \(i_{\text{base}} = I_{s,\max}/2\) 29.0 A
磁链 \(\psi_{\text{base}} = u_{\text{base}}/\omega_{\text{base}}\) 0.1333 Vs
功率 \(p_{\text{base}} = 1.5 u_{\text{base}} i_{\text{base}}\) 6561 W
阻抗 \(Z_{\text{base}} = u_{\text{base}}/i_{\text{base}}\) 5.20 Ω
电感 \(L_{\text{base}} = Z_{\text{base}}/\omega_{\text{base}}\) 4.60 mH
转矩 \(\tau_{\text{base}} = 3 p_{\text{base}}/\omega_{\text{base}}\) 17.4 Nm

2. MTPA 原理与 motulator 实现

2.1 数学条件

MTPA(Maximum Torque Per Ampere,最大转矩电流比)条件定义为:在恒定电流幅值下,转矩对电流角的导数为零。

\[\tau_M = 1.5 \cdot n_p \cdot \operatorname{Im}(\psi_s \cdot i_s^*)\]

MTPA 条件:\(d\tau_M/d\gamma = 0\),其中 \(\gamma\) 为电流角。

通过辅助磁链 \(\psi_a\)(auxiliary flux),可将该条件写成正交形式:

\[\boxed{\operatorname{Re}(\psi_a \cdot i_s^*) = 0}\]

2.2 辅助磁链 \(\psi_a\) 的三种等价形式

形式 表达式 说明
理论定义 \(\psi_a = \psi_s + j \cdot \partial\psi_s/\partial\delta\) 对电流角求导后构造
dq 展开式 \(\psi_a = \psi_s – L_{qq} i_d – j L_{dd} i_q + j L_{dq} i_s^*\) 用增量电感展开
向量形式 \(\psi_a = \psi_s + J \cdot \partial\psi_s/\partial\delta\) \(J\) 为 90° 旋转矩阵

2.3 源码实现

ControlLoci.compute_mtpa_locus(i_s_max) 的实现步骤:

  1. \([0, i_{s,\max}]\) 内线性取 16 个电流幅值点
  2. 对每个幅值,用 Brentq 求根 \(\operatorname{Re}(\psi_a \cdot i_s^*) = 0\),得到 MTPA 电流角 \(\gamma\)
  3. 计算 \(i_{s,dq} = |i_s| \cdot \exp(1j \cdot \gamma)\),并通过 psi_s_dq() 得到对应磁链
  4. 计算转矩 \(\tau_M = 1.5 \cdot n_p \cdot \operatorname{Im}(i_{s,dq} \cdot \psi_{s,dq}^*)\)
  5. 封装为 MTPALocus(含 \(i_{s,dq}\) vs \(\tau_M\) 插值器)
# _sm_control_loci.py
class ControlLoci:
    def compute_mtpa_current_angle(self, i_s_abs: float) -> float:
        def mtpa_cond(gamma: float) -> float:
            i_s_dq = i_s_abs * np.exp(1j * gamma)
            psi_a_dq = self.par.aux_flux(i_s_dq)
            return np.real(psi_a_dq * np.conj(i_s_dq))

        gamma_range = (0.5 * np.pi, np.pi)  # IPMSM: gamma 在第二象限
        if mtpa_cond(gamma_range[0]) * mtpa_cond(gamma_range[1]) > 0:
            return 0.0  # 区间内无根
        return root_scalar(mtpa_cond, bracket=gamma_range, method="brentq").root

    def compute_mtpa_locus(self, i_s_max: float, num: int = 16) -> MTPALocus:
        current_magnitudes = np.linspace(0, i_s_max, num)
        gamma = np.zeros_like(current_magnitudes)
        for idx, i_s_abs in enumerate(current_magnitudes):
            gamma[idx] = self.compute_mtpa_current_angle(float(i_s_abs))
        i_s_dq = current_magnitudes * np.exp(1j * gamma)
        psi_s_dq = self.par.psi_s_dq(i_s_dq)
        tau_M = 1.5 * self.par.n_p * np.imag(i_s_dq * np.conj(psi_s_dq))
        return MTPALocus(
            i_s_dq=i_s_dq, psi_s_dq=psi_s_dq, tau_M=tau_M,
            i_s_dq_vs_tau_M=lambda x: np.interp(x, tau_M, i_s_dq),
        )

3. MTPV 原理与 motulator 实现

3.1 问题设定

在高速弱磁区,电机电压受限于直流母线:

\[|u_s| \le \frac{k_u u_{dc}}{\sqrt{3}} \approx \omega_m |\psi_s|\]

对于给定转速 \(\omega_m\),磁链幅值 \(|\psi_s|\) 被限制在最大值以下。此时最大转矩电压比 (MTPV) 的问题可表述为:

在磁链幅值 \(|\psi_s|\) 恒定的约束下,寻找使电磁转矩最大的工作点。

3.2 解析条件

更精确地说,MTPV 是电压极限下不同转速对应的最优轨迹。当转速继续升高、电压极限圆收缩时,MTPV 轨迹给出了每个磁链水平下能产生的最大转矩。其数学条件为:

\[\boxed{\frac{\partial \tau_M}{\partial \delta}\bigg|_{|\psi_s|=\text{const}} = 0}\]

其中 \(\delta\) 是磁链矢量在 dq 坐标系中的角度,\(\psi_s = |\psi_s| e^{j\delta}\)

3.3 辅助电流 \(i_a\) 的定义与推导

在 MTPA 分析中,motulator 使用辅助磁链 \(\psi_a\) 将 MTPA 条件写成正交形式:

\[\text{MTPA:}\quad \operatorname{Re}(\psi_a \cdot i_s^*) = 0\]

类似地,MTPV 引入辅助电流 \(i_a\)(motulator 源码中名为 i_a_dq),将条件写成对偶形式:

\[\boxed{\text{MTPV:}\quad \operatorname{Re}(i_a \cdot \psi_s^*) = 0}\]

_parameters.pyaux_current() 方法中:

def aux_current(self, i_s_dq):
    L_s = self.incr_ind_mat(i_s_dq)
    inv_L_s = np.linalg.inv(L_s)
    G_dd, G_dq, G_qq = inv_L_s[0,0], inv_L_s[0,1], inv_L_s[1,1]
    psi_s_dq = self.psi_s_dq(i_s_dq)
    return (
        (G_qq * np.real(psi_s_dq) + 1j * G_dd * np.imag(psi_s_dq))
        - 1j * G_dq * np.conj(psi_s_dq)
        - i_s_dq
    )

3.4 线性不饱和电机特例

\(L_{dq}=0\)\(L_{dd}=L_d\)\(L_{qq}=L_q\) 时:

\[i_a = \frac{\psi_d}{L_q} + j\frac{\psi_q}{L_d} – i_s\]

代入 \(\psi_d = L_d i_d + \psi_f\)\(\psi_q = L_q i_q\)

\begin{aligned}
i_a &= \frac{L_d i_d + \psi_f}{L_q} + j\frac{L_q i_q}{L_d} – i_d – j i_q \
&= \frac{\psi_f}{L_q} + i_d\left(\frac{L_d}{L_q}-1\right) + j i_q\left(\frac{L_q}{L_d}-1\right)
\end{aligned}

MTPV 条件 \(\operatorname{Re}(i_a \cdot \psi_s^*) = 0\) 展开为:

\[\left[\psi_f + i_d(L_d-L_q)\right](L_d i_d + \psi_f) + i_q^2 (L_q-L_d)L_q = 0\]

整理后正是 IPMSM 的经典 MTPV 双曲线方程:

\[\psi_f i_d + (L_d-L_q)i_d^2 = \frac{L_q-L_d}{L_q}\psi_q^2\]

或写成:

\[\psi_d \left[\psi_f + i_d(L_d-L_q)\right] = \psi_q^2 \frac{L_d-L_q}{L_q}\]

3.5 MTPV 轨迹预计算

# _sm_control_loci.py
class ControlLoci:
    def compute_mtpv_flux_angle(self, psi_s_abs: float) -> float:
        def mtpv_cond(delta: float) -> float:
            psi_s_dq = psi_s_abs * np.exp(1j * delta)
            i_s_dq = self.par.iterate_i_s_dq(psi_s_dq)
            i_a_dq = self.par.aux_current(i_s_dq)
            return np.real(i_a_dq * np.conj(psi_s_dq))

        delta_range = (0.5 * np.pi, np.pi)
        if mtpv_cond(delta_range[0]) * mtpv_cond(delta_range[1]) > 0:
            return np.nan  # 不存在 MTPV(如表贴式电机 L_d=L_q)
        return root_scalar(mtpv_cond, bracket=delta_range, method="brentq").root

    def compute_mtpv_locus(self, psi_s_max: float, num: int = 16) -> MTPVLocus:
        flux_magnitudes = np.linspace(0, psi_s_max, num)
        delta = np.zeros_like(flux_magnitudes)
        for idx, psi_s_abs in enumerate(flux_magnitudes):
            delta[idx] = self.compute_mtpv_flux_angle(float(psi_s_abs))
        psi_s_dq = flux_magnitudes * np.exp(1j * delta)
        i_s_dq = np.array([self.par.iterate_i_s_dq(psi) for psi in psi_s_dq])
        tau_M = 1.5 * self.par.n_p * np.imag(i_s_dq * np.conj(psi_s_dq))
        return MTPVLocus(
            psi_s_dq=psi_s_dq, i_s_dq=i_s_dq, tau_M=tau_M,
            tau_M_vs_psi_s_abs=lambda x: np.interp(x, abs(psi_s_dq), tau_M),
            i_s_dq_vs_psi_s_abs=lambda x: np.interp(x, abs(psi_s_dq), i_s_dq),
        )

4. 参考指令生成流程与代码分析

4.1 五步切换链:compute_flux_and_torque_refs()

def compute_flux_and_torque_refs(self, tau_M_ref, w_m, u_dc):
    # Step 1: MTPA 磁链
    psi_s_abs_mtpa = abs(self._get_mtpa_flux(tau_M_ref))

    # Step 2: 磁链限幅
    psi_s_abs_ref = clip(psi_s_abs_mtpa, psi_s_min, psi_s_max)

    # Step 3: 电压极限弱磁
    psi_s_max_voltage = u_s_max / abs(w_m)
    psi_s_abs_ref = min(psi_s_abs_ref, psi_s_max_voltage)

    # Step 4: 电流极限转矩截断
    tau_M_cl = self._get_current_limit_torque(psi_s_abs_ref)
    tau_M_ref = min(tau_M_cl, abs(tau_M_ref)) * sign(tau_M_ref)

    # Step 5: MTPV 极限
    psi_s_mtpv, tau_M_mtpv = self._get_mtpv_flux_and_torque(psi_s_abs_ref)
    if tau_M_mtpv > 0:
        tau_M_ref = min(k_mtpv * tau_M_mtpv, abs(tau_M_ref)) * sign(tau_M_ref)

    return psi_s_abs_ref, tau_M_ref

4.2 各步骤的物理意义与切换条件

步骤 操作 物理意义 切换判据
1 psi_s_abs_mtpa = abs(psi_s_mtpa(tau_M_ref)) 按 MTPA 曲线计算目标磁链 默认优先 MTPA
2 clip(psi_s, psi_s_min, psi_s_max) 磁链硬限幅 \(\psi_{s,\text{MTPA}} \lt \psi_{s,\min}\)\(\gt \psi_{s,\max}\)
3 min(psi_s, psi_s_max_voltage) 电压极限弱磁:转速升高导致 \(\psi_{s,\max} = u_{s,\max}/\omega\) 减小 \(\omega \gt u_{s,\max}/\psi_{s,\text{MTPA}}\) 时触发
4 min(tau_cl, \|tau_{ref}\|) * sign 电流极限:给定磁链下查电流极限圆的最大转矩 当所需转矩超出电流圆与电压圆交集时触发
5 min(k_{mtpv} * tau_{mtpv}, \|tau_{ref}\|) * sign MTPV 极限:进一步限制到 MTPV 轨迹对应的转矩 当工作点越过 MTPV 轨迹时触发

关于 Step 2 的补充说明clip 的上下限由 psi_s_limits = (psi_s_min, psi_s_max) 决定。本仿真中 psi_s_min = psi_f \(\approx 0.1333\) Vs(默认值,等于永磁体磁链),psi_s_max = inf`(未设上限)。由于此 IPMSM 在正转矩区的 MTPA 磁链始终不低于 \(\psi_f\),且上限无界,Step 2 在本次仿真中未实际触发,但其作为安全兜底的限幅逻辑仍保留在代码中。

4.3 渐进式约束机制

motulator 使用 clip + min 的组合实现渐进式约束,而非硬切换:

  1. 无优先级冲突:每个约束独立施加,后一步的输入是前一步的输出
  2. 自动过渡:当转速从低到高变化时,Step 3 的 psi_s_max_voltage 自然减小,MTPA 磁链逐渐被”压”到电压极限以下
  3. MTPV 是最后的转矩软上限:即使磁链被电压限制住,转矩还可能受 MTPV 约束进一步下降

4.4 _get_mtpv_flux_and_torque() 的 LUT 查表

def _get_mtpv_flux_and_torque(self, psi_s_abs_ref):
    i_s = self.i_s_mtpv(psi_s_abs_ref)      # LUT 插值查电流
    psi_s = complex(self.par.psi_s_dq(i_s)) # 电流→磁链
    tau_M = 1.5 * self.par.n_p * (i_s * psi_s.conjugate()).imag
    return psi_s, tau_M

注意:这里以 \(\psi_s\) 幅值 为自变量查 MTPV 电流表,再反算磁链和转矩。如果请求点 \(\psi_{s,\text{ref}}\) 超出了预计算的 MTPV 表范围,插值器会外推,但实际中 Step 3 已将磁链限制在合理范围内。


5. CurrentVectorControl 流程与代码分析

CurrentVectorController 的核心同样由 ReferenceGenerator(第 4 节)负责生成受限的磁链/转矩参考值,但不同于 flux-vector 控制直接输出电压,CVC 增加了一个 CurrentController 内环,先将磁链/转矩参考转换为电流参考,再通过 d-q 电流 PI 控制器生成电压指令。本节分析 CVC 的数学原理与代码实现,并在 5.4 节与 flux-vector 控制进行系统对比。

5.1 整体架构

CurrentVectorController.compute_output() 的调用链:

tau_M_ref → ReferenceGenerator.compute_flux_and_torque_refs()
                → psi_s_ref, tau_M_ref (已限幅)
          → ReferenceGenerator.compute_current_ref(psi_s_ref, tau_M_ref)
                → i_s_ref (电流参考矢量)
          → CurrentController.compute_output(i_s_ref, fbk.i_s)
                → u_s_ref (电压参考矢量)
# _sm_current_vector.py
class CurrentVectorController:
    def compute_output(self, tau_M_ref: float, fbk: ObserverOutputs) -> References:
        ref = References(T_s=self.T_s, tau_M=tau_M_ref)
        ref.psi_s, ref.tau_M = self.reference_gen.compute_flux_and_torque_refs(
            ref.tau_M, fbk.w_m, fbk.u_dc
        )
        ref.i_s = self.reference_gen.compute_current_ref(ref.psi_s, ref.tau_M)
        ref.u_s = self.current_ctrl.compute_output(ref.i_s, fbk.i_s)
        return ref

5.2 CurrentController.compute_output()

CurrentController 继承自 ComplexPIController,其增益基于期望的闭环带宽 \(\alpha_c\) 和电感参数自动整定:

class CurrentController(ComplexPIController):
    def __init__(self, par, alpha_c, alpha_i=None):
        self.par = par
        alpha_i = alpha_c if alpha_i is None else alpha_i
        k_t = alpha_c
        k_i = alpha_c * alpha_i
        k_p = alpha_c + alpha_i
        super().__init__(k_p, k_i, k_t)

    def compute_output(self, i_ref: complex, i: complex, u_ff: complex = 0j) -> complex:
        # 将电流映射到磁链差值进行 PI 调节
        psi_ref = complex(self.par.psi_s_dq(i_ref)) - self.par.psi_f
        psi     = complex(self.par.psi_s_dq(i))     - self.par.psi_f
        return super().compute_output(psi_ref, psi, u_ff)

关键变量解析

变量 数学含义 物理意义
k_p \(\alpha_c + \alpha_i\) 比例增益
k_i \(\alpha_c \cdot \alpha_i\) 积分增益
k_t \(\alpha_c\) 参考前馈增益
psi_ref \(\psi_s(i_{ref}) – \psi_f\) 参考磁链(扣除永磁体磁链)
psi \(\psi_s(i) – \psi_f\) 实际磁链(扣除永磁体磁链)
u_s \(\text{PI}(\psi_{ref} – \psi)\) 电压参考矢量

磁链映射的物理意义

将电流误差映射到磁链误差进行 PI 控制,是 motulator 处理凸极效应 (\(L_d \neq L_q\)) 和磁饱和的巧妙方法。对于线性电机:

\[\psi_{ref} – \psi = L_d (i_{d,ref} – i_d) + j L_q (i_{q,ref} – i_q)\]

PI 控制器在磁链域工作,等效于在电流域自动补偿了 d-q 轴不同的电感增益。

5.3 CurrentController.update()

积分状态更新采用输出电压与实际电压的误差驱动:

def update(self, T_s: float, fbk: ObserverOutputs) -> None:
    self.observer.update(ref.T_s, fbk)
    self.current_ctrl.update(ref.T_s, fbk.u_s, fbk.w_c)

ComplexPIController.update() 内部按复数形式更新积分状态:

# _base.py (ComplexPIController)
def update(self, T_s, u, w):
    self.v += T_s * self.k_i * (self.u_ref - u)  # 积分项

其中 u_ref 为磁链参考,u 为实际磁链,w 为角频率(用于前馈解耦)。

5.4 与 Flux-Vector 控制的对比

虽然两者使用相同的 ReferenceGenerator,但 CVC 的电流内环会引入以下差异:

  1. 动态响应:电流环带宽 \(\alpha_c = 2\pi \times 400\) rad/s 高于 flux-vector 的转矩环带宽 \(2\pi \times 100\) rad/s,因此 CVC 对电流指令的跟踪更快,但在电压饱和时 PI 积分器可能出现 windup。

  2. 电压饱和行为:Flux-vector 控制器直接根据 flux/torque 误差计算电压,其饱和处理更直接;CVC 中电压饱和发生在电流 PI 输出端,可能导致 transient 期间的电流轨迹出现轻微过冲。

  3. 稳态一致性:在稳态非饱和区,两种控制器的电流轨迹理论上应完全重合,因为最终都收敛到 ReferenceGenerator 给出的同一组 \((i_d, i_q)\) 工作点。

  4. 工程适用性:CVC 是目前工业界最常见的 PMSM 控制策略,其内环电流控制便于独立调试和保护(过流保护可直接作用于电流环)。


6. 仿真验证与分析

以下通过 motulator 对一台内置式永磁同步电机 (IPMSM) 进行 3600 rpm 风机负载仿真,将实际电流轨迹绘制在 \(i_d\)\(i_q\) 平面上,并通过轨迹着色直观展示控制器在 MTPA → 弱磁 → MTPV 各模式间的实时切换过程。

6.1 仿真设置

参数 数值 说明
额定转速 3600 rpm 风机负载的额定工作点
直流母线电压 180 V / 150 V 两组对比工况
电流极限 \(I_{s,\max}\) 58 A (\(\approx\)2.0 pu) 黑色实线圆
电压利用系数 \(k_u\) 0.9 电压极限椭圆按 \(u_{s,\max}=k_u u_{dc}/\sqrt{3}\) 计算
负载类型 平方律风机负载 \(\tau_L \propto \omega_m^2\)

仿真从静止启动,0.1 s 后转速给定阶跃至 3600 rpm。控制器采用五步参考生成链(第 4 节),包含 MTPA、电压极限弱磁、电流极限截断和 MTPV 极限。

6.2 时域仿真波形与 \(i_d\)\(i_q\) 轨迹分析

首先,下面两图分别展示了直流母线电压 \(V_{\mathrm{dc}} = 180\,\mathrm{V}\)(标称)和 \(V_{\mathrm{dc}} = 150\,\mathrm{V}\)(降低)下的时域仿真波形。每组波形包含转速、电磁转矩、\(d\)/\(q\) 轴电流、定子电压幅值、磁链幅值以及直流母线电压标幺值六个子图。

时域仿真波形 \(V_{\mathrm{dc}} = 180\,\mathrm{V}\)

图:标称直流母线电压(\(V_{\mathrm{dc}} = 180\,\mathrm{V}\))下的时域仿真波形。\(V_{\mathrm{dc},\,\mathrm{nom}}\) 标幺值为 1.0。

时域仿真波形 \(V_{\mathrm{dc}} = 150\,\mathrm{V}\)

图:降低直流母线电压(\(V_{\mathrm{dc}} = 150\,\mathrm{V}\))下的时域仿真波形。\(V_{\mathrm{dc},\,\mathrm{nom}}\) 标幺值为 \(150/180 \approx 0.833\)。由于可用电压下降,稳态磁链被进一步压低,弱磁深度增加。


下图分别展示了两种直流母线电压下的 \(i_d\)\(i_q\) 轨迹,其中轨迹按控制器 active mode 分段着色

MTPV 仿真轨迹分析 \(V_{\mathrm{dc}} = 180\,\mathrm{V}\)

图:标称直流母线电压(\(V_{\mathrm{dc}} = 180\,\mathrm{V}\))下的 \(i_d\)\(i_q\) 轨迹。

MTPV 仿真轨迹分析 \(V_{\mathrm{dc}} = 150\,\mathrm{V}\)

图:降低直流母线电压(\(V_{\mathrm{dc}} = 150\,\mathrm{V}\))下的 \(i_d\)\(i_q\) 轨迹。电压椭圆整体缩小,弱磁起始点更早,稳态工作点更靠近电流极限圆与 MTPV 极限的交集。

颜色 模式 说明
青色 MTPA 无约束,按 MTPA 曲线查表
橙色 Voltage weakening 电压极限导致磁链被压低
红色 Current limit 电流极限导致转矩被截断
品红色 MTPV limit MTPV 轨迹导致转矩进一步受限

:本次仿真中 Mode 2(Flux limit,金色)未触发。原因是控制器配置中 psi_s_min = psi_f \approx 0.1333$ Vs(永磁体磁链),而此 IPMSM 在 MTPA 下的磁链幅值始终不低于该下限;同时 psi_s_max = \infty$,上限亦无约束。因此五步链实际表现为”四步”可见,但 Step 2 的限幅逻辑仍保留在代码中作为安全兜底。

图中叠加了磁链等高线、电流极限圆(黑色实线)、电压极限椭圆(灰色虚线)和 MTPA 理论曲线(青色虚线)。注意:由于仿真中转速实时变化,固定转速下的 MTPV 理论曲线不再叠加。轨迹上的绿色圆点为起点,红色圆点为稳态终点,箭头表示运动方向。

低转速区:MTPA 主导(青色段)

轨迹从原点 \((0,0)\) 出发后,迅速向右上方的 MTPA 曲线(青色虚线)靠近。在此阶段,转速较低,电压极限椭圆很大(尤其是 1000 rpm 的灰色椭圆),磁链尚未受到电压约束。控制器执行 Step 1(MTPA 查表),轨迹呈现青色,电流工作点由转矩需求决定,位于 MTPA 曲线上或其附近。

中转速区:电压极限弱磁(橙色/红色段)

随着转速升高,电压极限椭圆逐渐收缩。当转速超过约 2000–3000 rpm 时,MTPA 对应的磁链已超出当前转速下的电压极限(椭圆边界)。此时 Step 3 的 min(psi_s, psi_s_max_voltage) 生效,磁链被强制压低,轨迹转为橙色。在加速过程中,若所需转矩超出电流极限圆与电压圆交集,Step 4 进一步截断转矩,轨迹出现短暂的红色段。电流工作点从 MTPA 曲线滑向电压极限椭圆与电流极限圆的交集区域。

高转速区:MTPV 极限(品红色段)

在 3600 rpm 及更高转速下,电压极限椭圆进一步收缩,即使磁链已被电压限制,转矩仍可能超出 MTPV 极限允许的最大值。Step 5 将转矩参考截断到 MTPV 极限以下,轨迹变为品红色。最终稳态工作点落在 MTPV 极限区域(略偏内侧,由系数 \(k_{\text{mtpv}}=0.85\) 决定裕量)。图中品红色终点验证了五步链的最终约束效果。

暂态 \(i_d \gt 0\) 区段的机理

\(i_d\)\(i_q\) 轨迹可以观察到,仿真中存在一段明显的 \(i_d \gt 0\)(第一象限)暂态轨迹。该现象的产生机理如下:

  1. 初始加速:转速阶跃后,控制器首先按 MTPA 规划,轨迹从原点迅速向上半平面移动,此时 \(i_d \lt 0\)\(i_q \gt 0\)
  2. MTPV 激活:随着转速升高,MTPV 模式激活,\(i_d\) 被推向更负的方向(左半平面移动)。
  3. 退出 MTPV、进入电流极限:在暂态过程中,电流 PI 内环试图跟踪参考电流,但当电压达到饱和极限时,CurrentController 的积分器发生 windup,导致电流矢量出现超调和振荡。中途退出 MTPV 约束、进入电流极限模式后,\(i_d\) 再次呈现增加趋势。
  4. 第二次 MTPA 过渡:上述 \(i_d\) 增加趋势触发了第二次 MTPA 阶段,控制器将 \(i_d\) 从第一象限重新拉回第二象限,但过程中伴随明显的振荡环(轨迹图中可见的大回环)。

\(i_d \gt 0\) 区段并非稳态工作点,而是大信号暂态下电流 PI 内环在电压饱和边界处 windup 与退饱和过程的直接后果。稳态后电流始终位于 \(i_d \lt 0\) 的弱磁区,最终稳定在品红色 MTPV 段。

关键原因CurrentVectorController 通过显式的 CurrentController 内环直接控制 \(i_d\)\(i_q\)。在电压未饱和区,电流环跟踪性能良好;但在电压饱和边界处,PI 积分器的 windup 会导致电流暂态偏离参考轨迹,形成图中可见的大回环。与 flux-vector 控制相比,CVC 的暂态振荡幅度通常更小(因为电流环带宽 \(2\pi \times 400\) rad/s 更高),但 windup 效应使轨迹在饱和边界附近出现更密集的”贴近”行为。

6.3 不同直流母线电压对比

对比项 \(V_{dc}=180\) V (左图) \(V_{dc}=150\) V (右图)
电压极限椭圆尺寸 较大 较小
弱磁起始转速 较高(约 3000 rpm 后显著) 较低(约 2000 rpm 即明显)
稳态工作点 品红色 MTPV 段更长 品红色 MTPV 段更早出现且更长
动态过程 青色/橙色段在椭圆外侧停留更久 更早进入品红色 MTPV 段

直流母线电压降低 30 V(16.7%)直接导致电压极限椭圆等比例缩小。在 150 V 工况下,3600 rpm 对应的椭圆已大幅收缩,控制器必须更早、更深地注入负向 \(i_d\) 电流进行弱磁,以维持电压平衡。这也导致稳态时 \(i_d\) 更负、\(i_q\) 略低,转矩能力相应下降。

6.4 风机负载特性的影响

风机负载为平方律负载 (\(\tau_L \propto \omega_m^2\)),其特点在于:

  1. 启动转矩低:静止时负载转矩接近零,电机只需克服惯性,因此启动电流较小,轨迹从原点附近平稳出发。
  2. 加速过程非单调:随着转速上升,负载转矩按平方增长,而控制器不断调整磁链和转矩参考。图中轨迹在上升过程中出现小幅振荡和回环(尤其在品红色与橙色过渡区),这是风机负载转矩与转速强耦合、以及电流环动态响应共同作用的结果。
  3. 稳态功率匹配:最终稳态时,电磁转矩与风机负载转矩平衡,工作点稳定在电压极限、电流极限和 MTPV 约束的交集附近。由于风机负载在额定转速处转矩最大,稳态点通常位于较高转速对应的电压椭圆边界上。

6.5 小结

仿真轨迹清晰展示了 motulator 五步切换链的实际效果:

  • MTPA 优先(青色):低转速区转矩最大化
  • 电压弱磁自然过渡(橙色):中转速区椭圆收缩自动压低磁链,无硬切换
  • 电流极限截断(红色):过渡区转矩被电流圆限制
  • MTPV 最终兜底(品红色):高转速区转矩被限制在电压最优轨迹上
  • 渐进式约束clip + min 组合实现了平滑、无抖动的模式过渡,颜色变化直观反映了这一过程

不同直流母线电压的对比进一步说明,电压极限是决定弱磁深度和高速转矩能力的关键边界条件。


7. 附录

7.1 Brentq 求根算法(MTPA & MTPV 统一视角)

motulator 在 MTPA 和 MTPV 的轨迹预计算中均采用 scipy.optimize.root_scalar(..., method="brentq")。Brentq 是二分法 + 割线法 + 反二次插值的混合算法,兼具二分法的稳健性和割线法的超线性收敛。

MTPA 求根

搜索变量为电流角 \(\gamma\),搜索区间为 \([\pi/2, \pi]\)(IPMSM 的 MTPA 电流角必然在第二象限):

def mtpa_cond(gamma):
    i_s_dq = i_s_abs * np.exp(1j * gamma)
    psi_a_dq = par.aux_flux(i_s_dq)
    return np.real(psi_a_dq * np.conj(i_s_dq))  # 求此函数的根

gamma_opt = root_scalar(mtpa_cond, bracket=[np.pi/2, np.pi], method="brentq").root

MTPV 求根

搜索变量为磁链角 \(\delta\),搜索区间同样为 \([\pi/2, \pi]\)(IPMSM 的 MTPV 轨迹位于第二象限,\(i_d \lt 0, i_q \gt 0\)):

def mtpv_cond(delta):
    psi_s_dq = psi_s_abs * np.exp(1j * delta)
    i_s_dq = par.iterate_i_s_dq(psi_s_dq)
    i_a_dq = par.aux_current(i_s_dq)
    return np.real(i_a_dq * np.conj(psi_s_dq))

delta_opt = root_scalar(mtpv_cond, bracket=[np.pi/2, np.pi], method="brentq").root

算法要点

特性 说明
括号区间 \([\pi/2, \pi]\):IPMSM 的最优轨迹均位于第二象限
根存在性检验 cond(a) * cond(b) > 0 表示区间内无符号变化,返回 nan(如表贴式电机 \(L_d=L_q\) 时不存在 MTPV)
收敛性 每步迭代保证根区间缩小,适合离线预计算 LUT
离散密度 默认 16 点即可覆盖全场,计算量极小

LUT 插值器

求根完成后,源码构造可调用插值器供在线查表:

# MTPA: 由转矩查电流
MTPALocus(i_s_dq_vs_tau_M=lambda x: np.interp(x, tau_M, i_s_dq))

# MTPV: 由磁链幅值查电流/转矩
MTPVLocus(
    tau_M_vs_psi_s_abs=lambda x: np.interp(x, abs(psi_s_dq), tau_M),
    i_s_dq_vs_psi_s_abs=lambda x: np.interp(x, abs(psi_s_dq), i_s_dq),
)

7.2 符号对照表

符号 含义 单位
\(\psi_s\) 定子磁链矢量 Vs
\(\psi_a\) 辅助磁链 (auxiliary flux) Vs
\(i_a\) 辅助电流 (auxiliary current) A
\(i_s\) 定子电流矢量 A
\(\gamma\) 电流角 (\(i_s\) 的幅角) rad
\(\delta\) 磁链角 (\(\psi_s\) 的幅角) rad
\(c_\tau\) 转矩产生因子
\(t_\psi, t_\tau\) 磁链/转矩控制方向向量
\(k_u\) 电压利用系数
\(k_{\text{mtpv}}\) MTPV 裕量系数

7.3 函数对照表

函数 输入 输出 用途
aux_flux(i_s_dq) 电流矢量 辅助磁链 \(\psi_a\) MTPA 条件判断
aux_current(i_s_dq) 电流矢量 辅助电流 \(i_a\) MTPV 条件判断
compute_mtpa_current_angle(i_s_abs) 电流幅值 最优电流角 \(\gamma\) Brentq 求根
compute_mtpv_flux_angle(psi_s_abs) 磁链幅值 最优磁链角 \(\delta\) Brentq 求根
psi_s_dq(i_s_dq) 电流矢量 磁链矢量 电流→磁链映射
i_s_dq(psi_s_dq) 磁链矢量 电流矢量 磁链→电流映射
iterate_i_s_dq(psi_s_dq) 磁链矢量 电流矢量(迭代求解) 饱和电机磁链→电流

8. 关键代码索引

功能 文件 方法/类
辅助磁链定义 utils/_parameters.py BaseSynchronousMachinePars.aux_flux()
辅助电流定义 utils/_parameters.py BaseSynchronousMachinePars.aux_current()
MTPA 电流角求根 utils/_sm_control_loci.py ControlLoci.compute_mtpa_current_angle()
MTPA 轨迹预计算 utils/_sm_control_loci.py ControlLoci.compute_mtpa_locus()
MTPV 磁链角求根 utils/_sm_control_loci.py ControlLoci.compute_mtpv_flux_angle()
MTPV 轨迹预计算 utils/_sm_control_loci.py ControlLoci.compute_mtpv_locus()
电流极限轨迹 utils/_sm_control_loci.py ControlLoci.compute_const_current_locus()
五步参考生成 control/_sm_reference_gen.py ReferenceGenerator.compute_flux_and_torque_refs()
MTPA 磁链查表 control/_sm_reference_gen.py ReferenceGenerator._get_mtpa_flux()
MTPV 查表 control/_sm_reference_gen.py ReferenceGenerator._get_mtpv_flux_and_torque()
电流极限转矩 control/_sm_reference_gen.py ReferenceGenerator._get_current_limit_torque()
电压极限磁链 control/_sm_reference_gen.py ReferenceGenerator._get_max_flux()
电流控制器 control/_sm_current_vector.py CurrentController.compute_output()
积分状态更新 control/_sm_current_vector.py CurrentController.update()
矢量控制器总控 control/_sm_current_vector.py CurrentVectorController.compute_output()
与 flux-vector 对比 本文第 5.4 节 CurrentVectorController vs FluxVectorController

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注