4. 电流检测法(下):电流采样滤波、去抖处理、故障确认时间

好,咱们接着聊电流检测法。上一节我把硬件方案和基本采样原理讲清楚了,这一节咱们聚焦在软件层面——采样回来的一堆数据,怎么处理才能用?

说白了,ADC采到的电流值,直接拿去判断堵转,那肯定不行。电机运行时电流本身就带纹波,PWM开关噪声、传感器温漂、机械振动,全都会叠加进去。你要是拿原始数据做阈值比较,那系统一天能误报八百回。

4.1 电流采样滤波:先把脏数据洗干净

我个人的习惯是,在ADC采样之后,先做一级硬件滤波(RC低通),再做一级软件滤波。硬件滤高频,软件滤中低频波动。两板斧下去,信号基本就干净了。

软件滤波的方法很多,我挑几个常用的说说:

  • 限幅滤波:相邻两次采样值之差超过设定阈值,就丢弃当前值。对付尖峰干扰很有效。
  • 中位值滤波:连续采N个点,排序后取中间值。抗脉冲干扰能力强,但响应慢。
  • 滑动平均滤波:维护一个长度为N的队列,每次采新值就入队、出队,算平均值。平滑效果好,我项目里用得最多。
  • 一阶低通滤波:Y(n) = α * X(n) + (1-α) * Y(n-1)。计算量小,适合资源受限的MCU。
我的经验: 滑动平均的窗口长度选多少?我一般取8~16点。太短了滤不干净,太长了延迟大,堵转检测会变慢。你想想看,堵转信号本身是阶跃变化的,滤波延迟太大,等你确认堵转,电机可能已经烧了。

下面给个滑动平均的代码片段,我常用的写法:

#define FILTER_WINDOW 8

typedef struct {
    uint16_t buffer[FILTER_WINDOW];
    uint8_t index;
    uint32_t sum;
} SlidingAvgFilter;

void Filter_Init(SlidingAvgFilter *f) {
    f->index = 0;
    f->sum = 0;
    memset(f->buffer, 0, sizeof(f->buffer));
}

uint16_t Filter_Update(SlidingAvgFilter *f, uint16_t new_sample) {
    f->sum -= f->buffer[f->index];
    f->buffer[f->index] = new_sample;
    f->sum += new_sample;
    f->index = (f->index + 1) % FILTER_WINDOW;
    return (uint16_t)(f->sum / FILTER_WINDOW);
}

这段代码在Cortex-M0上跑,每次更新也就几个微秒,完全够用。

4.2 去抖处理:别让噪声骗了你

滤波之后,信号平滑了,但还不够。为什么?因为堵转检测是个“状态判断”,不是“瞬时判断”。

你想想看,就算滤波了,电流偶尔还是会因为负载突变、电源波动而短暂超过阈值。如果每次超阈值都立刻判堵转,那系统就太敏感了。我管这个叫“抖动”,跟按键消抖一个道理。

去抖处理的思路很简单:连续N次采样都超过阈值,才认为真的堵转了。

具体实现:

  • 设置一个计数器 blink_cnt,初始为0。
  • 每次滤波后的电流值超过堵转阈值,计数器加1;低于阈值,计数器清零。
  • 当计数器达到设定的去抖次数(比如5次),才触发堵转标志。

关键点: 去抖次数和采样周期要一起考虑。假设采样周期是1ms,去抖次数设5次,那实际确认时间是5ms。这个时间要跟电机热时间常数匹配,别设得太长,也别太短。

我曾经在一个风机项目里踩过坑——去抖次数设了20次,采样周期2ms,结果电机堵转后40ms才检测到,绕组温度已经飙上去了。后来改成8次,16ms确认,刚刚好。

4.3 故障确认时间:给系统一个“冷静期”

去抖处理之后,我们得到了一个“疑似堵转”的信号。但别急,这时候还不能直接执行保护动作。我建议再加一级故障确认时间。

故障确认时间,说白了就是:从“疑似堵转”到“确认堵转”,再等一小段时间。这段时间用来干嘛?

  • 排除瞬时干扰(比如电网闪变、机械冲击)
  • 等待系统自恢复(比如负载卡了一下又松开了)
  • 避免频繁启停对MOSFET和电机的冲击

我一般把故障确认时间设在50ms~200ms之间,具体看应用场景。大惯量负载可以长一点,小电机可以短一点。

应用场景 采样周期 去抖次数 故障确认时间
小风扇(12V/2A) 500μs 4次 50ms
水泵(24V/5A) 1ms 8次 100ms
工业伺服(48V/20A) 2ms 10次 200ms
注意: 故障确认时间不是越长越好。电机堵转时,电流可能达到额定值的5~8倍,绕组温升极快。我见过一个案例,确认时间设了500ms,结果电机在300ms时就冒烟了。一定要结合电机热模型来算。

4.4 整体流程:从采样到确认

好,我们把上面三个环节串起来,画个流程图就清楚了。

电流检测法:采样 → 滤波 → 去抖 → 确认流程 ADC 电流采样 滑动平均 / 低通滤波 电流 > 堵转阈值? 否(继续采样) 去抖计数器 +1 去抖次数 ≥ N? 否(继续采样) 确认堵转 → 执行保护 说明: 采样周期:0.5~2ms 去抖次数:4~10次 确认时间:50~200ms

嗯,这张图把整个链路串起来了。从ADC采样开始,经过滤波、阈值比较、去抖计数,最后到故障确认。每一步都在降低误报率,同时保证响应速度。

4.5 避坑指南

最后,我把自己踩过的坑总结一下,你们做项目时能少走弯路:

  • 采样周期别乱选:太快了MCU扛不住,太慢了检测滞后。我一般按PWM周期的1/2~1/4来设。
  • 滤波和去抖要配合:滤波强了,去抖次数可以少一点;滤波弱了,去抖次数要多一点。两者是跷跷板关系。
  • 阈值要留余量:别把堵转阈值设在额定电流的临界点。我习惯留20%~30%的余量,防止温漂和批次差异。
  • 别忘了恢复逻辑:堵转解除后,要清掉去抖计数器和故障标志,否则系统会一直卡在保护状态。
一个小技巧: 我习惯在调试阶段把滤波后的电流值、去抖计数器值、阈值状态都通过串口或DAC输出出来。这样能直观看到每个环节的效果,调参数时心里有底。