4、软件保护策略:ADC采样时序、数字滤波算法、阈值判断逻辑、故障标志管理

硬件保护再快,也扛不住误触发和死区时间不够用。真正让过流保护「聪明」起来的,是软件层。我见过不少工程师把全部希望压在硬件比较器上,结果电机一启动就跳保护,或者堵转时烧了管子才反应过来——说白了,软件策略没跟上。

这一章我们聊四个核心模块:ADC采样时序、数字滤波、阈值判断、故障标志管理。它们环环相扣,少一个都不行。

4.1 ADC采样时序:什么时候采,采多久

BLDC驱动里,相电流采样最常用的方法是三电阻或单电阻。不管哪种,ADC触发时刻都很有讲究。

我个人习惯把ADC采样放在PWM周期的中间点。为什么?因为开关管导通和关断瞬间会有严重的振铃,你如果在边沿采样,读到的全是噪声。

经验之谈: 我曾在某款吸尘器项目里把采样点设在PWM上升沿,结果电流波形像心电图。后来改成PWM中心对齐模式,ADC在计数器归零时触发,噪声直接降了60%。

具体时序参数可以参考下表:

参数 推荐值 说明
PWM频率 16~20 kHz 避开人耳可听区
ADC采样窗口 1~2 μs 足够采样电容充电
采样触发点 PWM中心点 ±0.5 μs 避开开关噪声
采样保持时间 ≥ 500 ns 取决于ADC输入阻抗

你想想看,如果ADC采样窗口太短,采样电容没充满,读出来的值就是错的。我踩过这个坑——某次调试发现电流读数偏低,查了半天,原来是采样保持时间设成了200 ns,根本不够。

4.2 数字滤波算法:别让噪声骗了你的阈值

ADC采回来的原始数据,直接拿去判断过流?那你会被噪声折磨疯。电机运行时,PWM开关噪声、电机反电动势、甚至电源纹波都会叠加到采样信号上。

常用的数字滤波方法有三种:

  • 中值滤波:连续采3~5个点,取中间值。适合去除脉冲噪声,但会引入1~2个采样周期的延迟。
  • 滑动平均滤波:维护一个N点窗口,每次新数据进来,去掉最老的,算平均值。平滑效果好,但N太大会让响应变慢。
  • 一阶低通滤波:y[n] = α * x[n] + (1-α) * y[n-1]。计算量最小,适合资源紧张的MCU。
我的推荐组合: 先做一次3点中值滤波,再跟一阶低通滤波(α取0.15~0.3)。这样既能干掉尖峰噪声,又能保证过流响应在2~3个PWM周期内完成。

我曾经在一个风扇项目里只用滑动平均,窗口设了16点。结果电机堵转时,电流已经冲到40A了,滤波输出才显示25A——等它反应过来,MOSFET已经冒烟了。嗯,从那以后我再也不敢用大窗口做保护滤波。

4.3 阈值判断逻辑:分级保护,别一刀切

过流保护不能只有一个阈值。你想想看,电机启动时的冲击电流和堵转电流完全不是一个性质。如果都用同一个阈值,要么启动时频繁误触发,要么堵转时保护太慢。

我习惯把阈值分成三级:

  1. 警告阈值(80%额定峰值):只记录日志,不触发保护。用于提前发现异常趋势。
  2. 软过流阈值(110%额定峰值):触发后降低PWM占空比,尝试恢复。如果持续超过100 ms,升级为硬过流。
  3. 硬过流阈值(130%额定峰值):立即关断所有PWM输出,进入故障状态。
注意: 硬过流阈值必须低于硬件比较器的触发值。软件再快也有延迟,硬件是最后一道防线。我见过有人把软件阈值设得比硬件还高,结果硬件从来没触发过——直到一次短路,软件没来得及响应,硬件也没触发,直接炸管。

阈值判断的伪代码大致是这样:

// 每PWM周期执行一次
if (current_sample > HARD_OC_THRESHOLD) {
    fault_flags |= FAULT_HARD_OC;
    PWM_disable();
    return;
}

if (current_sample > SOFT_OC_THRESHOLD) {
    soft_oc_counter++;
    if (soft_oc_counter > SOFT_OC_TIMEOUT) {
        fault_flags |= FAULT_SOFT_OC;
        PWM_disable();
    } else {
        reduce_duty_cycle(10%);  // 降占空比
    }
} else {
    soft_oc_counter = 0;  // 电流恢复正常,清零计数器
}

4.4 故障标志管理:别让故障「卡死」系统

故障标志管理看似简单,但处理不好会出大问题。我见过一个项目,过流触发后故障标志一直不清除,导致电机再也启动不了——用户只能断电重启。

合理的故障标志管理应该包含:

  • 故障锁存:一旦触发,标志位必须由软件主动清除,不能自动恢复。防止故障反复触发导致系统不稳定。
  • 故障分级:可恢复故障(如软过流)和不可恢复故障(如硬过流)分开管理。
  • 清除条件:故障清除前,必须满足「电流恢复正常 + 持续N个PWM周期无故障」的条件。
一个小技巧: 我习惯在故障标志里加一个「故障时间戳」。调试时通过串口读出故障发生时的电流值和PWM周期数,定位问题快很多。

下面这张图展示了整个软件保护策略的流程:

软件过流保护策略流程图 ADC采样触发 数字滤波 阈值判断 正常:继续运行 软过流:降占空比 硬过流:关PWM 故障标志锁存 + 时间戳 清除条件满足?→ 恢复运行 说明:硬过流触发后必须手动清除故障标志;软过流可在电流恢复后自动清除

故障标志的管理状态机,我一般这样设计:

状态 触发条件 恢复条件 动作
正常运行 — — 正常PWM输出
软过流 电流 > 软阈值 电流 < 软阈值 × 0.9 持续10个周期 降占空比10%
硬过流 电流 > 硬阈值 手动清除故障标志 立即关PWM
故障锁存 硬过流触发 用户确认 + 清除标志 保持PWM关闭

最后说一句:软件保护策略不是写完就完事的。我每次做完一个项目,都会花至少两天做极限测试——故意短路、堵转、电源抖动,看软件能不能扛住。你想想看,如果连测试都不敢做,怎么敢把产品交到客户手里?