14压缩机启动状态机
V/f → HFI → BEMF → 弱磁全过程
本模块主旨
7 段启动状态机:idle → precharge → align → V/f → HFI → BEMF → fieldweak,每段有显式进入/退出条件。学完应能回答
- 能背出 7 个状态的顺序,并说清每段的进入条件与退出条件
- 理解 V/f → HFI → BEMF 的两次握手为什么按转速分档:取决于"角度信号信噪比"
- 会用反液击斜坡 accelRampRpmS(300-800 rpm/s)保护压缩机阀片
- 看到 Iq 突冲 / 转速反向 / 停在 align 三类波形,能快速定位是哪一段出错
- 能在 STM32 上把 7 状态映射成 enum + switch,并写出 timeout / fault 兜底
总览
压缩机启动 = 7 状态状态机 + 反液击斜坡 + 平滑切换。这是工程化交付的"骨架"。零基础速入
类比
压缩机启动像飞机起飞——上电(停机检查)→ 母线预充电(滑行)→ 转子对齐(找跑道方向)→ V/f 拖动(推力起跑)→ HFI 接管(收起落架)→ BEMF 闭环(爬升)→ 弱磁(巡航)。每个阶段有进入/退出条件,跳错顺序就翻车。核心概念
一台靠谱的压缩机变频器内部就是一个清晰的 7 状态状态机,每个状态做一件事、有进入/退出条件、出错有兜底。为什么要学
- "压缩机启动失败"是售后第一大类故障,几乎都是状态机设计问题。
- 状态机思维能让代码可测、可调、可移植——不用担心每个新机型从头试错。
- 反液击斜坡是行业经验值(300-800 rpm/s),违反就可能损坏阀片和活塞。
第一手操作
右侧把"加速斜坡"从 600 rpm/s 拉到 3000,模拟违规快速启动;看 Iq 电流瞬间撞高(液击隐患)。再拉回 400,曲线平滑。学习目标
- 理清压缩机启动 7 个状态及切换条件
- 理解反液击斜坡的工程意义
- 会读启动失败时的状态机日志
核心概念
- 上电后状态机依次推进;每个状态有 entry/exit/timeout。
- 状态切换条件常用滞回比较器避免抖动。
- 反液击核心是限制 dω/dt,让液态制冷剂被气化前不被快压。
公式
反液击斜坡上限
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
边界要带滞回避免在临界点反复切换。
工程意义
- 状态机是现场调试的"导航地图"——故障定位先看是哪个状态卡住或异常切换。
- 每个状态的 timeout / fault 条件必须显式定义,不能依赖"应该会切过去"。
- 弱磁与 BEMF 状态可以共存,弱磁是 BEMF 状态的子集行为。
STM32 移植指南
- 用 enum + switch 实现,每个 case 处理 entry / steady / exit。
- 状态变量、时间戳、上一状态都要记录,便于黑匣子回放。
- 从一个状态到另一个状态时,重置控制器积分器(PI 切换)以避免冲击。
常见误区
- 没设 timeout,HFI 永远等不到 BEMF 切入。
- 加速斜坡过陡 → 液击。
- V/f 启动电压过大 → 启动电流超限触发硬件保护。
调试方法
- 启动失败时记录最后状态 + 该状态停留时长 + 上一状态。
- 示波器同时抓母线电压、Iq、转速,看哪一拍出问题。
- 阶跃测试每个状态的进入/退出,模拟极端值(加大斜坡、最小目标转速等)。
建议实验
- 加速斜坡 200 vs 1500 rpm/s,看启动总耗时和 Iq 峰值。
- 改 HFI 切入阈值 50 → 200 rpm,看启动序列变化。
- 目标转速从 3000 改到 8000,看是否进入弱磁状态。
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();
}下一步
- 第三波模块:APF 前级 + 压缩机故障库(液击 / 堵转 / 缺相 / 母线欠压)。
随堂题
压缩机启动状态机第一个状态是什么?
- 对齐
- 母线预充电 (正确)
- V/f 启动
- BEMF
提示:上电后母线电容是空的,必须先经过限流电阻缓慢预充电(~200ms)才能切到正常工作母线,否则瞬间冲击电流过大。
反液击斜坡 600 rpm/s 是啥意思?
- 每秒最多升 600 rpm (正确)
- 每分钟
- 每小时
- 每毫秒
提示:加速度上限 600 rpm/s 意味着 0→3000 rpm 至少要 5 秒。这是行业经验值,过快会让液态制冷剂被压缩损坏阀片。
从 HFI 切到 BEMF 的判据除"转速达到阈值"外还应该有什么?
- 没有
- BEMF 信号质量足够(幅值 > 阈值,PLL 已锁定) (正确)
- 时间到了
- 硬件就绪
提示:光看转速不够。要确认 BEMF 信号信噪比足以让 SMO 稳定锁相,否则切过去角度立刻发散。常用滞回比较器避免抖动。
状态切换时为什么要重置 PI 积分器?
- 代码规范
- 上一状态积累的积分项与新状态不匹配,会引起切换瞬态超调 (正确)
- 内存优化
- 降低延迟
提示:V/f 阶段没有电流环;进入 HFI/BEMF 闭环时 PI 积分应从 0 开始,否则会有一个错的初始偏置导致瞬态过冲。
黑匣子日志最该记录哪些字段?
- 只记状态
- 上一状态、当前状态、停留时长、状态进入瞬间的关键变量(rpm/Iq/Udc/温度) (正确)
- 只记时间戳
- 只记错误码
提示:故障复盘最常用的是"切换瞬间的快照":能看到从哪儿来、停了多久、走时带的状态如何。仅状态码无法定位问题。