3. 软件配置基础:ADC采样配置、数字滤波算法、阈值比较逻辑、保护动作执行
好,咱们进入软件部分。硬件搭好了,采样链路调通了,接下来就是让芯片“听懂”电流信号,并在危险时刻做出反应。
这一章,我带你过一遍过流保护的软件核心流程。说白了,就是四个步骤:采得到 → 滤得稳 → 比得准 → 动作快。
核心流程概览:
ADC 采样 → 数字滤波 → 阈值比较 → 保护动作
每一步都有坑,踩过一个你就记住了。
3.1 ADC 采样配置:别让第一关就翻车
ADC 配置看起来简单,但我在项目里见过太多“采样值跳得像心电图”的情况。根源往往不在硬件,而在软件触发时机和采样窗口没配好。
我个人习惯把 ADC 配置拆成三个关键点:
- 触发源选择:用 PWM 定时器触发,还是用软件连续触发?过流保护场景,我强烈建议用 PWM 同步触发。为什么?因为电流纹波和开关动作强相关,你在开关管导通中间段采样,信噪比最好。
- 采样时间:STM32 的 ADC 采样时间可调,从 1.5 周期到 239.5 周期。采样时间太短,采样电容充不满,结果偏小;太长,又跟不上信号变化。我一般设 12~28 个周期,具体看输入阻抗。
- 分辨率与转换模式:12 位够用,别盲目上 16 位。过流保护不需要微伏级精度,速度快才是王道。用 单次转换 + DMA,别用阻塞式轮询。
我的小技巧:
在 ADC 初始化完成后,先对地采样一次,再对内部参考电压采样一次。这两个值能帮你快速判断 ADC 是否正常工作。我每次上电都这么干,省了不少排查时间。
3.2 数字滤波算法:滤掉噪声,留住真相
ADC 采回来的原始数据,直接拿去比较阈值?别急。你想想看,一个开关电源的电流波形,上面叠加了多少高频噪声?不滤波就做保护,误动作率能让你怀疑人生。
常用的数字滤波算法,我按实用场景排了个序:
| 算法 | 适用场景 | 延时 | 我踩过的坑 |
|---|---|---|---|
| 中值滤波 | 尖峰脉冲干扰(如雷击、浪涌) | 中等 | 窗口设太大,反应慢半拍 |
| 滑动平均 | 平稳噪声(如热噪声、量化噪声) | 较大 | 点数太多,保护动作滞后 |
| 一阶低通 | 实时性要求高的场景 | 小 | 系数选不好,滤不干净或过冲 |
| 去极值平均 | 混合噪声(尖峰 + 平稳) | 中等 | 排序开销大,MCU 扛不住 |
我个人最常用的是 一阶低通滤波,代码简单,实时性好。公式就一行:
// 一阶低通滤波
// new_value: 最新 ADC 采样值
// filtered_value: 滤波后的输出
// alpha: 滤波系数 (0 ~ 1),越小越平滑,但延时越大
filtered_value = (uint16_t)((float)new_value * alpha + (float)filtered_value * (1.0f - alpha));
alpha 怎么选?我一般从 0.1 开始试。alpha 太大,滤不干净;太小,反应太慢。我曾经在一个电机驱动项目里,alpha 设了 0.05,结果过流保护总是慢 200μs,差点烧了 MOS 管。后来调到 0.15,刚刚好。
警告:
数字滤波会引入相位滞后。对于过流保护,滤波延时 + 软件处理延时 + 硬件动作延时,总和必须小于被保护器件的耐受时间。IGBT 的短路耐受时间通常只有 10μs,你一个滤波就吃掉 5μs,剩下的时间够不够?自己算。
3.3 阈值比较逻辑:别让误动作毁了产品
滤波之后,就是阈值比较。这里有两个流派:瞬时比较 和 反时限比较。
- 瞬时比较:滤波值超过阈值,立即触发保护。适合短路等硬故障。但要注意做 消抖处理,连续 N 次超阈值才动作,防止电网毛刺误触发。
- 反时限比较:电流越大,动作越快。适合过载保护。实现上可以用积分器,也可以用查表法。
我建议在项目中同时保留两种模式,通过配置寄存器切换。调试阶段先用瞬时比较,摸清系统的电流特性,再根据实际波形调整反时限曲线。
阈值比较的代码框架,我习惯这样写:
// 过流阈值比较(带消抖)
#define OC_THRESHOLD_HIGH 3000 // 瞬时过流阈值,对应实际电流值
#define OC_DEBOUNCE_COUNT 3 // 连续超阈值次数
static uint8_t oc_debounce_cnt = 0;
void overcurrent_check(uint16_t filtered_current)
{
if (filtered_current > OC_THRESHOLD_HIGH)
{
oc_debounce_cnt++;
if (oc_debounce_cnt >= OC_DEBOUNCE_COUNT)
{
// 触发保护动作
trigger_protection();
oc_debounce_cnt = 0;
}
}
else
{
// 电流恢复正常,清零计数器
oc_debounce_cnt = 0;
}
}
避坑指南:
我曾经在一个变频器项目里,消抖次数设了 10 次。结果电机启动瞬间的冲击电流每次都触发保护,产品根本没法用。后来我把消抖次数降到 3 次,同时把启动时的阈值临时抬高 20%,问题就解决了。记住:消抖次数不是越大越好,要结合你的系统动态特性来调。
3.4 保护动作执行:最后一公里,别掉链子
阈值比较通过了,接下来就是执行保护动作。这一步最怕什么?怕你动作了,但没动作到位。
保护动作通常分两级:
- 软件级动作:立即封锁 PWM 输出,置位故障标志位,记录故障时刻的电流值。这一步要在中断里完成,越快越好。
- 硬件级动作:通过 GPIO 拉低驱动芯片的使能脚,或者触发硬件刹车。这是最后一道防线,即使 MCU 跑飞了,硬件也能把管子关掉。
我个人的做法是:软件和硬件同时动作。软件先封锁 PWM,同时拉一个 GPIO 给硬件保护电路。双重保险,心里踏实。
保护动作后的恢复逻辑也很重要。不能一恢复就立即重启,否则可能反复过流,把管子烧了。我一般设计 三次自恢复 机制:
- 第一次过流:封锁 PWM,等待 1 秒后自动恢复。
- 第二次过流:封锁 PWM,等待 5 秒后自动恢复。
- 第三次过流:永久锁死,等待人工复位。
这个机制在电机驱动和电源产品里非常实用,既避免了瞬时故障导致停机,又防止了持续故障烧毁设备。