第四节:软件保护方案
好,咱们接着聊堵转保护。硬件方案搭好了,但真正让保护生效的,还得靠软件。这一节,我重点讲讲电流采样、ADC配置、滤波算法、阈值判断和延时保护。这些都是我这些年调电机踩过的坑,今天一并分享给你。
4.1 电流采样与ADC配置
先说采样。电流采样是堵转保护的眼睛,眼睛不好使,后面全白搭。
我个人习惯用单电阻采样或者三电阻采样。单电阻成本低,但采样时机要求高;三电阻精度好,但多两路ADC。你根据项目成本选就行。
ADC配置这块,有几点我特别想强调:
- 采样率:建议至少10kHz以上。堵转电流变化快,采样慢了抓不住峰值。
- 分辨率:12位是底线。8位ADC量化噪声太大,容易误判。
- 参考电压:用内部基准还是外部基准?我建议用外部精密基准,温漂小。
关键配置示例(以STM32为例):
// ADC初始化
void ADC_Init(void)
{
ADC_InitTypeDef ADC_InitStruct;
// 开启ADC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
// ADC配置
ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;
ADC_InitStruct.ADC_ScanConvMode = DISABLE;
ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;
ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStruct.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStruct);
// 配置采样通道和采样时间
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);
// 校准
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
// 启动ADC
ADC_Cmd(ADC1, ENABLE);
}
我的经验:采样时间别设太短。55.5个周期是我常用的,噪声小。你想想看,采样时间短了,电容充电不充分,结果就是采样值偏小,容易漏报堵转。
4.2 软件滤波算法
ADC采回来的数据,直接拿去判断?千万别。电机运行时,电流上叠加了PWM开关噪声、电机反电动势尖峰,不滤波的话,阈值判断会疯掉。
我常用的滤波方法有三种:
- 中值滤波:连续采5个点,取中间值。抗脉冲干扰效果好。
- 滑动平均滤波:维护一个窗口,比如8个点,每次取平均。平滑度高。
- 一阶低通滤波:简单递归,适合实时性要求高的场景。
我个人偏爱滑动平均。为什么?因为中值滤波会丢数据,低通滤波有相位延迟。滑动平均在实时性和平滑度之间平衡得最好。
滑动平均滤波代码示例:
#define FILTER_WINDOW_SIZE 8
static uint16_t filter_buffer[FILTER_WINDOW_SIZE];
static uint8_t filter_index = 0;
static uint32_t filter_sum = 0;
uint16_t MovingAverageFilter(uint16_t new_sample)
{
// 减去最旧的数据
filter_sum -= filter_buffer[filter_index];
// 存入新数据
filter_buffer[filter_index] = new_sample;
filter_sum += new_sample;
// 更新索引
filter_index++;
if(filter_index >= FILTER_WINDOW_SIZE)
filter_index = 0;
// 返回平均值
return (uint16_t)(filter_sum / FILTER_WINDOW_SIZE);
}
注意:窗口大小别设太大。我曾经在一个项目里设了32点滑动平均,结果堵转发生后200ms才检测到,电机都冒烟了。窗口大小建议4-16之间,具体看你PWM频率和采样率。
4.3 阈值判断逻辑
滤波完了,就该判断了。阈值怎么设?
说白了,堵转电流和正常电流之间有个明显的分界。但问题是,不同负载下正常电流不一样。你想想看,空载和满载的正常电流能差好几倍。
我建议用动态阈值:
- 固定阈值:简单粗暴,适合负载变化小的场合。比如额定电流的1.5倍。
- 自适应阈值:根据当前运行状态动态调整。比如启动时阈值高,稳态时阈值低。
- 增量阈值:检测电流变化率。堵转时电流会突然飙升,变化率很大。
我个人最常用的是增量阈值。为什么?因为固定阈值容易误判,自适应阈值实现复杂。增量阈值只看变化趋势,不受负载影响。
增量阈值判断逻辑:
#define CURRENT_DELTA_THRESHOLD 500 // 电流变化阈值,单位mA
#define SAMPLE_INTERVAL_MS 10 // 采样间隔
uint8_t CheckStallByDelta(uint16_t current_now, uint16_t current_last)
{
int32_t delta;
// 计算电流变化量
delta = (int32_t)current_now - (int32_t)current_last;
// 如果电流突然增大超过阈值,判定为堵转
if(delta > CURRENT_DELTA_THRESHOLD)
{
return 1; // 堵转
}
return 0; // 正常
}
避坑指南:我曾经在一个风机项目里,直接用固定阈值判断堵转。结果冬天润滑油凝固,启动电流大,每次都误报堵转。后来改成增量阈值,问题就解决了。所以,阈值策略一定要结合你的实际工况来选。
4.4 延时保护机制
最后一步,延时保护。为什么需要延时?因为电流尖峰不一定是堵转。电机启动瞬间、负载突变时,电流都会短暂升高。
延时保护的核心思想:确认堵转持续一段时间,再执行保护动作。
我常用的延时策略:
- 固定延时:比如检测到堵转后,延时100ms再切断。简单,但不够灵活。
- 反时限延时:电流越大,延时越短。符合电机热特性,更科学。
- 可配置延时:通过参数设置延时时间,适应不同应用场景。
我个人推荐反时限延时。为什么?因为电机堵转时,电流越大,发热越快,保护动作就要越快。固定延时要么保护不及时,要么容易误动作。
反时限延时保护实现:
#define BASE_DELAY_MS 1000 // 基础延时1秒
#define RATED_CURRENT 5000 // 额定电流5A
uint32_t CalculateDelay(uint16_t current)
{
uint32_t delay_ms;
// 反时限公式:延时 = 基础延时 * (额定电流 / 实际电流)^2
// 电流越大,延时越短
delay_ms = (uint32_t)(BASE_DELAY_MS *
((float)RATED_CURRENT / current) *
((float)RATED_CURRENT / current));
// 限制最小延时,防止保护太快
if(delay_ms < 50)
delay_ms = 50;
// 限制最大延时,防止保护太慢
if(delay_ms > 2000)
delay_ms = 2000;
return delay_ms;
}
void StallProtectionTask(void)
{
static uint16_t stall_count = 0;
static uint32_t stall_start_time = 0;
uint16_t current_filtered;
uint32_t delay_to_use;
// 获取滤波后的电流值
current_filtered = GetFilteredCurrent();
// 判断是否堵转
if(CheckStallByDelta(current_filtered, last_current))
{
if(stall_count == 0)
{
// 记录堵转开始时间
stall_start_time = GetSysTick();
// 计算本次堵转的延时时间
delay_to_use = CalculateDelay(current_filtered);
}
stall_count++;
// 检查是否达到延时时间
if((GetSysTick() - stall_start_time) >= delay_to_use)
{
// 执行保护动作:关断PWM
MotorStop();
SetFaultFlag(FAULT_STALL);
}
}
else
{
// 电流恢复正常,清零计数器
stall_count = 0;
}
last_current = current_filtered;
}
重要提醒:延时保护不是万能的。如果电机卡死,电流持续很大,延时再短也救不了。所以,延时保护要和硬件保护配合使用。硬件保护是最后一道防线,软件保护是日常防护。两者缺一不可。
嗯,这一节的内容就这些。总结一下:ADC配置要稳,滤波算法要准,阈值判断要灵,延时保护要科学。把这四点做好,你的堵转保护软件方案就基本成型了。
下一节,咱们聊聊堵转保护的实际调试案例。到时候我会分享几个我亲手调过的项目,有成功的,也有翻车的。敬请期待。