11弱磁控制

电压极限、负 Id、恒功率区

本模块主旨
弱磁 = 用负 Id 削等效磁链,把 BEMF 压回母线电压能买单的范围。

学完应能回答

查看完整 Walkthrough(9 步 + 5 误区)

总览
弱磁 = 用一部分电流"买"电压余量,是高速运行不可绕开的电压预算管理。

零基础速入

类比
弱磁就像汽车上**自动换挡**——低速齿轮(1 档)扭矩大但速度上限低;高速时换 4 档,扭矩变小但能跑更快。电机里"档位"不是机械的,是电气的:通过注入负 Id 削弱永磁磁链,让反电动势降下来,给逆变器输出腾出电压余量。
核心概念
高速时 BEMF = Ke·ω 接近母线电压上限,电流环没电压可用,输出饱和。注入 −Id 削弱等效磁链 → BEMF 减小 → 电压余量恢复 → 还能再上速度(代价:转矩下降)。

为什么要学

第一手操作
右侧把"目标转速"从 4200 rpm 推到 8000 rpm,看左下角红色警告"电压饱和"亮起。然后把 Id 拖到 -3A,看红色椭圆(电压极限)变大;继续 -5A,警告消失,进入安全工作区。

学习目标

核心概念

公式

PMSM 稳态电压方程(dq)
Vd = R·Id − ω·Lq·Iq\nVq = R·Iq + ω·(Ld·Id + ψf)

高速时 R·I 项 ≪ ω·L·I 项,电压基本由"反电动势 + 交叉耦合"决定。

电压幅值
|V| = √(Vd² + Vq²) ≤ V_max = Udc/√3

V_max 是 SVPWM 线性区上限。超出 → 过调制 → 电流环失控。

BEMF 抵消(弱磁条件)
−ω·Ld·Id ≈ ω·ψf

负 Id 让"等效磁链 ψf + Ld·Id"变小,反电动势降低,腾出电压。

MTPA / MTPV
MTPA: Iq² + (Lq−Ld)·Id·Iq − ψf·Id = 0\nMTPV: 沿电压椭圆边界优化 Iq

MTPA = 同电流下最大转矩;MTPV = 同电压下最大转矩。前者用于低速,后者用于深度弱磁。

工程意义

STM32 移植指南

常见误区

  • 只加目标速度不检查电压余量,电流环输出长期撞限。
  • 负 Id 加得过大 → 电流圆撞限 + 退磁风险。
  • 弱磁 PI 增益过大 → Id 命令震荡 → 转矩抖动。
  • 没设最低速度阈值 → 低速也启用弱磁,无谓损耗。

调试方法

建议实验

STM32 C 代码骨架

/* ============================================
 * field_weakening.c — 自动弱磁控制(电压幅值闭环)
 * 输出 Id 命令给电流环
 * ============================================ */
#include "pi.h"

typedef struct {
    pi_t pi_fw;            // 弱磁 PI(输入:电压余量误差,输出:Id 命令)
    float v_max;           // SVPWM 线性区上限 = 0.95 × Udc/√3
    float id_min;          // 最负 Id 上限(退磁安全 + 电流圆)
    float i_max;           // 电流圆 |I| ≤ I_max
    float deadband;        // |V|/V_max < 该值不弱磁
} fw_ctrl_t;

void fw_init(fw_ctrl_t *f, float udc, float i_max, float id_min) {
    f->v_max = 0.95f * udc * 0.57735027f;     // 1/√3
    f->id_min = id_min;
    f->i_max = i_max;
    f->deadband = 0.93f;     // 在 95% 之前不动作

    /* 弱磁 PI:误差大时快速注入 Id(负方向) */
    pi_init(&f->pi_fw, 0.5f, 100.0f, 1.0f/2000.0f,
            id_min,    /* out_min: 最大负 Id */
            0.0f);     /* out_max: 不主动注入正 Id */
}

/* 输入:当前 Vd / Vq,当前 Iq;输出:Id 参考 */
float fw_compute_id_ref(fw_ctrl_t *f, float vd, float vq, float iq_ref) {
    float v_mag = sqrtf(vd*vd + vq*vq);
    float v_ratio = v_mag / f->v_max;

    /* 死区内不动作 */
    if (v_ratio < f->deadband) {
        pi_reset(&f->pi_fw);
        return 0.0f;
    }

    /* 误差 = 1.0 - 当前比值(负值表示已超限,需要更负 Id) */
    float err = 1.0f - v_ratio;
    float id_ref = pi_step(&f->pi_fw, 0.0f, -err);    /* 注:符号约定 */

    /* 电流圆约束:|Id|² + Iq² ≤ I_max² */
    float iq_sq = iq_ref * iq_ref;
    float id_max_circle = -sqrtf(f->i_max * f->i_max - iq_sq);
    if (id_ref < id_max_circle) id_ref = id_max_circle;

    return id_ref;
}

/* 用法(在速度环之后、电流环之前):
 *   id_ref = fw_compute_id_ref(&fw, vd_last, vq_last, iq_ref);
 *   // 现在 id_ref + iq_ref 进入电流环
 *
 * === 调试要点 ===
 * 1. v_max 必须留余量(90-95%),否则在边界震荡
 * 2. id_min 由两条线决定:电流圆 + 退磁阈值(取严的那条)
 * 3. PI 增益太大 → Id 命令震荡 → 转矩抖动;太小 → 弱磁响应慢
 */

下一步

随堂题

高速时电流环输出 |V| 撞限,电机不再加速。最直接的解决方案?
  1. 加大 Iq
  2. 注入负 Id 削弱磁链 (正确)
  3. 提高 PWM 频率
  4. 降低控制带宽
提示:负 Id 让等效磁链 ψf + Ld·Id 变小 → BEMF 降低 → 电压余量恢复 → 速度还能再上。
电流极限圆和电压极限椭圆,哪个对低速不构成约束?
  1. 电流圆
  2. 电压椭圆 (正确)
  3. 都构成
  4. 都不构成
提示:低速 ω 小,电压椭圆很大,包住整个电流圆。电流圆才是低速时的硬限。高速 ω 大,椭圆收缩到电流圆内部,先撞。
负 Id 加到极大可能造成的不可逆危害?
  1. 过流
  2. 过压
  3. 永磁体退磁(磁性永久损失) (正确)
  4. 过热
提示:深度负 Id 产生的反向磁场如果超过永磁体矫顽力,磁性永久减弱(退磁)。每个永磁电机都有退磁阈值(厂家给),工程上 Id 限制必须严格守这条线。
MTPA(最大转矩电流比)控制策略适用什么阶段?
  1. 低速恒转矩区 (正确)
  2. 高速弱磁区
  3. 深度弱磁区
  4. 所有区域
提示:MTPA = 同样电流幅值下产生最大转矩。在没撞电压限的恒转矩区效率最优。撞了电压限就要切换到弱磁(恒功率)区策略。
母线电压 Udc 从 48V 降到 24V,弱磁开始介入的转速大约怎么变?
  1. 不变
  2. 提高一倍
  3. 降低一半 (正确)
  4. 提高一倍开方
提示:V_max 与 Udc 成正比,电压椭圆半径缩一半。BEMF = Ke·ω 撞 V_max 时 ω 也减半,所以弱磁介入速度对半。