4. 算法实现:速度变化率检测法、电流阈值检测法、脉冲宽度变化检测法
好,咱们进入实操环节了。
前面讲了防夹的原理和传感器选型,现在要落地了。说白了,算法才是防夹的灵魂。你传感器再精准,算法写不好,该夹的时候不夹,不该夹的时候乱停,那用户肯定骂娘。
我个人习惯把防夹算法分成三类:速度变化率检测法、电流阈值检测法、脉冲宽度变化检测法。这三种方法各有各的脾气,咱们一个一个来拆。
4.1 速度变化率检测法
这个方法,说白了就是盯着电机的转速看。正常情况下,天窗从开到关,速度是平稳的。但如果你手或者障碍物卡住了,电机负载突然变大,转速就会瞬间掉下来。
我们检测的不是速度本身,而是速度的变化率——也就是单位时间内速度下降了多少。
核心思想:当速度变化率超过预设阈值,判定为防夹事件触发。
我在项目中遇到过一个问题:天窗在冬天润滑脂凝固,启动时速度本来就慢。如果阈值设得太死,一启动就误判。所以这里有个小技巧——动态阈值。
实现步骤
- 采集霍尔传感器的脉冲信号,计算当前速度 v(t)
- 计算速度变化率 dv/dt = (v(t) - v(t-Δt)) / Δt
- 如果 dv/dt 的绝对值大于设定阈值,触发防夹
// 速度变化率检测法 - 伪代码示例
#define SPEED_CHANGE_THRESHOLD 50 // 速度变化率阈值,单位:rpm/s
int speed_change_detection(void) {
static int last_speed = 0;
static uint32_t last_time = 0;
int current_speed = get_motor_speed(); // 获取当前电机转速
uint32_t current_time = get_system_tick();
// 计算速度变化率
int delta_speed = current_speed - last_speed;
uint32_t delta_time = current_time - last_time;
if (delta_time > 0) {
int speed_change_rate = (delta_speed * 1000) / delta_time; // 转换为每秒变化量
if (speed_change_rate < -SPEED_CHANGE_THRESHOLD) {
// 速度下降过快,触发防夹
return 1; // 防夹触发
}
}
last_speed = current_speed;
last_time = current_time;
return 0;
}
注意:速度采样周期不能太长。我建议控制在10ms以内,否则你检测到的时候,玻璃已经夹到人了。
4.2 电流阈值检测法
这个方法更直接。电机堵转的时候,电流会飙升。你想想看,电机转不动了,能量去哪了?全变成热量了,电流自然就上去了。
电流检测法的好处是——响应快。坏处是——容易受温度影响。电机热了,内阻变小,同样的负载电流也会变大。所以阈值不能是死的。
关键参数
| 参数 | 说明 | 典型值 |
|---|---|---|
| I_normal | 正常运行时电流 | 2-5A |
| I_block | 堵转电流 | 8-15A |
| I_threshold | 防夹触发阈值 | I_normal × 1.5 ~ 2.0 |
| t_hold | 电流持续超过阈值的时间 | 50-100ms |
嗯,这里要注意:电流检测不能只看瞬时值。电机启动瞬间会有浪涌电流,那个是正常的。我一般会加一个50ms的滤波窗口,电流持续超过阈值才触发。
// 电流阈值检测法 - 伪代码示例
#define CURRENT_THRESHOLD 8.0f // 电流阈值,单位:A
#define HOLD_TIME_MS 80 // 持续判定时间,单位:ms
int current_threshold_detection(float current) {
static uint32_t over_current_start_time = 0;
static uint8_t over_current_flag = 0;
if (current > CURRENT_THRESHOLD) {
if (!over_current_flag) {
over_current_start_time = get_system_tick();
over_current_flag = 1;
} else {
uint32_t elapsed = get_system_tick() - over_current_start_time;
if (elapsed >= HOLD_TIME_MS) {
return 1; // 防夹触发
}
}
} else {
over_current_flag = 0; // 电流恢复正常,清除标志
}
return 0;
}
避坑指南:我曾经遇到过一个问题——天窗在颠簸路面行驶时,电流会抖动。后来我加了一个低通滤波器,把高频抖动滤掉,误报率直接降为零。
4.3 脉冲宽度变化检测法
这个方法,我个人觉得是最优雅的。它不直接测速度,也不测电流,而是测霍尔脉冲的宽度。
为什么?因为电机每转一圈,霍尔传感器会输出固定数量的脉冲。正常运行时,脉冲宽度是均匀的。一旦遇到阻力,电机转速变慢,脉冲宽度就会变宽。
说白了,脉冲宽度和速度是成反比的。但脉冲宽度的测量精度更高,尤其是在低速情况下。
实现原理
- 测量相邻两个霍尔脉冲的上升沿时间差 ΔT
- 计算脉冲宽度变化率 d(ΔT)/dt
- 如果脉冲宽度突然增大超过阈值,触发防夹
// 脉冲宽度变化检测法 - 伪代码示例
#define PULSE_WIDTH_CHANGE_THRESHOLD 0.3f // 脉冲宽度变化率阈值,单位:%
int pulse_width_detection(uint32_t current_pulse_width) {
static uint32_t last_pulse_width = 0;
static uint8_t first_measure = 1;
if (first_measure) {
last_pulse_width = current_pulse_width;
first_measure = 0;
return 0;
}
// 计算脉冲宽度变化率
float change_rate = (float)(current_pulse_width - last_pulse_width) / last_pulse_width;
if (change_rate > PULSE_WIDTH_CHANGE_THRESHOLD) {
return 1; // 脉冲宽度突然增大,触发防夹
}
last_pulse_width = current_pulse_width;
return 0;
}
为什么推荐脉冲宽度法?因为它对低速工况特别友好。天窗快要关到底的时候,速度本来就慢,速度变化率法可能检测不到,但脉冲宽度法能精准捕捉到微小的变化。
4.4 三种方法的对比与选型建议
讲到这里,你可能会问:到底用哪种方法好?
我的建议是——别单选,要组合。
| 检测方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 速度变化率法 | 算法简单,计算量小 | 低速时灵敏度下降 | 中高速天窗系统 |
| 电流阈值法 | 响应快,硬件成本低 | 受温度影响大,需滤波 | 有电流采样硬件的系统 |
| 脉冲宽度法 | 精度高,低速表现好 | 需要高精度定时器 | 高端车型、全景天窗 |
我在实际项目中,通常采用脉冲宽度法为主 + 电流阈值法为辅的组合策略。脉冲宽度法负责精准检测,电流阈值法作为安全冗余。万一脉冲传感器坏了,电流法还能兜底。
重要提醒:无论用哪种方法,防夹算法一定要通过ECE R21或GB 11552标准的认证测试。这不是闹着玩的,出了事是要召回的。
好了,三种方法都讲完了。下一章咱们聊聊多传感器融合策略——怎么把霍尔、电流、甚至压力传感器结合起来,做到万无一失。