第 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 到量产还有多远