4. 轮速传感器信号处理

各位同学,今天我们来聊聊ABS系统里最基础、也最关键的一环——轮速传感器信号处理。

你想想看,ABS的核心逻辑说白了就是“监测轮速,判断是否抱死”。如果轮速信号都测不准,那后面的控制算法再牛也是白搭。我在做第一套ABS方案时,就吃过这个亏——传感器信号抖动得厉害,导致系统误判,差点把项目搞黄了。

所以,这一章我们得把轮速传感器的类型、调理电路、测速方法彻底搞明白。

4.1 轮速传感器类型

目前主流的轮速传感器就两种:磁电式和霍尔式。我分别说说它们的脾气秉性。

4.1.1 磁电式传感器

磁电式传感器,说白了就是一个永磁铁加一个线圈。当齿圈转动时,磁通量变化,线圈里就会感应出交流电压信号。

它的特点很明显:

  • 无源器件——不需要外部供电,自己就能发电
  • 输出幅值随转速变化——转速低时信号很弱,转速高时信号很强
  • 抗干扰能力一般——毕竟输出的是模拟小信号

我记得有一次在台架上测试,低速时信号只有几十毫伏,调理电路稍微有点噪声就淹没了。嗯,这里要注意,磁电式传感器在低速工况下,信号处理是个难点。

关键参数:磁电式传感器输出信号幅值通常为 0.1V~100V(取决于转速),频率与轮速成正比。

4.1.2 霍尔式传感器

霍尔式传感器就不一样了。它利用霍尔效应,输出的是数字方波信号。

我个人更喜欢霍尔式,原因有三:

  1. 输出幅值固定——不管转速多低,输出都是标准的TTL或CMOS电平
  2. 抗干扰能力强——数字信号嘛,噪声容忍度好很多
  3. 可以检测零速——磁电式在静止时没信号,霍尔式可以

当然,霍尔式也有缺点——它需要供电,而且对气隙比较敏感。我曾经遇到过一批霍尔传感器,安装气隙稍微大了0.5mm,信号就时有时无,排查了好久才发现是机械公差问题。

特性 磁电式 霍尔式
供电需求 无源 需要供电(5V/12V)
输出信号 正弦波(幅值可变) 方波(幅值固定)
低速性能
抗干扰 一般 较强
成本 稍高

4.2 信号调理电路

传感器出来的原始信号,不能直接送给MCU。为什么?因为信号可能有噪声、幅值不合适、波形不规整。所以我们需要信号调理电路。

对于磁电式传感器,典型的调理电路包括:

  • 滤波——去掉高频噪声,我一般用RC低通滤波,截止频率设在信号最高频率的3~5倍
  • 放大——把微弱信号放大到可处理的电平,低速时尤其需要
  • 整形——把正弦波变成方波,常用施密特触发器
  • 电平转换——把信号调整到MCU能接受的电压范围

霍尔式传感器就简单多了,通常只需要一个上拉电阻和一个小电容滤波就够了。不过,我建议在输入端加一个TVS管,防止静电损坏传感器。

我的经验:调理电路的设计,一定要考虑全温度范围。有些电路常温下工作正常,到了-40℃或+125℃就出问题。我吃过这个亏,后来所有设计都做温度仿真。

4.3 脉冲计数法测速

好了,信号调理好了,接下来就是测速了。最直接的方法就是脉冲计数法。

原理很简单:在固定时间窗口内,统计传感器输出的脉冲个数,然后根据齿圈齿数算出转速。

/* 脉冲计数法测速示例 */
#define PULSE_PER_REV  48   /* 齿圈齿数 */
#define SAMPLE_TIME_MS 100  /* 采样时间100ms */

uint32_t pulse_count = 0;
float wheel_speed = 0.0f;

void Timer_ISR(void)  /* 每100ms触发一次 */
{
    static uint32_t last_count = 0;
    uint32_t current_count = pulse_count;
    uint32_t delta = current_count - last_count;
    
    /* 转速 = (脉冲数 / 齿数) / 时间(小时) */
    wheel_speed = (float)delta / PULSE_PER_REV;
    wheel_speed = wheel_speed / (SAMPLE_TIME_MS / 3600000.0f);
    
    last_count = current_count;
}

这种方法实现简单,但有个问题——低速时精度不够。你想想看,如果100ms内只来了1个脉冲,那转速分辨率就很差了。

注意:脉冲计数法在高速时精度好,低速时误差大。如果你的系统需要精确测量低速,建议用周期法。

4.4 周期法测速

周期法正好反过来——它测量两个脉冲之间的时间间隔,然后换算成转速。

说白了,就是测一个脉冲的宽度。脉冲越宽,转速越低;脉冲越窄,转速越高。

/* 周期法测速示例 */
#define PULSE_PER_REV  48

volatile uint32_t last_capture = 0;
volatile uint32_t period_ticks = 0;

void InputCapture_ISR(void)
{
    uint32_t current_capture = TIM_GetCapture();
    period_ticks = current_capture - last_capture;
    last_capture = current_capture;
}

float GetSpeed_ByPeriod(void)
{
    float period_sec;
    float speed;
    
    if(period_ticks == 0) return 0.0f;
    
    /* 假设定时器时钟频率为1MHz */
    period_sec = (float)period_ticks / 1000000.0f;
    
    /* 转速 = 1 / (周期 * 齿数) * 60 (转/分钟) */
    speed = 60.0f / (period_sec * PULSE_PER_REV);
    
    return speed;
}

周期法的优势在于低速测量精度高。但高速时,脉冲间隔太短,定时器分辨率可能不够。

我个人的习惯是:

  • 低速时(< 10km/h)——用周期法
  • 高速时(> 10km/h)——用脉冲计数法
  • 中间区域——两种方法融合,取加权平均

实际项目中的做法:很多成熟的ABS方案,都是两种方法同时运行,根据当前车速自动切换。这样既能保证低速精度,又能保证高速实时性。

4.5 避坑指南

最后,分享几个我踩过的坑:

  • 信号抖动——我曾经遇到过传感器信号在过零点附近反复跳变,导致脉冲计数多了一倍。后来加了施密特触发器的滞回区间才解决。
  • 齿圈偏心——齿圈安装偏心会导致脉冲间隔不均匀,测出来的速度会有周期性波动。这个在软件里可以做均值滤波。
  • 电磁干扰——ABS线束靠近大电流电缆时,容易耦合噪声。我建议传感器信号线用双绞屏蔽线,并且单点接地。

好了,这一章的内容就到这里。轮速信号处理是ABS系统的眼睛,眼睛不好使,后面的控制逻辑再漂亮也没用。下一章我们聊聊如何用这些速度信号来判断车轮是否即将抱死。