4. 自动重启机制设计:重启延时策略、重启次数限制、重启电流斜坡控制

堵转保护触发后,电机停了。然后呢?

很多新手工程师会想:「停了就停了呗,等人来修。」但在工业现场、风机、水泵这类无人值守场景,你不可能每次都派人去手动复位。所以,自动重启机制就派上用场了。

我个人习惯把自动重启比作「给电机一个改过自新的机会」。但机会不能无限给,也不能乱给。这里面有三个核心要素:什么时候重启能重启几次重启时怎么加电流

核心逻辑:堵转 → 保护停机 → 延时等待 → 尝试重启 → 成功则继续运行,失败则累计次数 → 超限则永久停机。

检测到堵转 执行保护停机 重启延时等待 电流斜坡启动 重启成功? 正常运行 次数+1 超限? 永久停机 否,重新延时

4.1 重启延时策略:别急着给电机上电

堵转刚发生时,电机绕组温度可能还在上升。如果立刻重启,热积累会叠加,搞不好就把线圈烧了。

我一般把延时策略分成两种:

  • 固定延时:简单粗暴,堵转后等5秒再试。适合负载惯性小、堵转原因明确的场景。
  • 自适应延时:根据堵转次数动态调整。第一次等3秒,第二次等10秒,第三次等30秒。次数越多,等待越长。

我的经验:在风机项目中,我遇到过堵转后立即重启导致IGBT炸管的情况。后来加了自适应延时,第一次5秒,第二次15秒,第三次60秒。效果立竿见影。

延时时间的计算,可以简单参考这个公式:

// 自适应延时计算
uint32_t calc_restart_delay(uint8_t retry_count)
{
    // 基础延时 3 秒,每次翻倍,上限 60 秒
    uint32_t delay = 3000 << retry_count;  // 单位 ms
    if (delay > 60000) delay = 60000;
    return delay;
}

嗯,这里要注意:延时期间,控制器的PWM输出必须完全关闭,不能有任何漏电流。我见过有人只关了占空比,但没关死PWM输出,结果电机还在微微抖动。

4.2 重启次数限制:给电机一个「最后通牒」

无限重启是灾难。如果电机每次重启都堵转,说明存在硬件故障——比如轴承卡死、负载卡住。这时候再试就是烧设备。

我个人习惯的做法是:

  • 连续堵转次数限制:比如连续3次堵转后,永久停机,必须人工复位。
  • 累计堵转次数限制:比如1小时内累计堵转5次,也永久停机。
  • 恢复时间窗口:如果成功运行超过30分钟,把堵转计数清零。这叫「将功补过」。
参数 推荐值 说明
连续堵转上限 3 次 超过后永久停机
累计堵转上限 5 次 / 小时 防止频繁故障
计数清零时间 30 分钟 正常运行超过此时间则清零

警告:计数清零时间不能太短。我曾经设了5分钟清零,结果电机每6分钟堵转一次,永远达不到永久停机条件。后来改成30分钟才解决问题。

代码实现上,我习惯用一个结构体来管理重启状态:

typedef struct {
    uint8_t  retry_count;      // 当前连续堵转次数
    uint32_t last_fault_time;  // 上次堵转时间戳
    uint32_t first_fault_time; // 首次堵转时间戳(用于累计判断)
    uint8_t  permanent_fault;  // 是否永久故障
} restart_manager_t;

// 判断是否允许重启
bool is_restart_allowed(restart_manager_t *mgr)
{
    if (mgr->permanent_fault) return false;
    if (mgr->retry_count >= 3) return false;  // 连续3次,永久停机

    // 检查1小时内累计次数
    uint32_t now = get_system_ms();
    if ((now - mgr->first_fault_time) < 3600000) {
        // 1小时内累计超过5次
        // 这里需要额外计数器,略
    }
    return true;
}

4.3 重启电流斜坡控制:温柔地唤醒电机

堵转重启时,电机转子可能还卡着。如果直接满电流启动,电流冲击会非常大。轻则触发过流保护,重则烧MOS管。

我常用的方法是电流斜坡——从0开始,缓慢增加到目标电流。说白了就是「先试探一下,再发力」。

斜坡控制的核心参数:

  • 起始电流:建议设为额定电流的10%~20%。够让电机微微转动,又不会烧东西。
  • 斜坡时间:一般200ms~500ms。时间太短没效果,太长用户觉得响应慢。
  • 目标电流:额定电流的80%左右。先别急着满负荷跑。

代码实现大概是这样的:

// 电流斜坡启动
void current_ramp_start(motor_control_t *motor)
{
    // 斜坡目标:额定电流的 80%
    float target_iq = motor->rated_current * 0.8f;
    float ramp_time_ms = 300.0f;  // 300ms 斜坡

    // 每 1ms 增加一次电流
    float step = target_iq / ramp_time_ms;

    for (uint32_t t = 0; t < (uint32_t)ramp_time_ms; t++) {
        motor->iq_ref = step * t;
        if (motor->iq_ref > target_iq) {
            motor->iq_ref = target_iq;
        }
        // 执行电流环控制
        current_loop_control(motor);
        delay_ms(1);

        // 如果在斜坡过程中检测到堵转,立即停止
        if (is_stall_detected(motor)) {
            motor_stop(motor);
            return;
        }
    }
    // 斜坡完成,进入正常运行
    motor->iq_ref = target_iq;
}

避坑指南:我曾经在斜坡过程中忘了检测堵转。结果电机卡死,电流一直往上冲,直到过流保护才停下。后来我在斜坡循环里加了实时堵转检测,一旦发现异常立刻停止。

你想想看,如果电机卡死时你还在慢慢加电流,其实是在给线圈加热。所以斜坡过程中必须同时监测电流变化率和转子位置。如果电流上升很快但转子没动,说明还是卡死的,赶紧停。

4.4 三种策略的配合关系

这三个策略不是孤立的。它们必须协同工作:

  1. 堵转发生后,先延时等待,让电机和驱动器冷却。
  2. 延时结束后,用电流斜坡尝试启动。
  3. 如果斜坡过程中再次堵转,次数+1,然后判断是否超限。
  4. 没超限?回到第一步,延时时间翻倍。
  5. 超限了?永久停机,等待人工干预。

这个流程看起来简单,但实际调试时坑很多。我记得有一次在泵类负载上调试,堵转后重启成功了,但负载波动导致电流忽大忽小,又触发了过流保护。后来我在斜坡完成后加了一个「稳定期」——让电机在低负载下运行2秒,确认没问题再切到正常模式。

总结一下:自动重启不是简单的「停了再开」。它需要延时策略保护硬件、次数限制防止无限循环、电流斜坡保证启动平稳。三者缺一不可。

嗯,这一节的内容就到这里。自动重启机制设计好了,你的电机系统才算真正具备了「无人值守」的能力。


公众号:蓝海资料掘金营,微信deep3321