1. 项目背景与核心需求
去年带队参与某新能源车企的线控转向系统研发时,我们遇到个典型问题:传统机械转向系统在智能驾驶场景下存在响应迟滞。当自动驾驶系统发出转向指令时,从方向盘到轮胎的机械传递链路上会产生约120-150ms的延迟,这在80km/h车速下意味着车辆要多行驶2.7-3.3米才能开始转向。
线控转向(Steer-by-Wire)技术的本质是解耦方向盘与转向轮之间的机械连接,改用电子信号传递转向指令。这种架构带来三个核心优势:
- 响应速度提升至20ms级,满足L3+自动驾驶需求
- 转向传动比可动态调整(运动模式/舒适模式切换)
- 节省底盘空间,便于电动车布局优化
2. 系统架构设计
2.1 硬件组成
我们的系统采用双MCU冗余设计:
- 主控MCU:Infineon TC297(三核锁步架构)
- 备用MCU:NXP S32K344
- 转向电机:博世第三代EPS无刷电机(峰值扭矩45Nm)
- 传感器套件:
- 方向盘转角:16位磁编码器(±900°量程)
- 轮胎转角:双冗余霍尔传感器
- 扭矩传感:应变片式扭矩传感器(±8Nm)
关键设计细节:备用MCU的供电必须独立于主系统,我们采用TI的TPS7B7701QKVURQ1作为独立电源管理IC,确保主系统断电时仍能维持50ms以上的供电。
2.2 软件架构
控制算法采用分层设计:
code复制应用层:转向策略(Simulink自动生成代码)
↓
中间层:故障诊断(AUTOSAR架构)
↓
底层:电机驱动(手写汇编优化)
特别要注意的是Simulink模型到嵌入式代码的转换配置:
matlab复制%% 代码生成配置
cfg = coder.config('lib');
cfg.TargetLang = 'C';
cfg.TargetLangStandard = 'C99';
cfg.HardwareImplementation.ProdHWDeviceType = 'Infineon->AURIX';
cfg.EnableOpenMP = false; // 必须关闭并行计算
3. 核心算法实现
3.1 变传动比控制
传统固定传动比(如15:1)无法满足不同驾驶场景需求。我们实现的动态传动比算法如下:
c复制float getVariableRatio(float vehicleSpeed, float steeringAngle) {
// 基础传动比
float baseRatio = 15.0f;
// 低速时减小传动比(方向盘更灵敏)
if(vehicleSpeed < 30.0f) {
return baseRatio * (0.7f + 0.3f * vehicleSpeed/30.0f);
}
// 高速时增大传动比(方向盘更沉稳)
else {
return baseRatio * (1.0f + 0.5f * (vehicleSpeed-30.0f)/70.0f);
}
}
3.2 预瞄控制算法
为解决转向延迟问题,我们引入预瞄控制策略:
matlab复制function [steeringCmd] = previewControl(curvature, previewTime, velocity)
persistent buffer;
if isempty(buffer)
buffer = zeros(ceil(previewTime/0.01),1);
end
% 更新缓冲区
buffer = [curvature; buffer(1:end-1)];
% 计算加权预瞄值
weights = exp(-(0:length(buffer)-1)*0.01/previewTime);
steeringCmd = sum(buffer .* weights') / sum(weights);
end
参数调优经验:
- 城市道路:previewTime=0.15s
- 高速公路:previewTime=0.25s
- 雪地模式:previewTime需增加30%
4. CarSim联合仿真
4.1 车辆模型配置
在CarSim中建立基准车型模型时,这几个参数对转向特性影响最大:
code复制[Vehicle]
Wheelbase = 2.85 // 轴距(m)
Mass = 1850 // 整车质量(kg)
Izz = 2800 // 横摆转动惯量(kg·m²)
[Steering]
MaxAngle = 30 // 最大转向角(deg)
Ratio = 15 // 初始传动比
4.2 典型测试场景
我们设计了5种验证场景:
- 阶跃转向输入(验证响应速度)
- 正弦扫频测试(验证稳定性)
- 双移线(ISO 3888-2标准)
- 湿滑路面圆周行驶
- 故障注入测试
实测中发现的问题:当车速>100km/h时,系统会出现约5%的转向不足。通过调整Simulink模型中的横摆角速度反馈增益解决了该问题。
5. 故障处理机制
5.1 三级降级策略
| 故障等级 | 检测方式 | 应对措施 | 恢复条件 |
|---|---|---|---|
| Level1 | 主MCU看门狗超时 | 切换至备用MCU | 主MCU重启完成 |
| Level2 | 双MCU通信中断 | 启用机械冗余链路 | 人工复位 |
| Level3 | 电源系统故障 | 激活EPB制动 | 维修后上电 |
5.2 CAN总线容错设计
关键改进点:
- 转向相关报文使用CAN FD格式(波特率2Mbps)
- 报文ID优先级划分:
c复制#define STEER_CMD_ID 0x101 // 最高优先级 #define STEER_FDBK_ID 0x102 #define SYS_STATUS_ID 0x201 - 增加CRC32校验字段
6. 实测问题与解决
在-30℃低温测试中遇到的典型问题及解决方案:
-
问题:EPS电机启动扭矩不足
原因:低温下永磁体磁通量下降
解决:在电机驱动算法中加入温度补偿系数:c复制float tempCompensation(float temp) { return 1.0f + 0.005f * (25.0f - temp); } -
问题:转角传感器信号漂移
原因:磁编码器温度系数未校准
解决:增加开机自校准流程,通过末端限位器确定零位 -
问题:CAN总线错误帧增多
原因:低温导致终端电阻阻值变化
解决:改用自动调节的CAN总线终端电路
7. 工程文件管理建议
对于此类涉及多学科协作的项目,我们采用这样的文件结构:
code复制/project
├── /docs # 设计文档
│ ├── SRS_v1.2.pdf # 需求规格书
│ └── FMEA.xlsx # 故障模式分析
├── /models
│ ├── CarSim # 车辆模型
│ └── Simulink # 控制算法
├── /src
│ ├── firmware # 嵌入式代码
│ └── tools # 标定工具
└── /tests
├── MIL # 模型在环测试
└── HIL # 硬件在环测试
使用Git进行版本控制时要注意:
- Simulink模型需先导出为
.slx格式再提交 - CarSim模型文件用
git lfs管理 - 每次HIL测试后保存
*.blf格式的CAN日志
8. 开发心得
-
控制算法调试:不要完全依赖仿真结果,我们遇到过Simulink仿真完美但实车振荡的情况。最终发现是电机驱动器的PWM死区时间设置不当导致。
-
传感器选型:方向盘扭矩传感器一定要选带温度补偿的型号,普通型号在太阳暴晒后会有±0.5Nm的零漂。
-
实时性保障:所有关键控制循环必须用示波器测量实际执行时间,我们曾因编译器优化导致某个函数执行时间从1ms突增到5ms。
-
团队协作:机械组和软件组要统一坐标系定义(我们吃过左/右转向符号定义相反的亏)。
这套系统最终实现了方向盘转角到轮胎转角的控制延迟<25ms,传动比可在12:1到18:1之间动态调整。最大的收获是认识到汽车电子开发中"仿真-台架-实车"三重验证的必要性——那些在屏幕上看不到的物理效应,往往才是工程实践中最具挑战的部分。