4. 传感器接口设计:扭矩传感器、角度传感器、车速传感器接口

好,咱们进入正题。EPS 系统里,传感器就是系统的「眼睛」和「耳朵」。没有它们,你根本不知道方向盘转了多少、转得多快、车跑得多快。今天我就把三个最关键的传感器接口——扭矩、角度、车速——掰开揉碎了讲清楚。

4.1 扭矩传感器接口:手感的核心

扭矩传感器,说白了就是测量你手劲大小的。你打方向用了多大力,它告诉 ECU,ECU 再决定给电机出多大力。这个信号要是出问题,那手感就全乱套了。

接口类型:目前主流的是模拟电压输出和数字 SPI 输出。模拟的简单,两根线(信号+地),但抗干扰差。数字的复杂些,但稳定。

我个人习惯用 SPI 接口。为什么?因为模拟信号在车上跑,容易受电机 PWM 干扰。我遇到过一台车,原地打方向时扭矩信号抖得像心电图,查了半天,就是线束跟电机线走得太近。

关键参数

  • 测量范围:通常 ±8 Nm 到 ±12 Nm
  • 分辨率:12 bit 以上(4096 级)
  • 更新率:至少 1 kHz(越快越好)

接口电路设计时,要注意几点:

  • 模拟信号必须加 RC 滤波,截止频率 1 kHz 左右
  • SPI 时钟线要加串联电阻,防止过冲
  • 电源必须独立,别跟电机驱动共用
// 扭矩传感器 SPI 读取示例(伪代码)
uint16_t readTorqueSensor(void) {
    uint16_t raw;
    CS_LOW();
    raw = SPI_Transfer16(0x0000);  // 发送 dummy 数据,读取返回值
    CS_HIGH();
    // 注意:有些传感器需要先发命令再读数据
    return raw & 0x0FFF;  // 取低 12 位有效数据
}

避坑指南:我曾经遇到过 SPI 时钟极性配反了,读出来的数据全是 0xFFF。后来用示波器一看,才发现 CPOL 和 CPHA 没对上。所以,上电后先读个固定值验证一下,这是好习惯。

4.2 角度传感器接口:位置的基础

角度传感器告诉你方向盘转了多少度。这个信号直接决定了助力大小和方向。你想想看,如果角度信号错了,你往左打,它给你往右助力,那车不就失控了吗?

常见的方案有两种

  • 霍尔式角度传感器:非接触,寿命长
  • 磁阻式角度传感器:精度更高,但贵一些

接口上,现在主流是 SENT 协议(单边半字节传输)。这是一种单线数字协议,抗干扰能力强,而且只用一根信号线,省线束。

协议 线数 更新率 抗干扰 成本
模拟电压 2
SPI 4
SENT 1
PSI5 2

我建议优先考虑 SENT 协议。它虽然更新率不如 SPI 高,但 EPS 角度信号一般 1-2 ms 更新一次就够了,SENT 完全能胜任。而且单线传输,故障率低。

注意:角度传感器通常需要做 零点校准。方向盘正中间时,输出值应该是 0°。但机械安装总有偏差,所以 ECU 里要存一个零点偏移值。我见过有项目忘了做校准,结果车跑直线时方向盘是歪的。

// 角度零点校准流程
void calibrateAngleZero(void) {
    uint16_t raw = readAngleSensor();
    // 假设车辆在直线行驶时执行此函数
    g_angleOffset = raw;  // 保存零点偏移
    // 之后每次读取都减去这个偏移
}

uint16_t getAngle(void) {
    uint16_t raw = readAngleSensor();
    return (raw - g_angleOffset + 360) % 360;  // 处理绕圈问题
}

4.3 车速传感器接口:助力的调节器

车速信号决定了助力的大小。低速时助力大,让你轻松停车;高速时助力小,让你感觉稳重。这个信号要是丢了,那 EPS 就只能按默认车速工作,手感会很奇怪。

接口来源:车速信号一般来自 ABS/ESP 系统,通过 CAN 总线发送。也有老车型用霍尔式车速传感器直接输出脉冲信号。

CAN 接口:这是最省事的。从 CAN 总线上直接读取车速报文就行。但要注意:

  • 车速报文通常有校验位,要验证
  • 车速值可能是 km/h 或 m/s,注意单位换算
  • 有些车厂会做车速信号滤波,别直接用原始值
// CAN 车速信号解析示例
void parseVehicleSpeed(uint8_t *data) {
    // 假设车速在 CAN 报文的 Byte 0-1,单位 0.01 km/h
    uint16_t raw = (data[0] << 8) | data[1];
    float speed_kmh = raw * 0.01f;
    
    // 做一阶低通滤波,防止信号抖动
    static float filtered_speed = 0;
    filtered_speed = filtered_speed * 0.9f + speed_kmh * 0.1f;
    
    g_vehicleSpeed = filtered_speed;
}

个人经验:我曾经遇到一个项目,车速信号在低速时跳变很厉害。停车时车速应该是 0,但 CAN 报文里偶尔会跳成 3 km/h。结果就是原地打方向时,助力突然变小一下,手感很差。后来加了滤波和阈值判断,低于 5 km/h 直接强制为 0,问题解决。

4.4 三个传感器的协同工作

这三个传感器不是孤立的。扭矩和角度信号共同决定了助力方向,车速信号调节助力大小。我一般会在 ECU 里做一个 传感器融合模块

  1. 先读角度,判断方向盘位置
  2. 再读扭矩,判断驾驶员意图
  3. 最后读车速,查表得到助力系数
  4. 三者相乘,得到目标助力电流

嗯,这里要注意:三个传感器的采样时序要同步。如果扭矩是 1 ms 更新一次,角度是 2 ms,车速是 10 ms,那就要以最慢的那个为基准。我习惯用车速的更新周期作为控制周期,因为车速变化最慢。

故障处理策略

  • 扭矩传感器失效 → 立即切断助力,进入手动模式
  • 角度传感器失效 → 使用扭矩信号估算角度(精度下降)
  • 车速传感器失效 → 使用默认车速(通常 30 km/h)

记住:安全第一。宁可没助力,也不能给错误助力。

好了,传感器接口这块就这些。说白了,硬件接口选对了,软件滤波做足了,故障处理想全了,这部分的坑就能避开大半。下一章咱们聊聊电机控制接口,那才是真正考验功力的时候。