PMSM 驱动系统参数与最优控制原理分析 – 炸管小王子

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


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_\tau\) \(2\pi \times 100\) rad/s
磁链环带宽 \(\alpha_\psi\) \(2\pi \times 100\) rad/s
积分作用带宽 \(\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

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 = \infty$(未设上限)。由于此 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. FluxTorqueControl 流程与代码分析

FluxVectorController 的核心由两个子模块组成:ReferenceGenerator(第 4 节)负责生成受限的磁链/转矩参考值,FluxTorqueController 负责将参考值转化为电压指令。本节分析后者的数学原理与代码实现。

5.1 整体架构

FluxVectorController.compute_output() 的调用链:

tau_M_ref → ReferenceGenerator.compute_flux_and_torque_refs()
                → psi_s_ref, tau_M_ref (已限幅)
          → FluxTorqueController.compute_output(psi_s_ref, tau_M_ref, fbk)
                → u_s_ref (电压参考矢量)
# _sm_flux_vector.py
class FluxVectorController:
    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.u_s = self.flux_torque_ctrl.compute_output(ref.psi_s, ref.tau_M, fbk)
        return ref

5.2 FluxTorqueController.compute_output()

该方法基于输入-输出线性化(input-output linearization)思想,分别对磁链幅值和电磁转矩构造解耦的控制律。

class FluxTorqueController:
    def compute_output(self, psi_s_ref, tau_M_ref, fbk):
        par = self.par
        gain = self.gain

        # 辅助电流与转矩产生因子
        i_a = complex(par.aux_current(fbk.i_s))
        c_tau = 1.5 * par.n_p * (i_a * fbk.psi_s.conjugate()).real

        # 控制方向向量
        t_psi = 1.5 * par.n_p * abs(fbk.psi_s) * i_a / c_tau if c_tau > 0 else 1
        t_tau = 1j * fbk.psi_s / c_tau if c_tau > 0 else 0

        # 误差信号
        e_psi = psi_s_ref - abs(fbk.psi_s)
        e_tau = tau_M_ref - fbk.tau_M
        e_u = gain.alpha_psi * e_psi * t_psi + gain.alpha_tau * e_tau * t_tau
        u_i = self.x_psi * t_psi + self.x_tau * t_tau
        e_v = u_i - gain.alpha_i * (abs(fbk.psi_s) * t_psi + fbk.tau_M * t_tau)

        # 电压参考 = 前馈 + 反馈
        v = par.R_s * fbk.i_s + 1j * fbk.w_m * fbk.psi_s + e_v
        u_s_ref = v + e_u

        self._i_a = i_a
        self._v = v
        return u_s_ref

关键变量解析

变量 数学含义 物理意义
i_a \(i_a = \text{aux_current}(i_s)\) 辅助电流(见第 3.3 节)
c_tau \(c_\tau = 1.5 n_p \operatorname{Re}(i_a \psi_s^*)\) 转矩对电压方向的敏感度
t_psi \(t_\psi\) 磁链幅值的控制方向
t_tau \(t_\tau\) 电磁转矩的控制方向
e_u \(\alpha_\psi e_\psi t_\psi + \alpha_\tau e_\tau t_\tau\) 比例控制律
u_i \(u_i = x_\psi t_\psi + x_\tau t_\tau\) 积分作用输出
v \(v = R_s i_s + j\omega_m \psi_s + e_v\) 稳态前馈 + 积分修正

方向向量的推导

磁链幅值 \(|\psi_s|\) 和转矩 \(\tau_M\) 对电压矢量的变化率可通过辅助电流 \(i_a\) 表达:

  • 磁链方向:\(t_\psi \propto i_a\)(与辅助电流同向)
  • 转矩方向:\(t_\tau \propto j\psi_s\)(与磁链正交)

两者的点积满足 \(t_\psi \cdot t_\tau^* = 0\),实现了解耦控制。

5.3 FluxTorqueController.update()

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

def update(self, T_s: float, fbk: ObserverOutputs) -> None:
    par = self.par
    gain = self.gain
    e = fbk.u_s - self._v                    # 电压误差
    k_psi = gain.alpha_i / abs(fbk.psi_s) if abs(fbk.psi_s) > 0 else 0
    k_tau = 1.5 * par.n_p * gain.alpha_i
    self.x_psi += T_s * k_psi * (fbk.psi_s * e.conjugate()).real
    self.x_tau += T_s * k_tau * (1j * self._i_a * e.conjugate()).real

积分增益 \(k_\psi\)\(k_\tau\) 分别与磁链幅值和辅助电流的内积相关,保证积分作用仅在对应的方向上累积。


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、进入电流极限:在暂态过程中,由于 flux-torque 控制器没有直接电流内环,电流矢量出现振荡。中途退出 MTPV 约束、进入电流极限模式后,\(i_d\) 再次呈现增加趋势。
  4. 第二次 MTPA 过渡:上述 \(i_d\) 增加趋势触发了第二次 MTPA 阶段,控制器将 \(i_d\) 从第一象限重新拉回第二象限,但过程中伴随明显的振荡环(轨迹图中可见的大回环)。

\(i_d \gt 0\) 区段并非稳态工作点,而是大信号暂态下 flux-torque 控制无电流内环的直接后果。稳态后电流始终位于 \(i_d \lt 0\) 的弱磁区,最终稳定在品红色 MTPV 段。

关键原因:FluxTorqueController 直接控制的是磁链幅值 \(|\psi_s|\) 和转矩 \(\tau_M\),而非 \(i_d\)\(i_q\)。因此,即使参考生成器按 MTPA 表规划了理想电流,实际电流矢量只是电压控制的 emergent 结果,在阶跃暂态中会出现显著超调和轨迹偏离。

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()
FluxTorque 控制器 control/_sm_flux_vector.py FluxTorqueController.compute_output()
积分状态更新 control/_sm_flux_vector.py FluxTorqueController.update()
矢量控制器总控 control/_sm_flux_vector.py FluxVectorController.compute_output()

发表回复

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