14压缩机启动状态机

V/f → HFI → BEMF → 弱磁全过程

本模块主旨
7 段启动状态机:idle → precharge → align → V/f → HFI → BEMF → fieldweak,每段有显式进入/退出条件。

学完应能回答

查看完整 Walkthrough(8 步 + 4 误区)

总览
压缩机启动 = 7 状态状态机 + 反液击斜坡 + 平滑切换。这是工程化交付的"骨架"。

零基础速入

类比
压缩机启动像飞机起飞——上电(停机检查)→ 母线预充电(滑行)→ 转子对齐(找跑道方向)→ V/f 拖动(推力起跑)→ HFI 接管(收起落架)→ BEMF 闭环(爬升)→ 弱磁(巡航)。每个阶段有进入/退出条件,跳错顺序就翻车。
核心概念
一台靠谱的压缩机变频器内部就是一个清晰的 7 状态状态机,每个状态做一件事、有进入/退出条件、出错有兜底。

为什么要学

第一手操作
右侧把"加速斜坡"从 600 rpm/s 拉到 3000,模拟违规快速启动;看 Iq 电流瞬间撞高(液击隐患)。再拉回 400,曲线平滑。

学习目标

核心概念

公式

反液击斜坡上限
dω/dt ≤ ω_ramp_max

行业经验:300-800 rpm/s。具体看压缩机厂商手册。

V/f 启动电压
V_phase = V_min + (V_rated/ω_rated) · ω

低速给一个最小电压克服阻性压降,确保电机能动起来。

阶段切换边界
HFI: ω < 5% rated; BEMF: 5-100% rated; 弱磁: ω > 80% rated

边界要带滞回避免在临界点反复切换。

工程意义

STM32 移植指南

常见误区

  • 没设 timeout,HFI 永远等不到 BEMF 切入。
  • 加速斜坡过陡 → 液击。
  • V/f 启动电压过大 → 启动电流超限触发硬件保护。

调试方法

建议实验

STM32 C 代码骨架

/* compressor_startup.c — 7 状态启动状态机 */

typedef enum {
    STATE_IDLE,
    STATE_PRECHARGE,
    STATE_ALIGN,
    STATE_OPEN_LOOP,
    STATE_HFI,
    STATE_BEMF,
    STATE_FIELDWEAK,
    STATE_FAULT
} startup_state_t;

typedef struct {
    startup_state_t state;
    uint32_t state_enter_ms;
    float rpm_ref;
    float rpm_actual;
    float accel_ramp_rpm_s;
} startup_ctx_t;

void startup_tick(startup_ctx_t *ctx, float dt) {
    uint32_t age = HAL_GetTick() - ctx->state_enter_ms;

    switch (ctx->state) {
    case STATE_IDLE:
        if (cmd_start_received()) goto_state(ctx, STATE_PRECHARGE);
        break;

    case STATE_PRECHARGE:
        if (g_state.udc > UDC_OK_THRESHOLD && age > 200) {
            goto_state(ctx, STATE_ALIGN);
        }
        if (age > 2000) goto_fault(ctx, FAULT_PRECHARGE_TIMEOUT);
        break;

    case STATE_ALIGN:
        /* 给 d 轴施加直流让转子归零 */
        set_open_loop_voltage(ALIGN_VD, 0, 0);
        if (age > ALIGN_DURATION_MS) {
            ENCODER->CNT = 0;       // 清编码器零位
            goto_state(ctx, STATE_OPEN_LOOP);
        }
        break;

    case STATE_OPEN_LOOP:
        ctx->rpm_ref += ctx->accel_ramp_rpm_s * dt;
        if (ctx->rpm_ref >= HFI_HANDOFF_RPM) {
            goto_state(ctx, STATE_HFI);
        }
        break;

    case STATE_HFI:
        ctx->rpm_ref += ctx->accel_ramp_rpm_s * dt;
        if (ctx->rpm_ref >= BEMF_HANDOFF_RPM && bemf_lock_quality_ok()) {
            goto_state(ctx, STATE_BEMF);
        }
        break;

    case STATE_BEMF:
        ctx->rpm_ref = ramp_to(ctx->rpm_ref, ctx->target_rpm,
                               ctx->accel_ramp_rpm_s * dt);
        if (ctx->rpm_actual > FIELDWEAK_RPM) {
            goto_state(ctx, STATE_FIELDWEAK);
        }
        break;

    case STATE_FIELDWEAK:
        /* 弱磁不是新状态,是 BEMF 上的修饰;这里允许双向切换 */
        if (ctx->rpm_actual < FIELDWEAK_RPM - HYST) {
            goto_state(ctx, STATE_BEMF);
        }
        break;

    case STATE_FAULT:
        disable_pwm();
        break;
    }
}

/* 关键:状态切换时记录黑匣子 + 重置 PI 积分器 */
void goto_state(startup_ctx_t *ctx, startup_state_t next) {
    snapshot_log(ctx->state, next, HAL_GetTick());
    pi_reset(&pi_iq);
    pi_reset(&pi_id);
    ctx->state = next;
    ctx->state_enter_ms = HAL_GetTick();
}

下一步

随堂题

压缩机启动状态机第一个状态是什么?
  1. 对齐
  2. 母线预充电 (正确)
  3. V/f 启动
  4. BEMF
提示:上电后母线电容是空的,必须先经过限流电阻缓慢预充电(~200ms)才能切到正常工作母线,否则瞬间冲击电流过大。
反液击斜坡 600 rpm/s 是啥意思?
  1. 每秒最多升 600 rpm (正确)
  2. 每分钟
  3. 每小时
  4. 每毫秒
提示:加速度上限 600 rpm/s 意味着 0→3000 rpm 至少要 5 秒。这是行业经验值,过快会让液态制冷剂被压缩损坏阀片。
从 HFI 切到 BEMF 的判据除"转速达到阈值"外还应该有什么?
  1. 没有
  2. BEMF 信号质量足够(幅值 > 阈值,PLL 已锁定) (正确)
  3. 时间到了
  4. 硬件就绪
提示:光看转速不够。要确认 BEMF 信号信噪比足以让 SMO 稳定锁相,否则切过去角度立刻发散。常用滞回比较器避免抖动。
状态切换时为什么要重置 PI 积分器?
  1. 代码规范
  2. 上一状态积累的积分项与新状态不匹配,会引起切换瞬态超调 (正确)
  3. 内存优化
  4. 降低延迟
提示:V/f 阶段没有电流环;进入 HFI/BEMF 闭环时 PI 积分应从 0 开始,否则会有一个错的初始偏置导致瞬态过冲。
黑匣子日志最该记录哪些字段?
  1. 只记状态
  2. 上一状态、当前状态、停留时长、状态进入瞬间的关键变量(rpm/Iq/Udc/温度) (正确)
  3. 只记时间戳
  4. 只记错误码
提示:故障复盘最常用的是"切换瞬间的快照":能看到从哪儿来、停了多久、走时带的状态如何。仅状态码无法定位问题。