基于MATLAB/Simulink的EPS建模仿真与参数整定指南
发布时间:2026/9/19 1:14:15 作者:尧图编辑部 阅读量:1,286

简介此PDF为西华大学硕士学位论文围绕MATLAB/Simulink平台下电动助力转向EPS系统的建模、仿真与试验展开适合车辆工程、自动化及控制仿真方向的本科生、研究生和工程师阅读。压缩包仅含1个pdf文件大小约1.33MB论文包含中英文摘要、理论建模、控制器设计、仿真分析与台架试验等完整章节。作者在分析EPS系统结构和工作原理后建立了机械转向系和减速机构的动力学模型、助力电机电学模型以及考虑车身侧倾的三自由度车辆动力学模型和轮胎模型并设计了直线型与曲线型助力特性曲线。控制方面针对助力控制模式搭建了传统PID、Fuzzy-PID与LQG最优控制器针对回正控制设计了传统PID控制器仿真结果显示LQG最优控制效果最佳Fuzzy-PID次之传统PID相对较弱。最后通过EPS性能试验台架验证了仿真模型与控制策略的正确性。整份论文提供从系统建模、控制策略设计到仿真验证与台架试验的完整参考路径读者可直接借鉴模型方程、控制器结构与参数整定思路用于课题研究或毕业论文撰写。该资源已有305人学习。1. 基于MATLAB/Simulink的EPS建模仿真到底在研究什么EPS 是 Electric Power Steering 的缩写中文叫电动助力转向。基于 MATLAB/Simulink 的 EPS 系统建模仿真研究不是把几个 Simulink 模块连起来再跑一条曲线那么简单它是在桌面上复现一条完整的转向闭环驾驶员手力输入、扭杆变形、助力电机出力、齿条位移、回正力矩再加上车速对助力大小的调度。做这个课题最常见的目标有两个一是验证 EPS 控制策略通常是助力特性曲线加电流闭环能不能在极限工况下稳住手感二是给毕业设计攒出一套能解释“为什么这样调参数”的仿真证据链。真正卡人的地方不是 Simulink 操作而是助力 MAP 怎么填、电流环和力矩环的带宽怎么分配、调完参数后曲线怎么读。这篇内容会从数学模型、Simulink 模块实现、参数整定到论文可用的验证技巧完整过一遍适合做 EPS 课题的车辆工程或控制方向学生也适合想快速搭一套转向台架仿真模型的工程师。2. 先把EPS拆成三套方程再落成Simulink子系统的参数文件2.1 转向柱—小齿轮—齿条的机械动力学简化EPS 机械部分可以拆成三个惯性环节转向盘与转向柱、助力电机转子、齿条与小齿轮。实车上这三者通过扭杆和蜗轮蜗杆耦合建模时按受力关系写成独立微分方程再在 Simulink 里靠信号互相连接比整体写成传递函数更直观也更容易加非线性环节。转向盘侧方程可以写成J_sw * phi_sw B_sw * phi_sw K_t * (phi_sw - phi_p) T_driver其中phi_sw是方向盘转角phi_p是扭杆输出端转角K_t是扭杆刚度。这里把转向柱简化为一个转动惯量加一个阻尼扭杆则当作线性弹簧。扭矩传感器输出的模拟量就是K_t * (phi_sw - phi_p)这个量要作为控制器的输入信号引出来而不是在 Simulink 里用“方向盘力矩”常量代替否则后续设计助力特性曲线时传感器环节就缺失了。齿条部分一般写成直线运动方程M_r * x_r B_r * x_r F_align (T_driver T_assist * G * eta) / r_p这里G是蜗轮蜗杆减速比eta是传动效率r_p是最小齿轮半径F_align是回正力矩。回正力矩可以先用常数或随车速变化的查表简化不必一开始就上魔术公式轮胎模型。需要注意的是齿条方程里已经出现了T_assist * G * eta说明助力力矩要折算到齿条侧再与驾驶员手力叠加这个折算系数如果在 Simulink 里漏乘最后仿真出的助力效果会差一个数量级。2.2 助力电机按直流电机建模助力环节按MAP查表EPS 电机在实车上有有刷直流永磁电机和无刷 PMSM 两类。毕业设计做系统级控制策略通常用直流电机模型就能说明问题一个电路方程加一个机械方程。U_a R_a * i_a L_a * di_a/dt E_a E_a K_e * phi_m J_m * phi_m B_m * phi_m K_tm * i_a - T_screw / (G * eta)K_e是反电动势常数K_tm是电机转矩常数T_screw是蜗杆侧的负载转矩。注意这里的负载转矩要来自机械子系统不能用手力直接除减速比否则电机和转向柱之间就没有信号耦合闭环反馈也就不成立了。助力目标力矩通常不是直接用“期望助力 转向盘力矩 × 常数”算出来的而是用一张二维 MAP 查表。表的行是转向盘力矩列是车速值是助力目标力矩。低速无助力或小助力中速线性增长高速增益压低并提前饱和这就是所谓“随速助力特性”。如果嫌手工填表过于粗糙也可以用 BP 神经网络先拟合曲线再把拟合结果导出成二维数组赋给 Lookup Table但这属于论文里的“锦上添花”不是建模的必需品。2.3 将参数整理成结构体用init脚本驱动整个模型EPS 参数数量多而且常需要批量调整做对比实验。不要直接在 Goto、Gain 模块的对话框里手工填数字那样一到改参数就会到处找来源。常见的做法是建一个init_eps_param.m脚本把所有参数放进一个结构体b在模型回调函数里调用它。% init_eps_param.m % 所有参数统一采集到结构体 b便于批量扫参和模型引用 b.J_sw 0.04; % 转向盘及转向柱转动惯量kg*m^2 b.J_m 0.0002; % 助力电机转子惯量kg*m^2 b.B_sw 0.35; % 转向柱粘性阻尼N*m*s/rad b.B_m 0.001; % 电机轴阻尼N*m*s/rad b.K_t 150; % 扭杆刚度N*m/rad b.K_tm 0.06; % 电机转矩常数N*m/A b.K_e 0.052; % 反电动势常数V*s/rad b.R_a 0.12; % 电枢电阻Ohm b.L_a 0.15e-3; % 电枢电感H b.G 16.5; % 蜗轮蜗杆减速比 b.eta 0.85; % 减速机构效率 b.M_r 30; % 齿条等效质量kg b.B_r 800; % 齿条阻尼N*s/m b.r_p 0.008; % 小齿轮半径m代码里把这些物理量全部按 SI 单位存入结构体b原因有两点一是 Simulink 里所有 Gain、Constant 模块直接引用b.R_a这类变量时不需要额外转换单位模型和脚本共用同一个工作区二是后面做批量扫参时只用assignin(base,b,b)就能把新参数灌进模型不用一个个地set_param。初始化脚本写好以后在模型窗口的 Model Properties 回调里设置PreLoadFcn为init_eps_param这样每次打开模型参数都在不会出现“模型打开却找不到变量”的报错。参数符号物理意义初值单位J_sw转向柱转动惯量0.04kg·m²K_t扭杆刚度150N·m/radG减速比16.51R_a电枢电阻0.12ΩK_tm电机转矩常数0.06N·m/AM_r齿条等效质量30kgr_p小齿轮半径0.008m表格里这些初值是可用的但它们不是标定结果。把参数从“能跑”调到“手感合理”需要进入第 4 章的整定流程。3. 按信号流搭Simulink模型扭矩输入端、助力MAP、电机闭环与整车接口3.1 模块层级与信号走向在 Simulink 里搭 EPS 模型建议按信号走向组织子系统而不是把模块全部堆在一个图层。常见划分是目标助力计算子系统、电机电流闭环子系统、机械动力学子系统、整车输入接口。各子系统之间只传递物理信号避免跨层引用 Goto/From否则后面做模型引用Model Reference和代码生成时会出现悬空信号。信号走向大致是车速信号和驾驶员手力同时进入“助力 MAP 计算”模块算出目标助力力矩目标助力力矩减去实际助力力矩误差进入 PI 控制器控制器输出目标电流目标电流与实际电流的误差再进入电流 PI输出 PWM 占空比等效电压电压输给电机模型电机输出实际助力力矩并折算到齿条齿条模块把驾驶员手力和助力力矩相加驱动齿条位移同时把扭杆变形量反馈给扭矩传感器。整个过程就是一个电流环套助力环的双闭环结构。子系统主要输入主要输出内部关键模块Assist MAPT_sensor, V_vehT_targetLookup Table (2-D), Rate Limiter, SaturationCurrent LoopT_target, i_feedbackU_motorPID Controller, SaturationMotor DynamicsU_motor, T_loadi_actual, T_motor电路方程 机械方程Steering MechanicsT_driver, T_motorphi_sw, T_sensorIntegrator, Gain, SumVehicle InterfaceV_veh, T_driver仿真曲线Signal Editor / Signal Builder这个层级的好处是调试时可以直接在子系统内部放 Scope也可以单独把电机模型替换成 PMSM 模型做对比。论文里如果你写“采用模块化建模方法模型具有良好的扩展性”对应的就是这一节的结构而不是一句空话。3.2 Simulink实现细节3.2.1 用Lookup Table 2-D放助力MAP并做防抖处理从 Simulink 库中拖入 Lookup Table (2-D)将行设为转向盘力矩、列设为车速。表的数据要多填几组让曲线光滑过渡。如果表里相邻值跳跃太大仿真时助力会突然变化看起来就像开关抖动。处理方法是在 Lookup Table 之后串一个 Rate Limiter限制助力的变化率通常上位机里这个值在每秒 2000 N·m 到 5000 N·m 之间变化电机响应速度是有限的。同时要在助力 MAP 之后加 Saturation。原地转向时驾驶员手感可以稍重但高速时目标助力力矩不能超过电机的持续转矩上限。假如电机持续输出是 45 N·m减速比 16.5折算到小齿轮的输出约 742 N·m而转向阻力矩一般不到 300 N·m所以低速大转角时 MAP 的输出会被饱和限制。这个限幅值其实就是后面整定电流环和助力环的上限依据。3.2.2 电流环与助力力矩环的双闭环电流环要单独放一个子系统用 PID Controller 模块就可以注意把 D 项设为 0EPS 电流环基本用 PI。电流内环需要比助力外环快 5 到 10 倍。仿真步长如果设成定步长电流环采样时间建议取 0.0001 s 到 0.0002 s助力环取 0.001 s车速输入取 0.01 s。用多速率仿真时所有信号在子系统边界会做采样率转换Simulink 默认用零阶保持这不会引起什么问题。在电流环 PI 输出之后需要加 Saturation 作为 PWM 输出限幅。真实控制器里这里限的是占空比直流电机等效模型里就限电压。如果试验中发现转矩响应出现振铃多半是电流环的积分限幅没有配合饱和上限导致积分饱和之后反向退饱和太慢。处理方式是在 PID Controller 参数页勾选 Anti-windup采用 back-calculation 并设 0.01 量级的系数。提示模型中如果有 Direct feedthrough 路径例如 T_sensor 不经延迟直接计算目标助力Simulink 可能提示“代数环”。解决这个问题的最直接办法是在助力 MAP 输出端加一个 Memory 或 Unit Delay但延迟会引入相位滞后。更好的做法是把机械子系统里的状态量作为积分器输出控制器读取状态量而不是跨层读扭矩这样可以绕开代数环而不损失精度。3.3 初始化脚本与模型工作区的衔接模型搭好后新建一个空脚本在脚本里通过set_param设置模型回调将参数脚本与其他初始化步骤绑定。% setup_model.m modelName eps_model; open_system(modelName); % 设置模型回调打开即加载参数 set_param(modelName, PreLoadFcn, init_eps_param); set_param(modelName, StopFcn, disp(EPS仿真结束)); % 载入参数并启动仿真 init_eps_param; simOut sim(modelName, StopTime, 5); % 查看输出信号注意使用时序 t simOut.tout; y simOut.yout;这段代码的关键作用有三个通过set_param把参数脚本绑定到模型生命周期避免打开模型后还要手动运行一遍初始化用sim命令以编程方式启动仿真而不必每次都用鼠标点 Run 按钮仿真结果被封装在simOut对象中便于后续脚本统一处理。参数说明上StopTime使用字符串格式真实仿真时长并不总是越长越好如果只做阶跃响应5 秒足够做双移线工况才需要 20 秒以上。4. EPS模型参数整定从开环响应到闭环阶跃三个必调参数4.1 整车模型里最影响手感的是扭杆刚度与齿条阻尼在 EPS 模型里扭杆刚度K_t直接影响驾驶员感受到的手力大小。扭矩传感器读到的就是K_t * 扭杆角度差设置过大驾驶员必须使出很大力气才能让转向柱转动感觉“方向盘很沉”设置过小一点点手力就转过一个大角度方向盘轻飘飘但指向性差。常规乘用车 EPS 扭杆刚度在 2 N·m/deg 到 4 N·m/deg 之间换算成弧度大约 110 到 230 N·m/rad参数脚本中b.K_t设为 150 就在这个区间内。齿条阻尼B_r则决定了回正时的收敛速度。阻尼过小松开方向盘后齿条会在回正力矩作用下反复振荡表现为“左右摆头”阻尼过大回正过程拖沓方向盘不能自动回正。整定时先固定B_r 800 N·s/m跑一次 90 km/h 高速回正工况松开方向盘观察转角曲线如果回正时间超过 4 秒或者出现两次以上过零就按 100 的步长递增B_r再仿直到曲线只过一次零且回正时间在 3 秒左右。工况驾驶员手力输入车速需要观察的指标原地转向8 N·m0.5s 斜坡0 km/h电流响应上升时间、峰值助力城市低速0~5 N·m 正弦扫频30 km/h助力增益是否平滑高速回正2 N·m 脉冲后释放90 km/h回正时间、超调次数4.2 用阶跃响应看超调与带宽调电流环PI参数电流环 PI 参数不要凭感觉试。直流电机电枢回路的电气时间常数是L_a / R_aPI 控制器零点可以设置在这个位置用零点抵消电气极点这样电流环就可以近似成一阶惯性环节。具体调整步骤是先设Kp_c 2.0再令Ki_c Kp_c * R_a / L_a这样保证 PI 零点与电气极点重合电流环没有零极点对消造成的额外超调。然后在该基础上增加Kp_c提升电流环带宽。如果想用更工程化的方式验证可以把原模型里助力外环的 PI 增益临时降为 0只保留电流环闭合然后给目标电流发一个阶跃信号测量实际电流的超调量。超调量超过 10% 就降低Kp_c或增加Ki_c响应太慢就增加Kp_c。按表里的初值设置Kp_c在 2 到 5 之间Ki_c约等于Kp_c * 800。提取阶跃响应指标时手工读图既不准确也容易在答辩时被追问。用一个脚本处理仿真结果是更稳妥的做法。下面这段代码计算上升时间、调节时间和超调量function [tr, ts, Mp] stepMetrics(t, y, ref, tolPct) % 输入时间序列、响应序列、目标值、容许误差百分比 % 输出上升时间tr、调节时间ts、超调量Mp y_f movmean(y, 5); % 平滑局部抖动 y_ss ref; idx_rise find(y_f 0.9 * y_ss, 1, first); tr t(idx_rise); % 上升时间单位与t一致 idx_settle find(abs(y_f - y_ss) / y_ss tolPct / 100, 1, last); ts t(idx_settle); % 调节时间 Mp (max(y_f) - y_ss) / y_ss * 100; % 超调量百分比 endmovmean(y, 5)是长度为 5 的滑动平均用来滤掉 Simulink 数值积分引起的局部微抖避免把采样噪声当成超调。ref是稳态目标值在阶跃响应中可以直接用阶跃幅度。调用时这样写[tr, ts, Mp] stepMetrics(tout, current_actual, 10, 5);10表示目标电流是 10 A5表示在稳态值的 5% 误差带内判定进入调节状态。论文里写“上升时间低于 0.1 s超调量低于 5%”时用这个脚本算出来的数据才有依据。提示调整电流环时一次只改一个参数否则超调变大你分不清是 Kp 太高还是 Ki 太低。电流环先整定整定完成后把电流环参数固定再调助力外环的 PI。这个顺序不能反否则外环的滞后会干扰你对电流环的判断。4.3 原地转向与高速回正工况的仿真结果判读原地转向工况在仿真中表现为低速大助力。把车速设为 0驾驶员手力以 0.5 秒斜坡从 0 加到 8 N·m观察助力目标值与实际电流的跟随情况。如果实际电流有明显超调说明电流环 Kp 偏低或 Ki 偏高如果电流在斜坡结束后还在缓慢爬升说明积分作用偏弱。高速回正工况直接用 Signal Editor 构造脉冲输入2 N·m 手力维持 0.1 秒后归零模拟驾驶员松开方向盘。此时转向系统在回正力矩作用下回正要注意齿条位移曲线是否存在高频振荡。振荡的来源通常是齿条阻尼不足或扭杆刚度与转向柱阻尼的组合刚好落在欠阻尼区域优先调B_r其次是B_sw。如果已经出现持续振荡但B_r调到 3000 也没有明显改善就要检查齿条回正力矩查表表是否出现了负斜率——回正力矩在高速区应该随齿条位移增大而增大查表段取点不够密时容易形成局部反向斜率。5. 三个能直接写进论文的进阶验证技巧5.1 用批量扫参脚本找出助力增益的上限论文里如果只贴一组仿真曲线评阅人会问“为什么选这个增益”。批量扫参是回答这个问题的标准做法。在脚本中循环修改助力增益分别记录超调量和调节时间把结果画成曲线就能清晰看到临界增益的位置。% sweep_boost_gain.m gainList 5:0.5:15; results table(); tEnd 5; for idx 1:numel(gainList) b.K_boost gainList(idx); assignin(base, b, b); simOut sim(eps_model, ... SimulationMode, normal, ... StopTime, num2str(tEnd)); tData simOut.tout; yData simOut.yout{1}.Values.Data; [tr, ts, Mp] stepMetrics(tData, yData, ... max(yData(end)), 5); results [results; table(gainList(idx), tr, ts, Mp)]; end plot(results.Var1, results.Var3); xlabel(助力增益); ylabel(超调量(%));这段脚本里b.K_boost是模型中定义的助力增益变量每次循环通过assignin改工作区结构体然后用sim重新仿真。注意这里没有用parfor因为assignin涉及基础工作区写入并行池里容易出数据竞争。仿真输出的第 1 个信号是助力目标力矩取稳态值用max(yData(end))是为了避免个别工况中出现末端非收敛毛刺。5.2 用Simulink Test给模型做回归保护论文修改中最容易出问题的是改完某处参数后其他工况的结果变了你却不知道。Simulink Test 的 Test Assessment 可以在仿真过程中对信号做断言例如高速回正工况要求“回正时间小于 4 秒超调次数不大于 1 次”如果模型被改坏测试会直接失败并给出失败时间点。在测试经理里把原地转向、低速扫频、高速回正三个工况组织成一个测试套件每次大改后跑一遍回归。如果因各种原因不方便升级 Simulink Test也可以在初始化脚本里用assert判断关键参数范围例如assert(b.K_t 100 b.K_t 250);至少能在仿真启动前挡住低级错误。5.3 用timetable格式输出仿真结果一图三线让答辩更有说服力建议在模型配置参数里将输出保存格式设为timetable这样仿真结果会自带时间轴后续处理时用simOut.yout{1}.Values就能取到完整信号。画图时把驾驶员手力、助力目标力矩、电机实际输出力矩三条线放在同一张图中横轴时间纵轴力矩高亮标注上升时间和稳态区间导师一眼就能看出闭环跟随关系。这张图就是答辩中使用率最高的一张“控制效果总览图”。本文还有配套的精品资源点击获取