☰
EHB与电机复合制动系统Simulink仿真建模与协调控制策略详解
2026/9/29 23:52:23 网站建设 项目流程

做底盘电控的朋友应该都有明显感觉,这两年线控制动已经从“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:滑移率过大,液压压力做保压/减压/增压循环,电机回收禁止。
  • FailSafe:EHB 故障或压力传感器故障,进入冗余控制模式,制动力需求按安全降级策略执行。

模式切换要注意迟滞,防止状态在边界附近频繁跳变。我的经验是给每个切换条件加一个阈值带,比如进入 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 环,我给的初版参数是 Kp=50,Ki=15,积分限幅±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 支持把子系统导出成 FMU(Functional Mock-up Unit),导出时需要注意模型内部不能有 External mode 的依赖,而且需要指定固定步长。FMU 导出后,别人拿过去用其他仿真软件也能跑你的策略模型,这对于团队协作和非 MATLAB 环境集成非常有用。

模型整理这个事,我是吃过亏才开始重视的。早期我搭模型时习惯在模型里加各种临时 Scope 和调试常量,测试完了也不删,导致模型越来越臃肿。现在我给自己定了三条规矩:一是色彩分区,控制策略、物理模型、信号监控用不同背景色块区分;二是公共信号走 Bus,不要满图飞线;三是每个正式版本打 Tag 保存,大的改动前用 Simulink 自带的模型比较功能跑一遍差异,确认没有把旧逻辑改坏。这套习惯养成后,回头维护几个月前的模型,压力小很多。

最后再说一个个人体会很深的点:复合制动系统的仿真,最大的难点其实不在于某个子系统的建模精度,而在于把所有子系统通过控制策略有机地串起来。很多时候你单独看电机模型、液压模型都是对的,一合起来就出现减速度突变、模式频繁切换、回收和液压补力互相打架的问题,这才是真实工程里最难啃的部分。所以不要期望一次仿真就得到完美曲线,我的做法是先把模型跑通,然后一个参数一个参数地试,每改一个地方就记录一下现象,慢慢你就对这套系统的脾气摸得很清楚了。仿真的价值也在这里,它让我们能在实验室里提前把这些问题暴露出来,而不是等到实车路试的时候再去救火。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询