1. 线控转向系统架构与信号流解析
任务说明
本案例面向线控转向(SBW,Steer-By-Wire)系统开发人员,完成以下目标:建立线控转向系统的最小可复现架构模型,明确方向盘总成与转向执行总成之间的信号流关系,并给出可运行验证的信号映射逻辑。案例聚焦于转角指令、扭矩反馈、执行器状态三类核心信号的传递路径与格式定义,不涉及具体控制算法实现。
系统架构定义
线控转向系统取消机械转向柱,方向盘与转向器之间仅通过电信号连接。本案例定义如下双节点架构:
- 方向盘总成(SWA):采集驾驶员转角输入,生成转角指令信号;接收路感模拟扭矩指令并施加到方向盘电机。
- 转向执行总成(RWA):接收转角指令,驱动前轮转向电机跟踪目标转角;反馈实际小齿轮转角与电机扭矩至SWA。
两节点间通过CAN/CAN-FD总线通信,信号周期为10ms。信号流方向为:SWA→RWA传递转角指令(SWA_AngleCmd),RWA→SWA传递实际转角(RWA_ActualAngle)与电机扭矩(RWA_MotorTorque)。
信号格式与映射逻辑
为保证两节点间数据解析一致,定义如下物理量与总线信号映射规则:
| 信号名 | 物理量 | 单位 | 范围 | 分辨率 | 偏移 |
|---|---|---|---|---|---|
| SWA_AngleCmd | 方向盘目标转角 | deg | -540 ~ 540 | 0.1 deg/bit | 0 |
| RWA_ActualAngle | 小齿轮实际转角 | deg | -90 ~ 90 | 0.1 deg/bit | 0 |
| RWA_MotorTorque | 转向电机扭矩 | Nm | -8 ~ 8 | 0.01 Nm/bit | 0 |
总线信号采用有符号整数表示,物理量换算公式为:物理值 = 原始值 × 分辨率 + 偏移。反向换算为:原始值 = (物理值 - 偏移) / 分辨率。
代码实现
以下C代码实现信号封装与解析逻辑,包含物理量到总线原始值的转换函数、总线原始值到物理量的解析函数,以及一个完整的信号流模拟主函数,演示SWA发送转角指令、RWA接收并反馈的闭环过程。
#include <stdio.h>
#include <stdint.h>
/* 信号分辨率定义 */
#define ANGLE_CMD_RES 0.1f /* deg/bit */
#define ACTUAL_ANGLE_RES 0.1f /* deg/bit */
#define TORQUE_RES 0.01f /* Nm/bit */
/* 物理量转总线原始值 */
int16_t phys_to_raw(float phys_value, float resolution, float offset) {
return (int16_t)((phys_value - offset) / resolution);
}
/* 总线原始值转物理量 */
float raw_to_phys(int16_t raw_value, float resolution, float offset) {
return (float)raw_value * resolution + offset;
}
/* 信号结构体 */
typedef struct {
int16_t angle_cmd_raw; /* SWA发送的转角指令原始值 */
int16_t actual_angle_raw; /* RWA反馈的实际转角原始值 */
int16_t motor_torque_raw; /* RWA反馈的电机扭矩原始值 */
} SBWSignals;
/* 模拟RWA执行:接收转角指令,按1:1跟踪(理想执行器) */
void rwa_execute(SBWSignals *sig) {
/* RWA将接收到的转角指令作为目标,实际转角等于目标(理想跟踪) */
sig->actual_angle_raw = sig->angle_cmd_raw;
/* 模拟转向阻力产生的电机扭矩:与转角成正比,比例系数0.02 Nm/deg */
float target_angle = raw_to_phys(sig->angle_cmd_raw, ANGLE_CMD_RES, 0.0f);
float torque = 0.02f * target_angle;
sig->motor_torque_raw = phys_to_raw(torque, TORQUE_RES, 0.0f);
}
int main() {
SBWSignals signals = {0};
/* 驾驶员输入:方向盘转角为 120.5 度 */
float driver_angle = 120.5f;
/* SWA封装:物理量转总线信号 */
signals.angle_cmd_raw = phys_to_raw(driver_angle, ANGLE_CMD_RES, 0.0f);
printf("=== SWA发送 ===\n");
printf("方向盘转角: %.1f deg\n", driver_angle);
printf("总线原始值: %d\n", signals.angle_cmd_raw);
/* 总线传输后,RWA接收并执行 */
rwa_execute(&signals);
/* RWA反馈解析 */
float actual_angle = raw_to_phys(signals.actual_angle_raw, ACTUAL_ANGLE_RES, 0.0f);
float motor_torque = raw_to_phys(signals.motor_torque_raw, TORQUE_RES, 0.0f);
printf("\n=== RWA反馈 ===\n");
printf("实际转角: %.1f deg (原始值 %d)\n", actual_angle, signals.actual_angle_raw);
printf("电机扭矩: %.2f Nm (原始值 %d)\n", motor_torque, signals.motor_torque_raw);
/* 验证:实际转角应等于指令转角 */
if (actual_angle == driver_angle) {
printf("\n验证通过:实际转角与指令转角一致\n");
} else {
printf("\n验证失败:转角跟踪存在偏差\n");
}
return 0;
}
信号流时序
编译与运行
将上述代码保存为sbw_signal_flow.c,使用任意C编译器编译运行:
gcc -o sbw_signal_flow sbw_signal_flow.c -lm
./sbw_signal_flow
验证方法
程序输出应包含以下内容,用于判定信号流映射逻辑正确:
- SWA发送的方向盘转角为
120.5 deg,总线原始值为1205(由120.5/0.1计算得出); - RWA反馈的实际转角解析后仍为
120.5 deg,与指令一致; - 电机扭矩为
2.41 Nm(由120.5×0.02计算得出),原始值为241; - 程序最后输出
验证通过:实际转角与指令转角一致。
若输出与上述预期一致,则说明物理量与总线信号之间的封装/解析逻辑正确,SWA与RWA之间的信号流闭环成立。可通过修改driver_angle的值为其他角度(如-200.3、540.0)重新编译运行,观察换算结果是否满足物理值 = 原始值 × 分辨率的映射关系。