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 ~ 5400.1 deg/bit0
RWA_ActualAngle小齿轮实际转角deg-90 ~ 900.1 deg/bit0
RWA_MotorTorque转向电机扭矩Nm-8 ~ 80.01 Nm/bit0

总线信号采用有符号整数表示,物理量换算公式为:物理值 = 原始值 × 分辨率 + 偏移。反向换算为:原始值 = (物理值 - 偏移) / 分辨率。

代码实现

以下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;
}

信号流时序

线控转向信号流时序图(周期10ms) 0ms 10ms 20ms 30ms SWA RWA SWA_AngleCmd (转角指令) RWA_ActualAngle (实际转角) RWA_MotorTorque (电机扭矩) SWA解析反馈,计算路感扭矩 RWA执行转角跟踪 一个通信周期(10ms)

编译与运行

将上述代码保存为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)重新编译运行,观察换算结果是否满足物理值 = 原始值 × 分辨率的映射关系。