ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

EPS模型从零搭建:Simulink助力控制与PID整定全解析

EPS模型从零搭建:Simulink助力控制与PID整定全解析 做EPS模型这件事我建议每个走汽车控制方向的人不管本科课设还是研究生课题都尽量自己完整搭一遍别直接拿网上的成品改。我见过太多同学从论坛上拖下来一个Simulink模型文件名写的是EPS_Tutorial打开之后PID控制器、传递函数、信号总线全都连好了但一仿真不是发散就是超调根本不知道从哪个模块查起。自己从零搭一遍逻辑链路看得清清楚楚参数随手能改踩过的坑都会变成你写论文和答辩时的底气。这篇文章我从实际搭建的角度把电动助力转向EPS模型从物理拆解、控制策略设计到Simulink落地完整走一遍。重点讲两条主线助力控制里的PID参数到底怎么定以及回正控制中传递函数的摆放位置和物理含义。内容适合正在做EPS仿真的本科生、准备入门转向控制的研究生以及刚接触EPS标定的工程师。我会给出可复现的初始参数、模块连接顺序和踩坑记录保证你搭完不是只得到一个能动的Demo而是知道每个控制环节为什么存在。1. 先认清模型边界EPS仿真到底要建哪些东西1.1 转向管柱、电机轴、齿条三个环节各自承担什么很多新手拿到题目就去Simulink里找“转向系统”模块这是方向性错误。EPS模型第一步不是连模块是把物理系统拆成三个旋转轴系每个轴系都有自己独立的运动方程。第一个是方向盘与转向管柱。方向盘输入的是驾驶员手力矩和转角管柱本身有转动惯量和阻尼管柱和转向器之间通过扭杆连接。扭矩传感器测的其实就是扭杆两端的相对扭转量工程上通常把扭矩传感器的输出直接当作驾驶员手力矩的线性测量不必真的建扭杆两端各自的角度再求差那样只会给模型招来代数环问题。第二个是助力电机轴。电机通过蜗轮蜗杆减速机构把助力扭矩叠加到转向管柱或者齿条上C-EPS助力在管柱、P-EPS助力在齿条R-EPS就更靠里。对控制策略开发来说电机轴可以简化成“扭矩传递到转向柱等效点”你只需要知道减速比和助力扭矩的作用方向就够了。第三个是齿条与转向轮。做EPS控制策略时通常不需要把悬架和轮胎模型完整拉进来但回正力矩必须存在否则松开方向盘后模型不会自己回正。我的做法是用一个车速相关的表格来代替完整车辆动力学把回正力矩折算到小齿轮处这样既保留了主要的物理反馈又避开了轮胎侧偏刚度等一大堆难以调准的参数。这个三轴系划分不只是为了画框图它是你决定“哪里用传递函数、哪里用PID、哪里用查表”的依据。转向管柱是机械对象用微分方程描述电机电流环是电气对象用一阶惯性传递函数近似回正力矩属于外部车辆环境用查表加滤波处理。三者性质不同Simulink里的建模方式也完全不同。1.2 把模型简化到什么程度才够用一个完整的转向系统仿真包含的东西可以多到吓人转向柱摩擦、蜗轮蜗杆间隙、电机齿槽转矩、扭矩传感器噪音、弯道时的阿克曼几何效应。如果全部建进去模型会变成参数黑洞你调半天也不知道问题出在控制器还是物理模型。我建议的底线简化方案是这样的建模对象处理方式输出信号方向盘与管柱等效惯量 粘性阻尼 扭杆刚度转角、角速度、驾驶员手力矩助力电机一阶电流环传递函数 扭矩常数电机电流、助力扭矩减速机构固定传动比增益助力扭矩折算整车与轮胎车速相关的回正力矩查表小齿轮回正力矩扭矩传感器比例增益 低通滤波驾驶员扭矩信号按这个边界搭出来的模型自由度只有一到两个跑得极快却足够支撑PID参数整定、回正策略验证、还有后续和CarSim联合仿真时做控制接口测试。记住一条经验先跑通一个所有参数都摸得清的简单模型再考虑往上面叠精度顺序反了会让你陷入调试泥潭。转向管柱的转动方程可以写成这样J_c * d²θ / dt² B_c * dθ / dt T_driver T_assist - T_align - T_friction其中 J_c 是管柱等效转动惯量B_c 是阻尼系数T_driver 来自驾驶员模型或 Step 输入T_assist 是电机助力T_align 是回正力矩。这个方程在Simulink里不需要自己用微分方程模块拼两个积分器加几个增益就能搭出来后面会专门说。1.3 车辆速度信号是怎么影响两个控制通道的EPS 里车速信号的重要性不亚于手力矩信号它同时影响两条链路。第一条是助力增益原地转向时助力要大车速上来之后助力要逐渐减小否则高速时驾驶员会觉得方向盘飘这也是“手感”设计里最基础的一条曲线。第二条是回正特性车速低的时候回正力矩主要靠轮胎和主销几何车速高的时候回正力矩增大阻尼控制又要介入防止方向盘来回振荡。所以建模初期我直接预留两个惯性环节都是二维查表或者一维查表带速度输入端。一个表生成助力目标值一个表计算回正补偿系数。不要试着用公式拟合速度影响曲线实际标定数据离散性很强查表是最稳妥、也最容易被导师和答辩老师接受的方案。2. 助力电流环的PID设计为什么PI就够用参数初值怎么给2.1 先想明白电流环在整个EPS控制里的位置EPS控制器的结构可以拆成三层顶层是助力特性根据驾驶员手力矩和车速算出一个目标助力扭矩中间层是助力控制策略把目标扭矩和回正补偿、阻尼补偿叠加折算成电机的目标电流底层是电流调节环用PI或PID让实际电机电流老老实实跟随目标电流。很多教程直接让PID输出助力扭矩这在纯演示模型里能跑但和真实ECU差别很大。真实电机你控制的是电压最终有没有输出那么多扭矩取决于电流环有没有跟踪到位。所以我搭模型时会把电流闭环放进去PID控制器输出的是PWM电压指令电机电枢回路是一个1/(L*s R)的一阶传递函数实际电流乘以扭矩常数Kt和减速比才是助力扭矩。这样做的好处是一旦仿真结果和实车对不上你能分清是电流环的问题还是上层策略的问题。坏处是模型里多了一个PID要调但回报完全值得。2.2 助力特性曲线直接决定手感和安全性助力特性曲线的样子很直观驾驶员手力矩低于某个阈值时助力为零这是为了避免方向盘在直行中过于敏感超过阈值后助力线性上升达到一定手力矩后助力饱和防止大扭矩时输出过大造成转向过冲。我常用的助力特性表达是一张二维表格横轴是驾驶员手力矩第二维或查表输入是车速输出是目标助力扭矩。示例数据如下驾驶员手力矩 (Nm)0 km/h 助力 (Nm)60 km/h 助力 (Nm)120 km/h 助力 (Nm)000022.01.51.046.04.52.8610.57.54.5814.010.06.01016.012.07.5注意这个表的单位是扭矩对扭矩电机侧实际电流还要除以Kt和减速比。搭建的时候用Simulink里的2-D Lookup Table模块输入是手力矩和车速输出就是目标助力扭矩不用自己去写分段函数。这个表的数据来源有些是实车路采有些是标定经验值。学生项目里没有实测条件时用上面的量级先跑通完全没问题答辩时解释清楚“这是标定初值后续需要实车优化”就站得住脚。2.3 PID参数初值和整定顺序照着做能少走弯路EPS电流环的PID设计有个经验结论用PI就够了D项能不加就不加。原因有三个电流传感器本身有噪声微分项会把噪声放大电机电枢回路本身是一阶惯性PI就能做到无静差跟踪多一个微分项就多一个需要调的参数整车厂标定时最痛恨难调的参数。如果你确实想用PIDSimulink里PID Controller模块可以设置成带一阶低通滤波的微分项滤波系数N取100以上否则高频噪声会通过微分通道直接打进电流指令。我的默认配置是N100D很小甚至为零。参数据起步阶段可以这样给参数初值参考调整方向电流环比例增益 Kp0.05涨到系统开始轻颤再回落50%电流环积分增益 Ki5消除稳态误差过大会造成电流过冲微分增益 Kd0实在有振荡从0.01开始加微分滤波系数 N100保持100附近即可整定顺序我习惯是先把Kd设为0Ki也设为0只调Kp。让阶跃输入从1安培上升到2安培观察电流响应有没有超调。Kp从小到大增加到输出开始振荡的临界点记下数值然后取一半作为初始Kp。这时加入Ki从0开始缓慢增加积分作用会让稳态误差消失但同时低速段的响应会变软。两个参数交替调两三轮电流环就基本稳了。还有一个特别容易忽略的参数PID输出限幅。Simulink里PID模块的Output Limits必须设置否则仿真过程中某个瞬态扰动会让积分项累积到几千控制器输出一个不可能实现的电压值电机模型直接发散。这个坑光看示波器波形很难发现因为一开始只是电流不变后面整个系统突然崩掉。3. 回正控制的传递函数建模摆对位置比背公式更重要3.1 回正力矩从哪来手松开之后车上发生了什么驾驶员打完方向松开手前轮不应该停在有转角的位置。轮胎的侧偏特性、主销后倾角、主销内倾角共同产生一个让车轮回正的力矩。在整车模型里这些是轮胎和悬架模块的活但在EPS模型里我选择把整车环境抽象成一个回正力矩模型顺着“转向小齿轮”输入到管柱运动方程里。回正力矩的大小和方向盘转角、车速都有关系。低速时回正力矩相对较大所以常常出现回正过度高速时回正力矩也增大但阻尼效应同时增强如果阻尼补偿不够方向盘会有持续摆振。换句话说回正控制的难点不在“要让车轮回正”而在“回正要回得又准又不抖”。这正好是传递函数擅长的领域你可以把方向盘转角信号经过一个具有适当时间常数和阻尼比的传递函数再生成助力补偿扭矩。这个补偿扭矩和目标助力叠加在一起最终折算成电流指令进电流环。3.2 一阶传递函数怎么摆放从方向盘角到补偿扭矩回正控制的第一种简单形式是一阶传递函数前馈补偿。Simulink里放一个Transfer Fcn模块分子分母就是一个小惯性环节G(s) K_return / (τ * s 1)输入是方向盘转角输出是回正补偿扭矩。K_return是回正增益τ是滤波时间常数。为什么回正补偿要用这个结构而不直接拿转角乘以一个系数因为驾驶员松开手的一瞬间方向盘转角信号会有一个快速变化纯比例环节会把这种突变直接变成扭矩突变转向手感会很“贼”。一阶惯性相当于给补偿信号做了一次平滑补偿效果既跟手又不冲。参数初值参考K_return取2.5左右τ取0.05。这个组合的意思是转角偏离中位1度大约给2.5Nm的回正补偿但补偿信号不会瞬间拉满而是以20Hz左右的转折频率建立起来。把方向盘从30度松开补偿扭矩的建立过程大概0.1到0.2秒主观感觉就是“方向盘自己想着往中间走但不是被弹回去”。3.3 二阶传递函数的应用场景阻尼控制和回正抑制当基础回正调好之后经常发现方向盘回到中位附近时会有余振。这就是典型阻尼不足。此时回正控制里要叠一个阻尼补偿阻尼补偿的本质是“转角速度的负反馈”在Simulink里可以用微分加滤波实现也可以直接用一个二阶传递函数做整形。一个比较实用的传递函数形式G(s) (Kd * s) / (s²/ωn² 2ζ*s/ωn 1)参考值ωn取8 rad/sζ取1.2。分母里的二阶项起到带通滤波作用只放大回正过程中特定频率的角速度成分其他频段的噪声不参与控制。ζ大于1意味着这个环节本身是过阻尼的不会自己振荡这也是回正阻尼控制最基本的要求。为了仿真方便还可以使用s/(τ*s1)形式的微分近似但会对高频噪声更敏感我一般只用二阶形式。实现时需要注意Simulink的Transfer Fcn模块默认初值为零但如果你在仿真已经稳定的某个时刻切换回正控制开关初始状态和之前累积状态对不上输出会突然跳一个尖峰。所以实际模型里我会给回正角速度加一个Switch开关当回正使能条件满足后再接入同时把传递函数模块的初始条件设置为和当前仿真状态一致接不上的时候宁可在靠近中位的小范围内设个死区。3.4 车速如何参与回正补偿调配回正补偿不能每时每刻都满输出否则高速方向盘会“拽手”。工程上通常做法是再查一张速度系数表低速时回正补偿取1.0中速取0.7高速取0.3。这个系数乘到前面的传递函数输出上形成最终的回正补偿扭矩。车速系数的物理理由并不复杂低速时驾驶员有充足时间纠正回正量补偿大点没事高速时车辆对前轮转角变化极其敏感回正补偿如果过量有可能引发车辆横摆波动。所以在模型里速度信号是同时接到助力特性表、回正补偿系数表、阻尼控制器的三个输入端口这也是为什么整车速度总线要单独一路贯穿整个模型。4. Simulink搭建步骤顶层架构、参数脚本和总线选择器避坑4.1 顶层模块划分和信号走向打开Simulink空模型后第一件事不是拖模块是先从顶层画一个数据流草图用Subsystem把模型分成四块驾驶员输入模块、转向系统被控对象模块、EPS控制器模块、数据观察模块。驾驶员输入模块生成方向盘输入信号可以是Step定角度阶跃、Sin正弦扫频、Signal Builder自定义转向工况。学生项目里最常用Step加一个Switch模拟“打到某个角度后松开手”。转向系统被控对象模块把第二节的管柱转动方程放进来输入是驾驶员手力矩、助力扭矩、回正力矩输出是方向盘转角、角速度、扭矩传感器测量值。EPS控制器模块内部包含助力特性查表、回正补偿传递函数、阻尼补偿、电流环PI。输入是手力矩、转角、角速度、车速输出是电机电压。数据观察模块一组Scope加To Workspace方便后面做曲线对比和参数扫描。信号在模块之间用信号线直连为了让模型结构清楚可以右键创建Bus后打标签。不过总线这东西和后面要说的Bus Selector坑紧密相关新手使用要格外小心。4.2 参数初始化脚本所有增益都从工作空间读我强烈建议不要在Simulink各个模块框里硬填数字而是在模型前加一个MATLAB脚本或者回调函数把所有参数定义在工作空间。原因很实在硬填数字的模型一旦需要调参你得一个一个双击模块去改参数放在工作空间后改一次就能跑一遍扫参实验用MATLAB的for循环批量仿真都很方便。一个典型的初始化脚本长这样Ts 1e-4; % 仿真步长 0.1ms % 转向系统机械参数 J_c 0.04; % 转向柱等效惯量 kg*m^2 B_c 0.4; % 阻尼系数 N*m*s/rad K_t 2; % 扭杆刚度 N*m/rad % 电机与电流环参数 R_m 0.1; % 电枢电阻 ohm L_m 2e-4; % 电枢电感 H Kt 0.05; % 电机扭矩常数 N*m/A gear 16; % 减速比 % 电流环PI Kp_i 0.05; Ki_i 5; % 回正补偿传递函数 G_ret_num [2.5]; % 分子 G_ret_den [0.05 1]; % 分母 tau*s1 % 阻尼二阶传递函数 w_n 8; zeta 1.2; Kd 0.3; G_damp_num [Kd 0]; G_damp_den [1/w_n^2, 2*zeta/w_n, 1];脚本末尾我会加一句sim(EPS_model)方便直接从工作空间启动仿真。注意模型文件里所有需要调用的参数都要和脚本里的变量名严格一致大小写也不能错MATLAB对变量名是大小写敏感的Kp_i和Kp_I是两个完全不同的变量。4.3 传递函数和PID模块的具体配置PID Controller模块里双击打开Controller表单选“PID”的话可以同时看到三路增益我一般先设成PI。Form选“Parallel”Time Domain选“Continuous time”勾选“Use filtered derivative”再把N设成100。Output Limits要设比如电流环输出电压限幅在±12V这样积分项不会无限膨胀。Transfer Fcn模块双击之后要填Numerator coefficients和Denominator coefficients注意Simulink里系数是按s降幂排列的。比如G_ret_den [0.05 1]表示分母是0.05*s 1顺序写反了会得到一个纯增益项模型照样能跑但传递函数完全不对。这是很多同学模型能跑却结果诡异的原因。被控对象模块内部转动方程用两个积分器串联第一个积分器把角加速度变成角速度第二个积分器把角速度变成转角。输入一侧把驾驶员扭矩、助力扭矩、回正力矩相加再减去阻尼项。增益模块放在积分器前面即可。4.4 Bus Selector提示“没有可选信号”多半是这几个原因这个问题在相关技术社区里反复出现完全值得单独讲。Bus Selector报“没有可选信号”或者下拉列表是空的最常见的原因不是总线里真的没有信号而是模型里存在未更新状态。第一先按CtrlD让Simulink更新一遍图形很多情况下信号列表会立刻刷新出来。第二检查总线创建的时候是不是用了“Bus Creator”但这个Bus没有保存为总线对象如果是的话把Bus Creator的Output data type改成“Bus object”并在总线对象编辑器里定义好信号标签。第三检查上游信号线有没有被断开或者信号名称被改掉Bus Selector是根据信号名来匹配的上游信号改名之后选择器不知道你要选什么。第四如果从MATLAB工作空间导入总线数据先确认总线对象已经加载到工作空间里否则Bus Selector连解析都没有依据。一个更稳妥的替代方案是能不用Bus Selector就不用。直接在Controller Subsystem里用一个Mux把相关信号合并或者直接拉信号线到每个输入端。总线适合跨不同子系统传递大量信号但你只是做控制策略时用信号标签加一个去中心的连接方式反而更清晰。5. 让模型从能跑通到跑得合理测试用例与常见报错处理5.1 三组测试用例检验模型健康度模型搭好之后直接点运行能出波形只是第一步接下来要做三组针对性测试第一组是“松手回正测试”输入一个60度的阶跃转角保持1.5秒然后让方向盘输入端变成零力矩以模拟驾驶员松手。重点观察方向盘转角曲线合理结果是方向盘在1到2秒内回中可能有轻微过冲但稳态时残差应该在5度以内且不能出现持续振荡。如果回正太慢加大K_return如果回中后一高一低振荡减小回正增益或者加大阻尼系数。第二组是“恒力矩助力测试”方向盘输入保持6Nm恒定力矩车速分别设成0和60km/h。重点观察助力电流输出低速时助力应该明显大于高速助力曲线应该平滑没有电流持续超调或者震荡。这个测试最容易暴露电流环PI调得够不够稳如果电流一直在目标值附近抖先把Kp降下来检查信号噪声。第三组是“正弦扫频测试”方向盘输入从0.1Hz扫到2Hz的正弦信号把方向盘转角作为输出横轴、助力扭矩作为纵轴绘制曲线。这个测试能看到转向响应在什么频率开始滞后滞后多少。对EPS来说1Hz以下也就是平常打方向的速度范围响应滞后应该不明显如果明显滞后通常说明电流环带宽太低或者回正补偿的时间常数太大。这三组测试对应的信号我都接到Scope和To Workspace里每组跑完直接在MATLAB里画图方便把波形保存下来做论文插图。5.2 代数环问题为什么会报警怎么判断该不该加延迟代数环是Simulink模型里最典型的结构性错误。它本质是一个信号的当前值取决于它自身当前值的闭合回路Simulink在初始化时需要迭代求解代数约束很容易导致仿真卡死或者结果不可信。EPS模型中常见的代数环来源有两个一个是传递函数和PID模块构成的前馈链上有信号“直通”另一个是被控对象内部的扭矩平衡方程里某个扭矩又反过来依赖当前转角速度。我的排查思路是仿真时打开求解器诊断信息如果看到“Block diagram contains algebraic loop”的警告先找到警告里指出的信号路径。正常情况下传递函数因为分母存在惯性项不会产生代数环真正制造环路的是那些没有积分环节的纯增益反馈路径。处理方法有两种。第一种是调整控制结构把纯增益反馈改成经过一个小惯性环节这在物理上更合理因为现实电机扭矩建立本身有延迟。第二种是临时加一个Unit Delay模块打破代数约束。但我必须说明Unit Delay是应急手段加进控制主通道会额外引入一整个采样周期的延迟可能会让转向手感变“肉”所以定位出问题之后应该回到方案层面解决而不是顺手留一个延迟就完事。5.3 采样时间和求解器设置直接影响仿真成败EPS模型本身是连续系统但控制算法最终是要跑在数字控制器上的所以我在搭建时会把控制器部分设置成离散采样时间被控对象部分保持连续。PID控制器模块里可以直接勾选“Use discrete-time internal parameters”采样时间填Ts1e-4秒传输到电机模型那一侧的链路也保持这个Ts。仿真求解器选择“固定步长”算法用ode4或者ode5。EPS模型自由度少固定步长跑起来很快而且结果可复现用变步长虽然省时间但联合仿真或者批量扫参时结果不稳定。如果后续要和CarSim联合仿真统一步长设在1ms量级控制器的Ts也要跟着调整不要一边是0.1ms电流环一边是1ms整车模两者信号交互时会产生混淆。有个容易被忽略的坑是PID控制器换成离散模式后初始输出不再由连续积分决定而是靠初始状态。如果你发现模型刚开始仿真时电流指令跳了个大尖峰多半是离散PID模块的初始状态没有置零或者被控对象积分器初始角速度不为零。把积分器Initial condition设成0模型启动时刻就会安静很多。5.4 输出饱和与积分清零阶跃工况下最容易暴露很多人在阶跃测试时会看到电流环输出先冲到很大再慢慢回落这本身不算错误但如果I项没有合理限幅输出会持续饱和一段时间最终造成大幅超调。应对方法是在PID控制器里把积分项改成“limited integrator”并且设置好输出范围。Simulink PID模块自带一个“Anti-windup method”选项选“clamping”就能在输出饱和时自动停止积分累积这比自己在后面加饱和模块要规范得多。还有一个经验是EPS模型的饱和不只是输出限幅还有机械限位。方向盘转角到正负540度左右就会碰到机械限位现实中这时助力也会有一个专门的末端保护逻辑。纯仿真里如果连续输入大幅阶跃方向盘角会在限位位置卡住回正控制却还在把它往回拉两个方向打架容易让电流突变。所以我在被控对象里角速度积分器输出端加了一个饱和模块角度限幅设在±540度。6. 调参顺序和记录习惯这部分钱不能省最后分享一点个人习惯。EPS这种多控制通道耦合的系统最忌讳“哪边不对调哪边”。我自己的固定顺序是先把电流环PI调稳再调助力特性曲线让基本助力行为符合低速大高速小的规律然后加入回正补偿从一阶传递函数的小增益开始逐步加大到回正顺畅最后才叠加阻尼控制去压残余振荡。每调完一步就保存一份mat文件记录当前的Kp_i、Ki_i、K_return、Kd这些参数和对应的波形截图。这个习惯在写论文时帮了我大忙。答辩老师问“这个参数为什么从2改成2.5”我能直接翻出两条曲线对比告诉他改动前后回正时间缩短了0.2秒、过冲量下降了3度。做控制方向的项目调参证据链本身就是成果的一部分它比最后的漂亮曲线更经得起追问。另外一个小技巧是给模型里的每个标签好好命名。Simulink的Signal Name在Scope显示和To Workspace导出时都用得上信号名起成“Driver_Torque”“Assist_Current”“Return_Compensation”这种风格比默认的Signal 1、Signal 2方便一百倍。总线上也要有信号名这也是前面说Bus Selector能不能选到信号的关键之一。模型最终是要给别人看、给别人跑、给别人审查的命名清晰的模型天然显得专业。
返回列表