ARTICLE DETAIL

资讯详情

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

EHB与电机复合制动系统Simulink仿真建模与协调控制策略详解

EHB与电机复合制动系统Simulink仿真建模与协调控制策略详解 做底盘电控的朋友应该都有明显感觉这两年线控制动已经从“PPT概念”变成了智能驾驶量产项目里的正经议题。EHB电子液压制动作为其中落地最稳的一支配合电机再生制动既解决了能量回收的效率问题又保住了液压制动在极端工况下的安全兜底。这套系统听着高大上但真要在 Simulink 里从零搭一遍仿真很多人第一步就卡住了——不知道模型该分几块、参数填多少、模式切换逻辑怎么处理。这篇文章按照我实际搭模型的经验把 EHB 与电机复合制动系统的 Simulink 仿真完整过一遍从整车动力学、电机模型、液压模型到协调控制策略和踩坑记录都展开讲清楚适合正在做相关课题的研究生、刚入行的底盘电控工程师以及想快速理解线控制动逻辑的软件和测试工程师。1. 整体架构与建模思路先想清楚再动手1.1 为什么是EHB加电机复合制动先聊一个很多人容易混淆的概念。EHB 全称是 Electro-Hydraulic Brake本质是“线控液压制动”。它把传统制动里的真空助力器拿掉了用电动泵加蓄能器提供高压制动液轮缸压力由高速开关阀或线性电磁阀独立调节。好处很明显制动响应快、能主动建压、踏板感觉与制动压力解耦而这些恰恰是智能驾驶冗余制动和线控底盘最需要的能力。但 EHB 单独做有一个绕不开的问题能量回收效率低。车辆减速时的动能如果全通过液压摩擦变成热量既费刹车片又把能量白白浪费掉。这时候电机再生制动就派上用场了。电机在减速工况下可以反向发电把动能转化为电能存回动力电池这个过程同时会产生制动力矩。把 EHB 和电机制动组合起来就是一个典型的“机电复合制动系统”。这里有一个关键认知电机再生制动不可能完全替代液压制动。电池 SOC 高了要限制回收功率电机转速低了扭矩会掉急刹车时电机制动力矩响应再快也扛不住整车需求低附着路面下更要防止单轴制动力过大导致失稳。所以 EHB 负责兜底、电机负责回收、控制策略负责协调三者缺一不可。仿真阶段要研究的就是这套协调逻辑在各种工况下是否可靠、制动力分配是否合理、故障降级是否可接受。1.2 顶层架构与模块划分我开始搭这个模型时并没有一上来就铺一堆模块而是先在纸上把顶层数据流画清楚。一个完整的 EHB-电机复合制动仿真系统按我的习惯至少分成六块驾驶员意图模块踏板位移或减速度需求输入本质是一个信号发生器用来模拟正常制动、缓踩、急刹等场景。整车纵向动力学模块把作用在车轮上的制动力转化为车速变化和减速度。电机再生制动模块输出电机可提供的再生制动力矩同时反映电机能力限制。EHB 液压制动模块根据压力指令输出各个轮缸的实际液压制动力。控制策略模块负责制动力需求的总解释、电液分配、前后轴分配、模式切换。这是整个模型的核心。监控与后处理模块Scope、Dashboard、数据记录用于观察减速度、车速、压力、电机扭矩等信号。顶层用总线信号连接控制策略在图中的位置就像大脑它接收踏板指令、车速、SOC、各轮缸压力反馈、电机状态然后同时向电机控制器和 EHB 阀体发出控制指令。物理子模型之间不要直接耦合都通过策略模块中转这样后续做代码生成时可以直接把策略模型抽取出来。1.3 仿真模型不是越细越好建模颗粒度选择这里必须说一句大实话仿真模型不是越细越好。做策略验证和做液压部件设计对模型精度的要求完全不同。我见过不少初学者一上来就建三维流体模型、有限元轮缸模型结果仿真速度感人参数一大堆也不知道哪个对结果影响大。在 EHB-电机复合制动的策略仿真阶段建议的颗粒度是整车用单轮或双轴纵向模型电机用外特性曲线加一阶惯性环节液压部分用压力动态近似模型加力-压力转化系数。只要抓住“制动力如何产生、如何传递、如何分配”这条主线就足够把控制策略验证清楚。等策略定型了再针对具体部件细化也不迟。所以整体思路就一句话先用最小可行模型跑通控制逻辑再根据研究目标逐级加细节。这样建出来的模型干净、易维护、可复现。2. 三大核心子系统模型搭建从车辆到液压2.1 车辆纵向动力学模型5项阻力与Simulink积分链整车模型是仿真的地基。EHB-电机复合制动仿真里车辆方向跑不跑偏、ABS起不动作这类问题可以先不管先把纵向动力学做扎实。纵向运动方程如下( m \frac{dv}{dt} - (F_{滚阻} F_{风阻} F_{坡阻} F_{制动} F_{电机偿还} ) )其中滚动阻力 ( F_f m g f \cos\theta )空气阻力 ( F_w \frac{1}{2} \rho C_d A v^2 )坡道阻力 ( F_i m g \sin\theta )制动相关的力是液压制动力和电机制动力在轮端折算的等效纵向力。在 Simulink 里搭建时我的做法是用一个 Constant 或来自参数脚本的初始速度作为积分器初值。把 m、g、f、Cd、A、R车轮半径等参数放进一个VehicleParam.m脚本里模型里的模块直接引用工作区变量而不是在模块里写死数字。车速通过 Integrator 对加速度积分得到位移也可以通过 Integrator 再接一个但制动场景一般只看速度和距离不需要单独建位移积分也可。我给出一个常用的车辆参数表可以直接抄作业参数符号数值单位整车质量m1500kg车轮半径R0.31m空气阻力系数Cd0.3-迎风面积A2.2m²滚动阻力系数f0.012-重力加速度g9.8m/s²路面附着系数μ0.8-初始车速v030m/s顺便提醒一个容易忽略的点如果模型里用到的质量很大、车速初始值给的是 km/h 或者 m/s一定要在信号线上或者参数初始化里统一单位。Simulink 本身不限制单位但混用 m/s 和 km/h 会导致整个仿真的制动力需求差一个数量级这类错误排查起来很费时间。2.2 电机再生制动模型外特性、一阶惯性、约束条件电机部分我在第一次搭模型时走了一个误区想直接把永磁同步电机的 dq 轴模型、SVPWM、母线电压全部搭进去结果模型庞大、仿真速度慢而且控制策略的注意力全被电流环占据了。后来我自己总结在复合制动策略仿真的层面电机模型只需要做两件事一是准确反映电机当前能输出多少再生制动力矩二是反映扭矩响应的时间延迟。具体实现分三步。第一步电机外特性查表。低速段是恒扭矩区高速段是恒功率区。查表输入是当前电机转速输出是最大可用再生扭矩。在 Simulink 里用 Lookup Table 模块即可也可以直接用 MATLAB Function 写几行逻辑。第二步加一阶惯性环节。电机扭矩从指令到实际响应不是瞬时的通常可以近似成 ( T_{act} \frac{1}{\tau_m s 1} T_{cmd} )其中 ( \tau_m ) 一般在 20~50ms 量级。这个一阶惯性模型在模拟扭矩响应快慢时非常有效而且调参直观。第三步加约束条件。再生制动不是任何时候都能用的典型约束包括SOC 高于 90% 时禁止回收防止过充。车速低于 5km/h 时回收效率低且可能引起顿挫直接退出回收。踏板深度超过某个阈值比如 80%认为是紧急制动此时优先保证液压制动的安全性电机回收退出或只保留很小的补偿。电机的最大再生扭矩还受电池充电功率限制一般在策略里简化为查表曲线。这些约束条件建议放在控制策略模块里而不是电机模型内部因为从架构上讲“是否允许用再生制动”是整车能量管理决策电机模型只负责“给定扭矩下能出多少力”。2.3 EHB液压模型压力建立过程的近似与参数EHB 的液压制动系统包括电动泵、蓄能器、压力传感器、高速开关阀或线性压力调节阀、轮缸等。如果按照物理元件逐一建模压力脉动、阀芯运动、液容效应全都要考虑这对策略仿真来说过于沉重。我的做法是用一个压力动态模型来等效整个建压过程。轮缸压力 ( P_{wc} ) 对压力指令 ( P_{cmd} ) 的响应可以近似为一阶惯性加纯延迟系统[ P_{wc} \frac{K_h}{\tau_h s 1} e^{-T_d s} P_{cmd} ]其中 ( K_h ) 是压力增益( \tau_h ) 是建压时间常数( T_d ) 是阀控延迟。具体数值可以从台架实验数据中辨识也可以根据阀的特性估。举个例子如果系统在 200ms 内能从 0 建压到 10MPa时间常数大约取 40~60ms高速开关阀的 PWM 开关延迟大概在几毫秒到十几毫秒。压力指令与实际液压制动力之间的关系用夹紧力公式近似[ F_{hyd} 2 \mu_p r_{eff} P_{wc} A_{wc} ]这里的 ( \mu_p ) 是衬块摩擦系数( r_{eff} ) 是有效制动半径( A_{wc} ) 是轮缸活塞面积。在模型里可以直接做成增益模块或者更精细一点用查表把压力和制动力矩的非线性关系描述出来。另外说一个我在实际测试中踩过的坑EHB 压力控制是闭环不是开环。建模时一定把压力传感器反馈和 PI 控制器闭环画进去否则仿出来的压力总有偏差后续策略里基于压力阈值做状态切换时结果就会不准确。压力反馈信号可以直接从仿真压力输出引一条线走反馈回路这就模拟了真实传感器信号。3. 控制策略与Simulink实现把协调逻辑写成可跑的程序3.1 驾驶员意图解释与制动需求计算控制策略的第一步是把驾驶员踩踏板变成整车制动力需求。这个环节看起来简单实际上很影响制动感受。常规做法是用踏板位移查表得到一个需求减速度再乘以整车质量得到总制动力。踏板位移信号可以用 Step 模块、Signal Builder或者直接用一个信号发生器来模拟。我习惯在模型最前面放三个可选输入源PedalStep模拟固定深度阶跃、PedalRamp模拟逐渐加深的缓刹、PedalPulse模拟点刹或急刹。在仿真测试时通过跟车、低速蠕行、紧急制动这些场景来回切换。建议做一个二维查表横轴是踏板位移百分比纵轴是是否需要坡度补偿输出是需求减速度。制动力总需求 ( F_{req} m \cdot a_{req} )再加上坡度阻力的前馈补偿。这里有个细节制动需求计算时不要把滚动阻力和空气阻力重复算因为车辆动力学模块里已经包含了这些自然阻力策略模块只需要算“制动器要额外提供的力”。3.2 电液制动力分配逻辑从公式到模块电液分配是整个策略的核心。我常用的一套逻辑分三层。第一层计算电机可提供的再生制动力[ F_{motor_avail} \min(F_{motor_max_curve}, \frac{T_{motor_max}}{R}) ]再叠加 SOC、车速、踏板深度约束。如果当前工况允许回收就用 ( F_{motor_cmd} \min(F_{req}, F_{motor_avail}) )否则 ( F_{motor_cmd} 0 )。第二层剩余需求由液压系统承担[ F_{hyd_req} F_{req} - F_{motor_cmd} ]但这里要强调一个容易出错的地方电机再生制动通常只作用在驱动轴大多数情况是前轴液压制动则是前后轴都有。所以不能简单地把电机力和液压总需求分开就完事还要做前后轴分配。第三层前后轴制动力分配。理想的情况是按 I 曲线分配但工程中常用简化 β 线即前轴承担比例 ( \beta )后轴承担 ( 1-\beta )。如果把电机制动力放在前轴那么前轴液压实际需求是[ F_{hyd_front} \max(0, \beta \cdot F_{hyd_req} - F_{motor_cmd}) ]后轴液压需求是[ F_{hyd_rear} (1 - \beta) \cdot F_{hyd_req} ]这个公式逻辑还有一种更稳妥的写法先让电机承担总需求的回收部分再对剩余的液压需求做前后轴分配但分配时要把“电机补偿前轴”的比例考虑进去避免出现前轴液压需求为负值。实际工程中负值直接截断即可但如果频繁出现负值说明 β 分配或者电机回收比例设置不合理需要重新调。把上述逻辑写成一个 MATLAB Function 模块输入踏板需求力、电机可用力、车速、SOC输出前轴液压压力需求、后轴液压压力需求和电机扭矩指令这是一个非常清晰的模块化做法。初版代码逻辑可以很直白比如function [Fhf, Fhr, Trq_motor] braking_allocator(Freq, Fmotor_avail, enable_regen, beta) % 第一层回收力计算 if enable_regen Fm min(Freq, Fmotor_avail); else Fm 0; end % 第二层液压总需求 Fh Freq - Fm; % 第三层前后轴分配电机回收部分默认在前轴 Fhf max(0, beta * Fh - Fm); Fhr max(0, (1 - beta) * Fh); % 输出 Trq_motor Fm * wheel_radius; end如果想在 Simulink 里看到整个链条可以加几个 Scope分别放置需求制动力、实际液压制动力、电机回收力。一个明显的曲线特征是正常运行平稳减速时回收力尽量贴近需求力液压力曲线被压得很低工况不允许回收的时候液压力曲线立刻抬起来补位。3.3 Stateflow模式调度与建模工程化细节策略除了分配计算还有状态切换比如正常制动、紧急制动、ABS介入、故障降级。这些用普通 Simulink 模块也能做但状态一多就乱了。我的习惯是用 Stateflow 做模式管理每个模式对应一个状态状态之间画好转移条件。举个例子ABS 介入的判定可以是滑移率超过阈值此时直接切换到 ABS 模式电机回收力清零液压压力按 ABS 逻辑控制。以下状态可以很直观地建模Normal正常电液复合制动能量回收可用。ABS_Active滑移率过大液压压力做保压/减压/增压循环电机回收禁止。FailSafeEHB 故障或压力传感器故障进入冗余控制模式制动力需求按安全降级策略执行。模式切换要注意迟滞防止状态在边界附近频繁跳变。我的经验是给每个切换条件加一个阈值带比如进入 ABS 的滑移率阈值是 0.25退出 ABS 要等到滑移率降到 0.15这样模拟数值不会有抖振问题。再讲了工程化的两个细节。一个是 Model Reference 与 Subsystem 的选择。模型引用比较适合大团队协作和增量编译但早期调试时因为每个引用模型要单独编译改动参数后重新构建很慢。我建议前期用普通 Subsystem甚至先全部拍平写在一个模型里跑通后再封装成 Model Reference 提升复用性。不要一上来就过度设计。另一个是用 Bus 对象组织信号。车速、踏板、SOC、压力反馈这些信号分散在不同层级如果全部用 Goto/From模型一大就乱了。我把关键信号定义成 Bus 对象比如CmdBus控制指令和FeedbackBus反馈信号在 MATLAB 里用Simulink.Bus定义一次之后所有子系统的端口类型都选这个 Bus。整理出来以后模型像一张清清爽爽的信号流图后续调试、改版、给别人接手都方便很多。4. 仿真调试实战发散、调参与代码生成避坑指南4.1 仿真发散的3个典型原因与排查思路Simulink 仿真发散是新手最头疼的问题。模型跑着跑着风速变成 10^8或者压力飙到天上第一反应往往是怀疑算法有问题其实很多时候是数值实现的问题。我整理了遇到最多的三类第一类代数环。模型中存在输出直接反馈到同一模块输入的信号路径且没有存储元件打断。比如把压力反馈直接接回 PI 控制器再直接输出给压力模型就可能形成代数环。排查方法很简单Simulink 会在诊断窗口提示“Algebraic loop detected”这时候用 Memory 模块或者 Unit Delay 打破环路或者把反馈路径经过一个一阶惯性滤波器。注意打断位置要选在物理上合理的信号路径比如压力反馈先经过采样延迟再回到控制器。第二类初始条件不匹配。车辆初速度是 30m/s但策略里默认初始 SOC 为 0电机模型直接按 SOC 约束把回收禁止或者蓄能器初始压力为 0而压力控制器期望目标压力是 8MPa模型一开始就会震荡或发散。解决办法是参数初始化脚本里把所有初始状态和初始条件写清楚每个积分器都显式设置初始值。第三类求解器步长不合适。EHB 压力模型的时间常数很小车辆动力学的时间常数很大这构成了一个刚性系统。如果统一用默认的 ode45 变步长仿真在压力环节可能反复减小步长速度很慢如果固定大步长压力振荡直接发散。我的经验是如果模型不追求实时性先用ode15s试试多数刚性系统都会瞬间顺畅很多如果模型要生成代码跑实时硬件再用定步长求解器并根据最小时间常数选择步长比如压力时间常数 50ms步长取 1ms 以下比较稳妥。还有一个排查发散的小技巧在怀疑的量级巨大信号旁边放一个 Display 模块仿真暂停时直接看数值是从哪一步开始飞掉的。用这种方法我能很快定位是整车模型发散还是液压模型发散效率比满图找信号高得多。4.2 压力环PID整定流程与防积分饱和经验EHB 轮缸压力控制一般是一个 PI 环我给的初版参数是 Kp50Ki15积分限幅±100。但这组参数不是拍脑袋定的而是按一套流程调出来的。第一步先把积分项清零只保留比例项。给一个阶跃压力指令记录实际压力响应曲线。如果稳态误差偏大且响应慢逐步增大 Kp如果出现振荡减小 Kp。这个环节做到压力上升段足够快、不太过冲就可以。第二步加上积分项。积分项的作用是消除稳态误差但积分系数过大会带来超调和持续振荡。我一般先把 Ki 放在很小比如 1~3然后观察稳态误差是否收敛逐步加大到 15。注意积分器的输出一定要限幅否则压力到达目标后误差长期存在积分项会积累得非常大用户一松开踏板压力不会立刻降下来这就是典型的积分饱和现象。在实际工况里制动踏板回得快会感觉“刹车不回位”非常危险。第三步带上整车闭环检查。压力环调好了再把整车动力学、电机模型都接上跑一段完整的制动场景。这时候看整车减速度是否平滑是否存在压力抖动若压力抖动就再微调 Kp。4.3 模型整理、代码生成与FMU导出扩展模型调通只是第一步从仿真走向工程应用后面还有几条路可以做。先说代码生成。如果把控制策略模型在 Embedded Coder 里配置一下可以直接生成 C 代码烧到快速原型控制器或最终 ECU 里。这里有几个硬性注意事项模型必须使用定步长求解器避免在策略模型里使用 Continuous 积分器改成离散形式用到的 MATLAB Function 内部要避免动态数组和不支持代码生成的函数。我在做代码生成前还会把模型里所有 Signal 的 Data Type 显式设置成 double 或 single防止类型推导不一致。另一条经验是代码生成只针对控制策略模型整车动力学、液压物理模型不要参与生成所以建模初期就要把物理模型和策略模型分开放在不同子系统里这也是我前面强调架构的原因。再说 FMU 导出。现在整车虚拟仿真和跨工具联合仿真越来越常见比如和 CarSim、或一些自动驾驶仿真平台联调。Simulink 支持把子系统导出成 FMUFunctional Mock-up Unit导出时需要注意模型内部不能有 External mode 的依赖而且需要指定固定步长。FMU 导出后别人拿过去用其他仿真软件也能跑你的策略模型这对于团队协作和非 MATLAB 环境集成非常有用。模型整理这个事我是吃过亏才开始重视的。早期我搭模型时习惯在模型里加各种临时 Scope 和调试常量测试完了也不删导致模型越来越臃肿。现在我给自己定了三条规矩一是色彩分区控制策略、物理模型、信号监控用不同背景色块区分二是公共信号走 Bus不要满图飞线三是每个正式版本打 Tag 保存大的改动前用 Simulink 自带的模型比较功能跑一遍差异确认没有把旧逻辑改坏。这套习惯养成后回头维护几个月前的模型压力小很多。最后再说一个个人体会很深的点复合制动系统的仿真最大的难点其实不在于某个子系统的建模精度而在于把所有子系统通过控制策略有机地串起来。很多时候你单独看电机模型、液压模型都是对的一合起来就出现减速度突变、模式频繁切换、回收和液压补力互相打架的问题这才是真实工程里最难啃的部分。所以不要期望一次仿真就得到完美曲线我的做法是先把模型跑通然后一个参数一个参数地试每改一个地方就记录一下现象慢慢你就对这套系统的脾气摸得很清楚了。仿真的价值也在这里它让我们能在实验室里提前把这些问题暴露出来而不是等到实车路试的时候再去救火。
返回列表