ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

EHB-电机复合制动系统Simulink仿真建模与实战解析

EHB-电机复合制动系统Simulink仿真建模与实战解析 做EHB-电机复合制动系统Simulink仿真第一道坎不是搭模型而是被“仿真发散”四个字反复摩擦。我最初在Simulink里搭建这套系统时原以为核心难点是EHB液压控制那块真跑起来才发现电机再生制动和液压制动的动态配合才是真正让人挠头的地方。这篇文章把我从零到一整个建模、调试、验证的过程做一个完整记录适合正在做线控制动、再生制动、或者底盘域控制器仿真的工程师参考尤其是从理论公式走向可运行模型这一步很多细节不写下来下次还得重新踩一遍。1. 仿真正式开始前EHB和电机复合制动到底在解决什么问题1.1 EHB把传统液压制动变成了一个“可编程的执行器”EHB全称是Electro-Hydraulic Brake线控液压制动。传统液压制动系统里驾驶员踩下制动踏板通过真空助力器和主缸直接推动轮缸产生制动力踏板踩多深制动力就有多大踏板的机械连接在物理上保证了“人-车”之间的直接反馈。而EHB取消了踏板与主缸之间的纯机械硬连接改由踏板位移或踏板力传感器来采集驾驶员制动意图电子控制单元根据意图计算目标制动力或目标减速度再通过电机驱动液压泵或高速开关电磁阀/线性电磁阀对轮缸建压。这个转变的意义非常大。制动系统从“机械执行”变成“软件定义”意味着可编程、可调节、可与其他控制器协同。比如最简单的应用在EHB架构里做防抱死制动的压力控制不再需要传统ABS泵那样复杂的阀体逻辑软件可以直接对每个轮缸压力进行闭环调节再比如调节制动踏板脚感可以通过踏板模拟器主动产生力反馈而不是完全依赖机械弹簧。所以在模型层面EHB执行器本身就是一个“带延迟、带限压、带动态响应特性的压力源”建模的核心是把它的物理特性抽象出来。1.2 电机复合制动的难点不在电机在“底盘协同”电机复合制动系统本质上是在原有液压制动系统之上叠加了电机的再生制动能力。车辆减速时电机运行在发电模式产生负转矩这个负转矩经过减速器传递到车轮形成制动力同时把动能转化为电能回充电池。理想情况下驾驶员踩下制动踏板请求0.3g减速度控制器可以优先让电机提供这0.3g液压系统在旁边待命如果电机制动力不够再由液压系统补足。听起来不复杂但麻烦在于两个系统有完全不同的特性。电机再生制动的优势是响应快、可回收能量但它受限于转速转矩外特性、电池SOC、电池温度、最大充电功率液压制动的优势是能力强、可靠性高但建压过程有延迟控制精度也不如电机转矩控制那么细腻。两者叠加之后如果协调不好可能出现的问题是液压和电机同时作用总制动力超过驾驶员请求值制动感受突兀电机回收能力因为SOC过高被限制而液压补偿不及时造成制动力不足低附着路面上电机再生制动扭矩过大直接导致驱动轮抱死触发ABS甚至引发失稳在液压-电机切换瞬间出现制动力波动让驾驶员感到“点头”或“顿挫”。这些问题的共性在于它们都不是单一系统本身的问题而是两个系统之间的“协调问题”。要研究协调问题最安全、成本最低、迭代最快的方式就是把整车、电机、电池、EHB全部搬进Simulink里形成一个人可以为所欲为加故障、调参数、看边界条件的仿真环境。1.3 为什么坚持用Simulink而不是手写代码我也见过一些人直接写C代码去验证控制策略或者在Excel里做离线计算。这些方式不是不行但到了EHB-电机复合制动这种多物理量、多时间尺度、强耦合的系统上Simulink的优势就体现出来了一是模型可读性强物理信号连接关系一目了然评审、交接都方便二是自带大量连续域、离散域、逻辑状态机模块非常适合描述“连续被控对象离散控制逻辑”这种混合系统三是后续可以很方便地做代码生成、FMU导出、硬件在环这条路从仿真模型到量产控制器的衔接比手写代码顺滑得多。所以下面的内容就围绕Simulink展开从模型架构、模块搭建、参数设置、控制策略、求解器配置到结果解读一路走下来。2. 模型架构与接口定义先把系统拆开再把信号接起来2.1 顶层子系统划分在打开Simulink新建模型之前我强烈建议先在纸上把架构画出来确定子系统边界和数据流。EHB-电机复合制动系统的顶层结构我一般切成五个子系统子系统主要职责输入输出DriverIntention驾驶员制动意图解析踏板行程、挡位目标减速度BrakeControlStrategy制动力分配与协调目标减速度、车速、SOC、电机状态电机扭矩命令、液压压力命令ElectricDrivetrain电机与减速器、电池模型电机扭矩命令、车速再生制动力、实际扭矩、SOC、允许扭矩EHBBrakeSystem液压制动执行器与轮缸压力命令液压制动力VehicleDynamics整车纵向动力学总制动力、行驶阻力车速、位移这个划分方式遵循一个原则把“决策”和“执行”分开。BrakeControlStrategy只做计算和决策它不关心EHB内部有多少个电磁阀、电机是永磁同步还是异步ElectricDrivetrain和EHBBrakeSystem只做物理执行它们也不关心上层的分配策略为什么是这样。这样后续无论是换一个电机模型还是换一套EHB液压结构都只需要替换对应子系统不影响其他地方。2.2 接口信号表与总线定义子系统边界清晰之后下一步就是定义接口信号。在Simulink里接口信号太多时最好用Bus对象管理而不是拉一根根线到处连线。我的习惯是先建一个Bus定义文件把信号名称、单位、数据类型固定下来。顶层信号我大致这样定义brakePedalTravel单位%标定后映射为请求减速度vehSpeed单位m/s提供车辆当前速度batterySoc单位%用于再生制动回收判定vehReqDecel单位m/s^2整车请求减速度motorTrqCmd单位N·m电机目标转矩motorTrqActual单位N·m电机实际转矩hydraulicPressCmd单位bar液压系统目标压力hydraulicPressActual单位bar液压系统实际压力brakeForceTotal单位N实际作用于车辆的总制动力。这里有一个非常关键的点信号命名必须自带单位或者有明确的单位说明。我见过太多合作项目里A工程师传过来一个信号叫“brake_pressure”结果单位是MPaB工程师按bar去接整个模型跑出来的制动力直接差了10倍排查了一下午才发现是单位问题。所以总线信号里我习惯把单位直接放进信号名称注释里或者用总线对象属性统一管理。2.3 参数集中管理与初始化脚本模型里不可避免会有大量标定参数和物理参数绝对不要把这些参数直接填在Simulink模块的对话框里那样改起来会让人崩溃。我在工程里统一使用一个MATLAB脚本或者一个参数结构体来管理比如% VehicleParameters.m Params.m 1500; % 整车质量 kg Params.g 9.81; % 重力加速度 m/s^2 Params.rWheel 0.31; % 车轮滚动半径 m Params.Cd 0.28; % 风阻系数 Params.Area 2.2; % 迎风面积 m^2 Params.rhoAir 1.206; % 空气密度 kg/m^3 Params.fRoll 0.012; % 滚动阻力系数 Params.Kb 150; % 液压制动系数 N/bar Params.taoHyd 0.05; % 液压系统时间常数 s Params.GearRatio 8; % 电机减速器减速比 Params.EtaGear 0.95; % 传动效率 Params.CapBat 60; % 电池容量 Ah然后在模型的InitFcn回调里调用这个脚本或者直接运行一遍再打开模型。这样做的另一个好处是后续做参数扫描、DOE、联合仿真时只需要循环修改结构体里的值不用动模型本身。在用到的Simulink模块里参数填成Params.xxx这种形式模型自动从MATLAB工作区解析。这样即使隔了一个月再打开模型只要重新运行参数脚本就能保证所有参数被正确加载。3. 核心模块搭建车辆动力学、电机再生制动与EHB液压系统3.1 整车纵向动力学模型整车纵向动力学模型是整车的“被控对象底座”它的核心方程很简单m * dv/dt -F_brake_total - F_roll - F_aero - F_grade其中F_brake_total是作用在车辆上的总制动力包括液压和电机再生F_roll是滚动阻力F_aero是空气阻力F_grade是坡道阻力。这里要注意方向定义车辆向前为正制动力为负但在Simulink实现时我更习惯把制动力取正值代入然后在方程里加负号避免积分过程中符号混乱。在Simulink里搭这个模型用到的模块不多一个Gain、一个Add、一个Integrator外加几个查找表函数。空气阻力F_aero 0.5 * 空气密度 * Cd * A * v^2需要用车速通过Fcn模块或查表实现非线性计算滚动阻力用F_roll f * m * g。不过这里有一个坑很容易忽略当车速积分到零时如果制动力依然存在积分器会继续把速度往负方向推导致车辆“倒车”。实际车辆静止时制动力被地面静摩擦力平衡车辆不会反向运动。解决方式有两种一种是在积分器后面加一个限速模块速度小于零时强制回零另一种是写一个if判断当车速已经接近零且总制动力大于行驶阻力时把车辆加速度强制设为零。更严谨的做法是建立带有“停车锁定”的纵向动力学模型但初版仿真我用一个饱和度模块配合一个判断逻辑就够用if v 0 totalForce 0 % 车辆已停且仍然受到制动作用保持静止 a 0; else % 正常动力学计算 a totalForce / m; end在Simulink里实现这个逻辑可以在积分器前面用一个Conditional Executed Subsystem或者MATLAB Function模块。虽然多写几行代码但能避免后期做低速工况时车辆状态出现“幽灵倒车”的问题。3.2 电机再生制动模型电机模型的复杂度取决于你仿真想回答什么问题。如果只是想看制动力分配逻辑是否正确不需要把电机的dq轴电流环都建模出来用一个简化的“转矩响应外特性限制”模型足够。电机模型的核心参数是不同转速下的最大转矩能力。永磁同步电机在基速以下可以输出峰值转矩基速以上随着转速升高最大转矩按功率限制下降。把这个关系用一维查表表示0~3000rpm最大转矩280N·m3000~6000rpm最大转矩从280N·m线性下降到140N·m6000rpm以上最大转矩继续下降从电机转速换算车速需要知道减速比和车轮半径公式是n_motor v * SpeedRatio / (2 * pi * rWheel) * 60其中v是车速单位m/s。这个换算是必要的因为电机外特性查表的输入量是转速。在Simulink里实现时我通常用Lookup Table或Interpolation Using Prelookup模块输入是电机转速输出是当前转速下允许的最大转矩上限。查表得到的是转矩上限外部控制器发出的转矩命令需要经过一个Min取小再送到电机的动态响应环节。电机的动态响应通常用一个一阶惯性环节近似时间常数根据电机与控制器匹配程度取值20~50ms。这个时间常数会直接影响再生制动跟得上跟不上液压补偿所以在后续看制动切换波动时这个参数值得重点观测。电池SOC模型也要考虑进去。再生制动回收能量的前提是电池还能充电。一个简化但实用的处理方式是给SOC设定一个上限比如SOC小于95%时才允许再生制动超过后直接限制回收功率到零同时还要考虑电池允许的最大充电功率换算成电机再生转矩上限T_battery_max P_bat_max / (n_motor * 2 * pi / 60)其中P_bat_max是当前SOC和温度下电池允许的最大充电功率。如果忽略这个限制模型里会出现“电池疯狂充电”的不合理工况和实车的差距会非常大。3.3 EHB液压制动子系统EHB液压制动子系统在这个仿真模型里不需要把主缸、液压泵、每个电磁阀的流体动力学全部做出来。首版仿真建模我用两个核心环节来刻画EHB的动态特性一是压力响应延迟二是压力限幅。液压压力命令到实际压力的动态可以用一阶惯性环节表示dp/dt (p_cmd - p_actual) / tau_hyd时间常数tau_hyd取值取决于执行器类型。EHB如果采用线性电磁阀建压响应时间可以做到50~100ms采用开关阀脉宽调制控制响应会慢一些也可能带有一定波动。我在模型里初始取50ms后续做控制策略分析时再根据实车或台架数据修正。如果做更高保真的研究可以把一阶环节换成Simscape Fluids的液压组件但那样会显著增加仿真耗时而且很多参数在早期设计阶段根本拿不到所以一阶惯性加限幅是全生命周期里性价比最高的方案。液压制动力计算方式是F_hyd p_actual * Kb其中Kb是液压制动系数单位N/bar通过制动器参数标定得到。这个系数综合了轮缸活塞面积、制动器效能因数、有效制动半径等因素。我在初版模型里取Kb150N/bar意味着100bar压力大约能产生15kN总制动力对于1.5吨的车来说超过1g留出足够冗余。3.4 驾驶员制动意图模型驾驶员模型的作用是产生制动请求。在纯仿真环境里可以用一个简单的映射踏板行程0~100%对应请求减速度0~0.8g。0.8g不是随便取的这是国标和行业里普遍认可的高强度制动下限超过这个值一般视为紧急制动。在Simulink中用一个一维查表模块把踏板行程映射成请求减速度即可。仿真时我习惯再加一个Signal Builder或者Signal Editor生成不同的驾驶操作曲线比如0.3g轻度制动模拟普通路口减速0.5g中等强度制动考验混合制动协调性0.8g紧急制动模拟踏板猛踩到底的极端工况。驾驶员的制动请求是整个控制策略的输入边界所以这里务必把曲线弄得符合实际不能一上来就施加阶跃信号去考验系统——阶跃请求会暴露很多模型在极端工况下的数值问题但它不代表真实的驾驶员行为。4. 制动力分配策略从并联分配到串联再生制动的逻辑实现4.1 并联分配为什么不好用所谓并联式再生制动指的是驾驶员请求的液压制动力不作任何调整传统液压制动系统按照请求值建压电机再生制动力在这个基础之上额外叠加。这种方法实现简单对传统底盘改动小但它有两个致命缺陷总制动力等于液压制动力加上电机制动力驾驶员踩同样的踏板深度实际制动减速度比纯液压车更大导致制动脚感不一致再生制动力不受上层协调在低附着路面容易让车轮抱死安全性存在隐患。所以并联方案在现代EHB-电机复合制动系统里基本被淘汰即使有厂家用也会严格限制再生制动扭矩在极低水平。4.2 串联再生制动分配逻辑串联式再生制动遵循“电机优先液压补差”的原则。核心目标是在满足驾驶员请求减速度的前提下尽可能多利用电机的再生制动力而液压系统只负责补足差值保证总制动力始终等于目标制动力。在模型里实现这个逻辑流程如下将驾驶员请求减速度a_req转换为总目标制动力F_req m * a_req根据电机当前外特性、电池充电功率限制和SOC限制计算当前条件下允许的最大再生制动力F_regen_max实际电机再生制动力F_regen min(F_req, F_regen_max)液压补足制动力F_hyd F_req - F_regen。有一点需要提醒实际工程里液压补足力通常还要考虑前后轴分配。如果电机只驱动前轴再生制动力作用在前轮那么液压制动也应该优先作用在前轴吗不一定。前后轴制动力分配会影响车辆的制动稳定性和法规合规性所以在串联分配逻辑里F_hyd内部还可以进一步按前后轴比例拆分。但在初版仿真里我直接把液压补足力视为整车层面的一个集中力不做轴间分配等后续引入整车稳定性控制再细化。下面是我在Simulink里用MATLAB Function实现这个分配逻辑的示例代码function [F_regen_cmd, F_hyd_cmd] decelToForceSplit(a_req, v, SOC, F_regen_max) % 目标总制动力 F_req Params.m * a_req; % 再生制动可用能力 F_regen_avail min(F_regen_max, F_req); if SOC 0.95 F_regen_avail 0; end F_regen_cmd max(F_regen_avail, 0); % 液压补足 F_hyd_cmd max(F_req - F_regen_cmd, 0); end这段代码的逻辑很直白但它在判断Soc上限时没有做迟滞控制。实际工程中如果SOC在0.95附近振荡再生制动会频繁切入切出造成制动力波动。更稳妥的做法是设置一个迟滞区间比如SOC高于0.95时关闭再生低于0.92时重新开启避免在边界处反复切换。4.3 用Stateflow实现复合制动状态机串联分配逻辑的另一个关键点是模式切换。传统用使能子系统或If模块也能做但当状态多了以后状态之间的切换条件很容易变成一个“蜘蛛网”可读性很差。我用Stateflow搭了一个制动状态机包含四个状态状态含义主要切换条件Standby待命无制动请求进入踏板行程为0RegenBrake纯再生制动进入F_req小于F_regen_maxSOC低于上限BlendedBrake复合制动电机液压进入F_req大于F_regen_max或SOC超限HydraulicOnly纯液压制动进入电机故障或SOC过高状态机的切换条件里有两个容易被忽略的地方一是低附着路面与非低附着路面的切换。在雨雪路面上再生制动扭矩不宜过大否则驱动轮会先于液压制动力作用下抱死。如果在控制策略里直接根据路面附着系数估算结果来限制F_regen_max状态机里就可以增加一个“低附着限制”状态或参数修正。二是ABS介入时的优先级。当ABS检测到车轮滑移率超过阈值所有制动力都必须退让尤其是再生制动力必须立即退出或降到安全阈值以下否则再生制动带来的额外制动力会让车轮更难以恢复转动。这个逻辑在状态机里可以这样实现只要ABSActive信号为真强制切换或保持为HydraulicOnly状态且再生制动命令降至零。Stateflow的好处是能让这些逻辑以可视化的方式呈现出来做审查、做测试用例分析都比纯代码清晰。5. 求解器配置与仿真发散排查从“数值爆炸”到稳定跑通的完整链路5.1 采样时间与求解器的选择策略Simulink模型建好之后求解器配置是让模型稳定运行的关键步骤。很多第一次做这类仿真的人上来就用变步长默认求解器ode45结果模型要么跑得奇慢要么发散了还查不出原因。这里我有一个比较固定的选择逻辑模型内同时存在连续被控对象车辆动力学、液压系统和离散控制逻辑Stateflow状态机、采样控制建议使用定步长求解器。定步长求解器推荐用ode4四阶龙格库塔或ode3步长一般取1ms。为什么是1ms因为EHB液压系统时间常数是50ms电机时间常数是20~50ms控制周期通常在5ms或10ms1ms的仿真步长既能保证动力学积分精度又能捕捉到控制系统采样瞬间的瞬态变化。如果模型里大量使用离散模块也可以用离散求解器直接步进但连续被控对象需要自行离散化工程量会大一些。我初版建模型时用的是变步长ode45结果前半段跑得好好的一到制动切换点就出现小幅数值振荡排查很久才意识到是变步长自适应算法在快速切换时步长变化过于剧烈引起的。换成定步长ode4步长1ms之后问题立刻消失。5.2 代数环问题与延迟化解法EHB-电机复合制动模型里非常容易出现代数环的位置是液压制动力反馈到控制策略的地方。举个例子控制策略根据请求减速度和电机制动力计算液压压力命令如果液压压力命令又依赖当前液压实际压力做闭环反馈而当前液压实际压力由EHB模型输出但EHB模型的输入又是这个压力命令中间没有状态量打断就形成一个无延迟的循环。Simulink的代数环求解器能尝试求解这种循环但很容易让模型变慢而且在实际物理系统中从命令到实际压力一定是有延迟的。正确的做法是在反馈回路中插入一个Memory模块或者Unit Delay模块人为地打破代数环。一个非常实用的排查技巧是模型运行前在菜单里开启诊断的代数环检测。如果Simulink提示检测到代数环不要急着禁用警告先定位是哪个信号路径形成的闭环再决定是否需要加入Memory模块。盲目加Memory可能会让模型的动态特性失真所以每个延迟都必须是有物理意义的。5.3 仿真发散定位的三个实战步骤这里分享我按照以下顺序排查仿真发散的完整流程这也是最常遇到的情况。第一步确认是否是初始条件不合适。比如积分器初始速度设置成了100对应实际车速100m/s但轮胎模型、空气阻力模型在那个速度区间可能完全没标定过直接发散。解决办法是把积分器初始值改为0或根据工况设置合理的初始车速同时利用过零检测去看速度曲线是否一开始就往错误方向走。第二步确认是否是增益符号错误。液压制动力方向反馈给整车动力学时如果符号取反整个系统会形成一个正反馈制动力越大车速越高车速越高请求减速度越大制动力再增大。几秒内仿真就会数值爆炸。这种问题光看曲线很难发现我的习惯是把系统关键环节的符号单独拉出来做一次开环测试断开控制闭环给一个固定命令看车速是否按预期方向变化。第三步查看是否是求解器步长过大。定步长模式下如果步长过大连续系统的动态特性无法被准确解析数值误差会不断累积最终发散。此时可以先把步长缩小一个数量级如果模型能收敛基本可以确认是步长问题再逐步增大步长找到稳定边界最终选择一个有2到3倍安全余量的步长。如果模型出现NaN值还可以在Simulink中启用NaN检测诊断Simulink可以提示NaN首次出现的模块位置往往会直接暴露问题源头。6. 工况设计与结果判读能量回收率到底怎么算6.1 典型测试工况设置模型能够稳定运行之后就该进入验证控制策略的阶段。我习惯把测试工况分成两类一类是单次制动工况一类是循环工况。单次制动工况用来分析特定控制逻辑的瞬态响应。比如设置一个初速度80km/h、目标减速度0.3g的制动过程时间从5秒开始制动持续到车辆停止。观察目标减速度与实际减速度之间的跟随误差、电机扭矩命令与液压压力命令的切换关系、以及车速是否平滑降为零。循环工况则用来评估能量的整体回收情况。如果手上没有整车企业的路谱数据可以使用CLTC或NEDC这类标准循环工况做初版评估。需要明确的是标准循环工况的重心不是让你看着好看而是让你在同一个基准下比较不同分配策略的回收效果。我在实际项目中经常用NEDC来做控制策略的横向对比原因就是它数据开源、业内认可度足够高方便和其他团队对齐。6.2 关键曲线怎么看仿真跑完先拉出以下几条曲线车速-时间曲线看减速过程是否平滑有没有异常的反向加速或台阶目标减速度与实际减速度对比曲线看跟随误差如果误差超过0.05g说明分配逻辑里存在明显问题电机扭矩命令与实际扭矩曲线看再生制动是否触达限制边界以及限制发生时是否平滑降级液压压力命令与实际压力曲线看液压系统是否及时补位这里特别关注电机扭矩被限制下降的时刻液压压力是否同步上升总制动力分配曲线把电机再生力和液压制动力画在同一张图里二者之和应该恒定等于目标制动力。最容易出现问题的画面是电机扭矩因为SOC边界限制突然掉到零液压压力曲线在随后几十毫秒内才逐渐补上来中间出现一个明显的制动力“凹陷”。这个凹陷表现出来就是驾驶员感受到的制动力波动。要解决它需要在SOC边界接近时提前平滑地降低再生制动力同时让液压系统提前预增压而不是等再生制动力掉光了再动作。6.3 能量回收率计算公式与后处理脚本能量回收率是评估这套系统节能效果的最直观指标。把它定义为回收率 实际充入电池的能量 / 车辆制动过程可回收的动能可回收动能按下式计算E_kinetic 0.5 * m * (v0^2 - v1^2)实际充入电池的能量如果模型里直接有电池电流和电压信号可以积分E_charge ∫ V_bat * I_bat dt在Simulink中可以在电池模型输出端加一个积分器但我更习惯把仿真数据导到MATLAB工作区做后处理。下面是一段常用的后处理脚本% 读取仿真结果 t logsout.get(time).Values.Time; v logsout.get(vehSpeed).Values.Data; Vbat logsout.get(batteryVoltage).Values.Data; Ibat logsout.get(batteryCurrent).Values.Data; % 初始车速 v0 v(1); v1 v(end); % 可回收动能 E_kinetic 0.5 * Params.m * (v0^2 - v1^2); % 实际充电能量 E_charge trapz(t, Vbat .* max(Ibat, 0)) / 3600; % 单位 Wh % 回收率 eta_recovery E_charge / (E_kinetic / 3600) * 100;来自Soroban的警告这个计算里用max(Ibat, 0)意思是我只把充电方向电流计为回收能量放电方向的能量不计入。如果不加这个限制在再生制动过程中电池还有可能短暂向低压附件或电机控制器放电会低估回收率。能量回收率高低的判定标准跟整车工况强相关单次减速0.3g的中等强度制动串联分配下回收率做到60%~80%是完全可能的如果制动强度超过电机能力回收率会明显下降如果从120km/h刹到停风阻帮助消耗了一部分动能剩余动能中电机的回收占比才是关键。7. 从仿真到工程化外部模式、FMU导出与CarSim联合仿真7.1 Simulink外部模式做快速原型纯数字仿真只是第一步下一步通常是把控制策略模型部署到快速原型控制器上通过外部模式与实物执行器或更高保真的台架连接。所谓Simulink外部模式就是在代码生成时将模型与宿主机建立通信链路可以在运行过程中实时调节参数、观测信号而不需要重新编译生成代码。做EHB-电机复合制动系统项目时我通常先在纯仿真里确认控制算法收敛然后直接把控制策略模型生成C代码部署到MicroAutoBox或同类快速原型设备上台架验证时通过外部模式在线调整制动力分配系数。这个工作流的好处是算法层面的缺陷在仿真阶段已经被过滤掉到了台架更多是标定参数和验证接口时序的问题。7.2 代码生成与FMU导出Simulink模型做代码生成需要注意几个点一是控制策略模型里必须明确采样时间Simulink在生成代码时按采样周期生成周期任务二是Stateflow状态机里需要设置合理的状态数据初始值三是必须做模型在环测试用测试用例把控制策略的功能覆盖一遍再生成代码。FMU导出则是另一个方向。当整车仿真环境不是Simulink时可以把EHB-电机复合制动系统模型导出成FMU导入到CarSim、Amesim或其他仿真工具里做联合仿真。Simulink的FMU导出能力已经比较成熟但要注意版本兼容性问题不同工具的FMU支持版本可能不同2.0版本是当前兼容性最好的选择。7.3 与CarSim联合仿真CarSim在车辆动力学建模方面比手写Simulink模型更精细尤其擅长处理轮胎非线性、悬架运动学、路面附着变化等。EHB-电机复合制动仿真做联合仿真的思路是Simulink里保留控制策略和EHB执行器模型CarSim负责提供整车动力学、轮胎、路面、驾驶员等部分。联合仿真接口设计需要注意信号同步。Simulink和CarSim各自有独立的求解器通常通过固定步长互相通信步长选择需要权衡仿真速度和信号保真度。一般通信步长取1ms或2ms比较合理。通信时间步长设置不合理会导致信号出现插值误差甚至在高动态工况下出现控制抖动排查起来非常费劲。我对这个环节的建议是纯Simulink整车动力学模型先作为“基线”能够解释大部分协调控制问题当研究主题变成低附着路面稳定性、大侧向加速度工况或是复杂路面激励时再切换联合仿真环境不要一开始就上联合仿真那样只会让问题边界变得模糊。最后分享一个我自己养成的习惯仿真跑通根本不是终点能让别人拿着你的模型、换一组参数也能稳定跑出合理结果才算真正把EHB-电机复合制动系统理解到位。我会在模型里每一个自定义模块上都写清楚物理假设和适用范围在参数脚本里给每个变量加注释因为这类多系统耦合模型最怕的不是算法有多难而是半年后连自己都想不起来当时为什么把一个时间常数设成50ms。做仿真的人大多都有体会模型里所有数值都是有生命周期的参数背后的工况边界和假设条件才是真正值钱的东西。
返回列表