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 ms 更新一次,角度是 2 ms,车速是 10 ms,那就要以最慢的那个为基准。我习惯用车速的更新周期作为控制周期,因为车速变化最慢。
故障处理策略:
- 扭矩传感器失效 → 立即切断助力,进入手动模式
- 角度传感器失效 → 使用扭矩信号估算角度(精度下降)
- 车速传感器失效 → 使用默认车速(通常 30 km/h)
记住:安全第一。宁可没助力,也不能给错误助力。
好了,传感器接口这块就这些。说白了,硬件接口选对了,软件滤波做足了,故障处理想全了,这部分的坑就能避开大半。下一章咱们聊聊电机控制接口,那才是真正考验功力的时候。