4. 算法实现:速度变化率检测法、电流阈值检测法、脉冲宽度变化检测法

好,咱们进入实操环节了。

前面讲了防夹的原理和传感器选型,现在要落地了。说白了,算法才是防夹的灵魂。你传感器再精准,算法写不好,该夹的时候不夹,不该夹的时候乱停,那用户肯定骂娘。

我个人习惯把防夹算法分成三类:速度变化率检测法电流阈值检测法脉冲宽度变化检测法。这三种方法各有各的脾气,咱们一个一个来拆。

4.1 速度变化率检测法

这个方法,说白了就是盯着电机的转速看。正常情况下,天窗从开到关,速度是平稳的。但如果你手或者障碍物卡住了,电机负载突然变大,转速就会瞬间掉下来。

我们检测的不是速度本身,而是速度的变化率——也就是单位时间内速度下降了多少。

核心思想:当速度变化率超过预设阈值,判定为防夹事件触发。

我在项目中遇到过一个问题:天窗在冬天润滑脂凝固,启动时速度本来就慢。如果阈值设得太死,一启动就误判。所以这里有个小技巧——动态阈值

实现步骤

  1. 采集霍尔传感器的脉冲信号,计算当前速度 v(t)
  2. 计算速度变化率 dv/dt = (v(t) - v(t-Δt)) / Δt
  3. 如果 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 脉冲宽度变化检测法

这个方法,我个人觉得是最优雅的。它不直接测速度,也不测电流,而是测霍尔脉冲的宽度

为什么?因为电机每转一圈,霍尔传感器会输出固定数量的脉冲。正常运行时,脉冲宽度是均匀的。一旦遇到阻力,电机转速变慢,脉冲宽度就会变宽。

说白了,脉冲宽度和速度是成反比的。但脉冲宽度的测量精度更高,尤其是在低速情况下。

实现原理

  1. 测量相邻两个霍尔脉冲的上升沿时间差 ΔT
  2. 计算脉冲宽度变化率 d(ΔT)/dt
  3. 如果脉冲宽度突然增大超过阈值,触发防夹
// 脉冲宽度变化检测法 - 伪代码示例
#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 R21GB 11552标准的认证测试。这不是闹着玩的,出了事是要召回的。

好了,三种方法都讲完了。下一章咱们聊聊多传感器融合策略——怎么把霍尔、电流、甚至压力传感器结合起来,做到万无一失。