4. 电流检测法(下):电流采样滤波、去抖处理、故障确认时间
好,咱们接着聊电流检测法。上一节我把硬件方案和基本采样原理讲清楚了,这一节咱们聚焦在软件层面——采样回来的一堆数据,怎么处理才能用?
说白了,ADC采到的电流值,直接拿去判断堵转,那肯定不行。电机运行时电流本身就带纹波,PWM开关噪声、传感器温漂、机械振动,全都会叠加进去。你要是拿原始数据做阈值比较,那系统一天能误报八百回。
4.1 电流采样滤波:先把脏数据洗干净
我个人的习惯是,在ADC采样之后,先做一级硬件滤波(RC低通),再做一级软件滤波。硬件滤高频,软件滤中低频波动。两板斧下去,信号基本就干净了。
软件滤波的方法很多,我挑几个常用的说说:
- 限幅滤波:相邻两次采样值之差超过设定阈值,就丢弃当前值。对付尖峰干扰很有效。
- 中位值滤波:连续采N个点,排序后取中间值。抗脉冲干扰能力强,但响应慢。
- 滑动平均滤波:维护一个长度为N的队列,每次采新值就入队、出队,算平均值。平滑效果好,我项目里用得最多。
- 一阶低通滤波:Y(n) = α * X(n) + (1-α) * Y(n-1)。计算量小,适合资源受限的MCU。
下面给个滑动平均的代码片段,我常用的写法:
#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 |
4.4 整体流程:从采样到确认
好,我们把上面三个环节串起来,画个流程图就清楚了。
嗯,这张图把整个链路串起来了。从ADC采样开始,经过滤波、阈值比较、去抖计数,最后到故障确认。每一步都在降低误报率,同时保证响应速度。
4.5 避坑指南
最后,我把自己踩过的坑总结一下,你们做项目时能少走弯路:
- 采样周期别乱选:太快了MCU扛不住,太慢了检测滞后。我一般按PWM周期的1/2~1/4来设。
- 滤波和去抖要配合:滤波强了,去抖次数可以少一点;滤波弱了,去抖次数要多一点。两者是跷跷板关系。
- 阈值要留余量:别把堵转阈值设在额定电流的临界点。我习惯留20%~30%的余量,防止温漂和批次差异。
- 别忘了恢复逻辑:堵转解除后,要清掉去抖计数器和故障标志,否则系统会一直卡在保护状态。