故障保护与鲁棒性(十七)

第 17 篇:故障保护与鲁棒性------工业级驱动的最后一道防线

前面 16 篇讲的是"让电机转起来"。这篇讲的是怎么让电机不炸------故障保护是把 Demo 变成产品的关键。


1. 故障保护架构

markdown 复制代码
正常的 FOC 循环中嵌入故障检测:

每个 PWM 周期:
  1. 读电流 ──→ 检查过流(硬件+软件)
  2. 读电压 ──→ 检查欠压/过压
  3. 读温度 ──→ 检查过温
  4. 检查霍尔 ──→ 检查断线/异常状态
  5. 检查速度 ──→ 检查堵转/飞车

任一故障触发 → 紧急停机(6 路 PWM 全关)
             → 进入故障状态,等待清除

2. 过流保护

硬件保护(最快):

c 复制代码
// GD32 定时器的刹车(Break)功能
// 将过流比较器的输出接到 BKIN 引脚
// 硬件自动关断 PWM,无需软件介入

void brake_config(void)
{
    timer_break_parameter_struct brk;
    brk.runoff_state     = TIMER_ROS_STATE_DISABLE;
    brk.ideloff_state    = TIMER_IOS_STATE_DISABLE;
    brk.deadtime         = 96;
    brk.breakpolarity    = TIMER_BREAK_POLARITY_HIGH;  // 高电平触发
    brk.breakprotect     = TIMER_BREAK_PROTECT_OFF;
    brk.outputautostate  = TIMER_OUTAUTO_ENABLE;       // 自动输出
    timer_break_config(TIMER0, &brk);

    timer_break_enable(TIMER0);  // 使能刹车
}

软件保护(补充):

c 复制代码
#define I_FAULT_THRESHOLD  5.0f   // 5A 过流阈值
#define I_FAULT_COUNT      3      // 连续 3 次超阈值才触发

void check_overcurrent(phase_current_t *curr)
{
    static int fault_count = 0;

    float i_mag = sqrtf(curr->ia * curr->ia
                      + curr->ib * curr->ib
                      + curr->ic * curr->ic);

    if (i_mag > I_FAULT_THRESHOLD) {
        fault_count++;
        if (fault_count >= I_FAULT_COUNT) {
            fault_trigger(FAULT_OVERCURRENT);
        }
    } else {
        fault_count = 0;
    }
}

3. 欠压/过压保护

c 复制代码
void check_voltage(void)
{
    uint16_t adc_vbus = adc_read_vbus();

    float vbus = adc_vbus * VBUS_SCALE;

    if (vbus < VBUS_MIN) {
        fault_trigger(FAULT_UNDERVOLTAGE);  // 如 < 8V
    }
    if (vbus > VBUS_MAX) {
        fault_trigger(FAULT_OVERVOLTAGE);   // 如 > 30V
        // 过压时需要开启泄放电阻
        enable_brake_resistor();
    }
}

4. 堵转保护

电机被卡住时,电流会急剧上升。需要在电流保护之外单独检测堵转:

c 复制代码
void check_stall(void)
{
    // 条件:iq 指令很大,但实际速度很小
    if (fabsf(iq_ref) > 2.0f && fabsf(hall_get_speed_rpm(&hall)) < 50.0f) {
        stall_counter++;
        if (stall_counter > 500) {  // ~500ms 堵转
            fault_trigger(FAULT_STALL);
        }
    } else {
        stall_counter = 0;
    }
}

5. 故障状态机

c 复制代码
typedef enum {
    FAULT_NONE = 0,
    FAULT_OVERCURRENT,
    FAULT_UNDERVOLTAGE,
    FAULT_OVERVOLTAGE,
    FAULT_OVERTEMP,
    FAULT_STALL,
    FAULT_HALL
} fault_code_t;

typedef enum {
    STATE_NORMAL,
    STATE_FAULT,
    STATE_FAULT_CLEAR
} system_state_t;

void fault_trigger(fault_code_t code)
{
    system_state = STATE_FAULT;

    // 紧急停机
    timer_primary_output_config(TIMER0, DISABLE);

    // 记录故障码(存 Flash,掉电不丢失)
    fault_log[0] = code;

    // 故障 LED 闪烁
    fault_led_blink(code);
}

// 在主循环中轮询清除条件
void fault_handler(void)
{
    if (system_state == STATE_FAULT) {
        // 故障清除条件:
        // 1. 故障源已消失
        // 2. 故障持续超过 500ms
        // 3. 人为确认(如按键)
        if (fault_clear_condition()) {
            system_state = STATE_NORMAL;
            timer_primary_output_config(TIMER0, ENABLE);
        }
    }
}

6. 看门狗

c 复制代码
void watchdog_init(void)
{
    fwdgt_config(1000, FWDGT_PSC_DIV64);  // ~1s 超时
    fwdgt_enable();
}

// 在 FOC 主循环末尾喂狗
void main_loop(void)
{
    while (1) {
        foc_current_loop(theta);

        fwdgt_counter_reload();  // 喂狗
    }
}

如果程序跑飞或者死循环,看门狗自动复位 MCU,PWM 全部关闭------最后的安全网。


7. 小结

  • 过流保护:硬件刹车 + 软件检测,双保险
  • 电压保护:欠压关断,过压泄放
  • 堵转保护:基于 iq 指令 vs 实际速度的对比
  • 故障状态机记录了故障码,方便排查
  • 看门狗是最后的安全兜底

下一篇:总结与进阶------从 Demo 到量产还有多远


下一篇:总结与进阶------从 Demo 到量产还有多远

相关推荐
手写码匠1 小时前
从零实现大模型推理引擎:Continuous Batching 与动态调度系统深度解析
人工智能·深度学习·算法·aigc
wabs6661 小时前
关于单调栈【力扣503.下一个更大元素II的思考】
算法·单调栈
c238561 小时前
下篇:伸缩魔法!进阶吃透可变滑动窗口篇
c++·算法
186******205312 小时前
RuView 新手快速上手与实战指南
算法
txzrxz2 小时前
关于二维/多维前缀和
算法
来一碗刘肉面2 小时前
顺序表的按值查找
数据结构·c++·算法
zzz_23682 小时前
【Java实习面试算法冲刺】图论
java·算法·面试
大鱼>2 小时前
宠物监控数据安全与隐私保护:端到端加密与合规实践
人工智能·深度学习·算法·iot·宠物
被自己蠢哭3 小时前
BFS广度优先搜索问题:#P00496. 华为od机试—自动泊车
算法