3、基于电流有效值的检测法:有效值计算原理、阈值设定策略、采样窗口选择
堵转检测这件事,我做了十几年,试过的方法不下七八种。说实话,最让我放心的还是电流有效值法。为什么?因为它不挑电机,不挑负载,甚至不挑你的硬件平台。你想想看,一个算法能同时用在直流有刷、步进、BLDC 上,这本身就说明问题。
但有效值法也有坑。我见过太多工程师直接把 RMS 公式往代码里一塞,结果要么误报堵转,要么电机烧了都没检测出来。问题出在哪?出在三个地方:计算原理没吃透、阈值设得太随意、采样窗口选错了。
这一章,我就把这三点掰开揉碎了讲清楚。
3.1 有效值计算原理——别只会套公式
电流有效值,英文叫 RMS(Root Mean Square)。名字已经告诉你步骤了:先平方(Square),再平均(Mean),最后开根号(Root)。公式长这样:
I_rms = sqrt( (1/N) * Σ(i_k²) ) k = 1, 2, ..., N
其中 i_k 是第 k 个采样点的电流值,N 是一个窗口内的总采样点数。
但这里有个关键问题:这个公式假设你的采样窗口正好覆盖了电流波形的整数个周期。如果窗口长度不是周期的整数倍,RMS 值就会抖动。我在一个风机项目上就吃过这个亏——采样窗口设了 50 个点,电网频率 50Hz,采样率 2.5kHz,算下来窗口长度 20ms,正好一个周期,没问题。但后来换了个 60Hz 的电机,窗口还是 50 个点,RMS 值就开始跳了。
核心要点:RMS 计算的前提是采样窗口与电流周期对齐。不对齐,结果就是错的。
实际工程中,我们通常用两种方式实现 RMS:
- 滑动窗口 RMS:每采一个点就更新一次 RMS 值,实时性好,但计算量大。
- 固定块 RMS:攒够 N 个点算一次,计算量小,但实时性差。
我个人习惯用滑动窗口。虽然每次都要重新算平方和,但现在的 MCU 主频动不动就上百兆,这点计算量根本不是事。关键是它能让你在堵转发生的瞬间就捕捉到电流变化。
代码实现其实很简单:
// 滑动窗口 RMS 计算
#define WINDOW_SIZE 64 // 采样窗口大小
float current_buffer[WINDOW_SIZE];
float sum_squares = 0.0f;
int index = 0;
float calc_rms(float new_sample) {
// 减去旧值
sum_squares -= current_buffer[index] * current_buffer[index];
// 加入新值
current_buffer[index] = new_sample;
sum_squares += new_sample * new_sample;
// 更新索引
index = (index + 1) % WINDOW_SIZE;
// 返回 RMS
return sqrtf(sum_squares / WINDOW_SIZE);
}
这段代码有个小细节:sqrtf 是浮点开方,如果你用的 MCU 没有 FPU,建议换成查表法或者用牛顿迭代法近似。我之前在一个 Cortex-M0 上跑,浮点开方一次要 200 多个周期,换成定点查表后,一次只要 20 个周期。
3.2 阈值设定策略——别拍脑袋
阈值怎么设?很多人的做法是:让电机正常转,测一下电流,然后乘以 1.5 或 2 倍。这种做法不能说错,但太粗糙了。
我建议分三步走:
- 测出正常工况下的最大 RMS 电流——包括启动、加减速、负载波动。
- 测出堵转时的最小 RMS 电流——注意,堵转电流不是固定的,它跟母线电压、绕组温度都有关系。
- 在两者之间取一个安全裕量——通常取正常最大值的 1.2~1.5 倍,但不能超过堵转最小值的 0.8 倍。
举个例子:
| 工况 | RMS 电流 (A) | 说明 |
|---|---|---|
| 空载运行 | 0.8 | 正常 |
| 满载运行 | 2.5 | 正常 |
| 启动瞬间 | 3.8 | 持续约 200ms |
| 堵转(冷态) | 6.2 | 绕组温度 25°C |
| 堵转(热态) | 5.1 | 绕组温度 85°C |
从这张表可以看出:正常最大电流是 3.8A(启动瞬间),堵转最小电流是 5.1A(热态)。那阈值设在哪?我个人习惯取 4.5A——既避开了启动冲击,又留了 0.6A 的裕量。
注意:阈值不能设得太靠近堵转电流。我曾经在一个项目上把阈值设成 5.0A,结果电机连续堵转几次后绕组发热,堵转电流降到 4.8A,阈值反而检测不到了。这就是典型的「热态失效」。
另外,我建议做双阈值:
- 告警阈值:电流超过此值,记录日志,但不立即停机。
- 保护阈值:电流超过此值且持续一定时间,立即切断驱动。
这样做的好处是避免误触发。比如电机启动瞬间电流冲了一下,但很快回落,告警阈值会记录,但不会停机。只有持续堵转才会触发保护。
3.3 采样窗口选择——小了抖,大了慢
采样窗口的长度直接影响 RMS 的准确性和响应速度。窗口太小,RMS 值会跟着电流的瞬时波动一起抖;窗口太大,堵转发生了半天你才检测到。
那到底选多大?我总结了一个经验公式:
窗口长度 = 电流基波周期的 1~2 倍
对于工频 50Hz 的电机,周期是 20ms。如果你的采样率是 2kHz(每 0.5ms 采一个点),那窗口长度就是 40~80 个点。
但这里有个陷阱:PWM 斩波频率。如果你用 PWM 驱动电机,电流波形上会叠加高频纹波。这些纹波如果不滤掉,RMS 值会偏高。我一般会在采样前加一个低通滤波器,截止频率设在 PWM 频率的 1/10 左右。
举个例子:PWM 频率 20kHz,低通截止频率 2kHz。这样既能滤掉纹波,又不影响基波电流的测量。
小技巧:如果你不想加硬件滤波器,可以在软件里做滑动平均。每采一个点,跟前面 3~5 个点取平均,效果也不错。我在一个低成本项目上就这么干过,省了一个运放的钱。
最后,我把整个有效值检测法的流程总结成一张图:
这张图把整个流程串起来了。从采样到滤波,从 RMS 计算到阈值比较,再到最终的堵转处理。你照着这个流程做,基本不会出大问题。
最后说一句:有效值法不是万能的。它最大的弱点是响应速度慢——至少需要一个电流周期才能算出 RMS。如果你的应用要求毫秒级响应,那得考虑其他方法。但对于大多数工业场景,几十毫秒的响应时间完全够用。