4. 轮速传感器信号处理
各位同学,今天我们来聊聊ABS系统里最基础、也最关键的一环——轮速传感器信号处理。
你想想看,ABS的核心逻辑说白了就是“监测轮速,判断是否抱死”。如果轮速信号都测不准,那后面的控制算法再牛也是白搭。我在做第一套ABS方案时,就吃过这个亏——传感器信号抖动得厉害,导致系统误判,差点把项目搞黄了。
所以,这一章我们得把轮速传感器的类型、调理电路、测速方法彻底搞明白。
4.1 轮速传感器类型
目前主流的轮速传感器就两种:磁电式和霍尔式。我分别说说它们的脾气秉性。
4.1.1 磁电式传感器
磁电式传感器,说白了就是一个永磁铁加一个线圈。当齿圈转动时,磁通量变化,线圈里就会感应出交流电压信号。
它的特点很明显:
- 无源器件——不需要外部供电,自己就能发电
- 输出幅值随转速变化——转速低时信号很弱,转速高时信号很强
- 抗干扰能力一般——毕竟输出的是模拟小信号
我记得有一次在台架上测试,低速时信号只有几十毫伏,调理电路稍微有点噪声就淹没了。嗯,这里要注意,磁电式传感器在低速工况下,信号处理是个难点。
关键参数:磁电式传感器输出信号幅值通常为 0.1V~100V(取决于转速),频率与轮速成正比。
4.1.2 霍尔式传感器
霍尔式传感器就不一样了。它利用霍尔效应,输出的是数字方波信号。
我个人更喜欢霍尔式,原因有三:
- 输出幅值固定——不管转速多低,输出都是标准的TTL或CMOS电平
- 抗干扰能力强——数字信号嘛,噪声容忍度好很多
- 可以检测零速——磁电式在静止时没信号,霍尔式可以
当然,霍尔式也有缺点——它需要供电,而且对气隙比较敏感。我曾经遇到过一批霍尔传感器,安装气隙稍微大了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系统的眼睛,眼睛不好使,后面的控制逻辑再漂亮也没用。下一章我们聊聊如何用这些速度信号来判断车轮是否即将抱死。