本文基于 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,最大转矩电流比)条件定义为:在恒定电流幅值下,转矩对电流角的导数为零。
MTPA 条件:\(d\tau_M/d\gamma = 0\),其中 \(\gamma\) 为电流角。
通过辅助磁链 \(\psi_a\)(auxiliary flux),可将该条件写成正交形式:
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) 的实现步骤:
- 在 \([0, i_{s,\max}]\) 内线性取 16 个电流幅值点
- 对每个幅值,用 Brentq 求根 \(\operatorname{Re}(\psi_a \cdot i_s^*) = 0\),得到 MTPA 电流角 \(\gamma\)
- 计算 \(i_{s,dq} = |i_s| \cdot \exp(1j \cdot \gamma)\),并通过
psi_s_dq()得到对应磁链 - 计算转矩 \(\tau_M = 1.5 \cdot n_p \cdot \operatorname{Im}(i_{s,dq} \cdot \psi_{s,dq}^*)\)
- 封装为
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 问题设定
在高速弱磁区,电机电压受限于直流母线:
对于给定转速 \(\omega_m\),磁链幅值 \(|\psi_s|\) 被限制在最大值以下。此时最大转矩电压比 (MTPV) 的问题可表述为:
在磁链幅值 \(|\psi_s|\) 恒定的约束下,寻找使电磁转矩最大的工作点。
3.2 解析条件
更精确地说,MTPV 是电压极限下不同转速对应的最优轨迹。当转速继续升高、电压极限圆收缩时,MTPV 轨迹给出了每个磁链水平下能产生的最大转矩。其数学条件为:
其中 \(\delta\) 是磁链矢量在 dq 坐标系中的角度,\(\psi_s = |\psi_s| e^{j\delta}\)。
3.3 辅助电流 \(i_a\) 的定义与推导
在 MTPA 分析中,motulator 使用辅助磁链 \(\psi_a\) 将 MTPA 条件写成正交形式:
类似地,MTPV 引入辅助电流 \(i_a\)(motulator 源码中名为 i_a_dq),将条件写成对偶形式:
在 _parameters.py 的 aux_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\) 时:
代入 \(\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\) 展开为:
整理后正是 IPMSM 的经典 MTPV 双曲线方程:
或写成:
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 的组合实现渐进式约束,而非硬切换:
- 无优先级冲突:每个约束独立施加,后一步的输入是前一步的输出
- 自动过渡:当转速从低到高变化时,Step 3 的
psi_s_max_voltage自然减小,MTPA 磁链逐渐被”压”到电压极限以下 - 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\)) 和磁饱和的巧妙方法。对于线性电机:
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 的电流内环会引入以下差异:
- 动态响应:电流环带宽 \(\alpha_c = 2\pi \times 400\) rad/s 高于 flux-vector 的转矩环带宽 \(2\pi \times 100\) rad/s,因此 CVC 对电流指令的跟踪更快,但在电压饱和时 PI 积分器可能出现 windup。
- 电压饱和行为:Flux-vector 控制器直接根据 flux/torque 误差计算电压,其饱和处理更直接;CVC 中电压饱和发生在电流 PI 输出端,可能导致 transient 期间的电流轨迹出现轻微过冲。
-
稳态一致性:在稳态非饱和区,两种控制器的电流轨迹理论上应完全重合,因为最终都收敛到
ReferenceGenerator给出的同一组 \((i_d, i_q)\) 工作点。 -
工程适用性: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},\,\mathrm{nom}}\) 标幺值为 1.0。

图:降低直流母线电压(\(V_{\mathrm{dc}} = 150\,\mathrm{V}\))下的时域仿真波形。\(V_{\mathrm{dc},\,\mathrm{nom}}\) 标幺值为 \(150/180 \approx 0.833\)。由于可用电压下降,稳态磁链被进一步压低,弱磁深度增加。
下图分别展示了两种直流母线电压下的 \(i_d\)–\(i_q\) 轨迹,其中轨迹按控制器 active mode 分段着色:

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

图:降低直流母线电压(\(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\)(第一象限)暂态轨迹。该现象的产生机理如下:
- 初始加速:转速阶跃后,控制器首先按 MTPA 规划,轨迹从原点迅速向上半平面移动,此时 \(i_d \lt 0\)、\(i_q \gt 0\)。
- MTPV 激活:随着转速升高,MTPV 模式激活,\(i_d\) 被推向更负的方向(左半平面移动)。
- 退出 MTPV、进入电流极限:在暂态过程中,电流 PI 内环试图跟踪参考电流,但当电压达到饱和极限时,
CurrentController的积分器发生 windup,导致电流矢量出现超调和振荡。中途退出 MTPV 约束、进入电流极限模式后,\(i_d\) 再次呈现增加趋势。 - 第二次 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\)),其特点在于:
- 启动转矩低:静止时负载转矩接近零,电机只需克服惯性,因此启动电流较小,轨迹从原点附近平稳出发。
- 加速过程非单调:随着转速上升,负载转矩按平方增长,而控制器不断调整磁链和转矩参考。图中轨迹在上升过程中出现小幅振荡和回环(尤其在品红色与橙色过渡区),这是风机负载转矩与转速强耦合、以及电流环动态响应共同作用的结果。
- 稳态功率匹配:最终稳态时,电磁转矩与风机负载转矩平衡,工作点稳定在电压极限、电流极限和 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 |