ARTICLE DETAIL

资讯详情

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

新能源VCU蠕行控制Simulink建模与标定实战教程

新能源VCU蠕行控制Simulink建模与标定实战教程 1. 先想明白VCU蠕行控制到底在干什么很多刚接触新能源电控的朋友一看“蠕行控制”四个字第一反应是“这玩意儿不就是松刹车车自己走吗有什么好搭的”说实话我当年也这样想过直到真正做VCU整车控制器的扭矩仲裁开发时才发现蠕行控制是整车扭矩管理里最容易被低估、却又最容易出问题的一环。所谓蠕行控制Creep Control说白了就是让车辆在驾驶员不踩加速踏板、只松开制动踏板的情况下以极低车速缓慢前进或后退的功能。开过传统自动挡燃油车的人都很熟悉挂D挡松开刹车车自己就往前走倒挡松开刹车车自己往后走。新能源车由于没有液力变矩器那种“液力耦合”天然蠕行特性必须靠VCU主动请求一个电机扭矩来模拟这个效果而且还要根据坡度、车速、挡位、制动状态做实时调整这就是蠕行控制的本质。为什么要单独做这个功能因为在停车场挪车、拥堵路况低速跟车、上坡起步辅助这些场景下驾驶员期望的是“松刹车就缓慢移动踩刹车就停下来”蠕行控制能让踩加速踏板这个动作变得不那么“神经质”大大降低了城市低速工况下的驾驶疲劳感。同时蠕行扭矩也是整车起步平顺性的第一道门槛扭矩给大了车会窜给小了坡道会溜标定不好非常影响客户主观评价。这个教程适合什么人群我觉得至少有三类人值得看第一类是刚进入新能源电控行业、准备接手VCU策略开发的初级工程师第二类是在校学生做课程设计或毕设需要完整的Simulink控制模型作为参考第三类是负责测试和标定的工程师想搞明白模型里某个扭矩请求是怎么算出来的。总之这是一套能“抄作业”、又能帮你理清逻辑的完整模型搭建流程。2. 工程实践前置Simulink环境与模型架构设计2.1 模型顶层架构先想好输入输出再动手很多新手一上来就打开Simulink拖几个模块就开始连线搭到一半发现信号对不上、逻辑乱成一锅粥。我的习惯是先在纸上画清楚整个VCU扭矩控制相关的输入输出矩阵。蠕行控制模型本身属于VCU扭矩仲裁层的一部分但它必须有清晰的接口边界方便后续集成到整车控制器模型里去。一个标准的蠕行控制模型顶层输入至少包括整车状态类车速VehSpd、纵向加速度VehAcc、挡位状态GearPosD/N/R/P、制动信号BrakeSw或BrakePressure、加速踏板开度AccPedalPos电机状态类电机实际转速MotorSpd通常等于车速乘以传动比折算但也可以直接引用实际值、电机实际扭矩MotTrqActual、电机允许最大正向扭矩MotMaxTorque、最大负向扭矩MotMinTorque功能状态类VCU上下电状态VCUPwrState、整车就绪状态ReadyFlag、Autohold状态等输出则很简单一个蠕行扭矩请求值CreepTrqReq单位Nm这个值会送到后续的扭矩仲裁模块和驾驶员踏板扭矩请求、限扭请求等进行优先级仲裁。这里有一个关键设计理念蠕行控制模型不要直接输出到逆变器而是输出到扭矩仲裁模块。因为蠕行扭矩只是整车扭矩请求的一个来源最终驱动电机的是经过多层限制后的目标扭矩。这样做的好处是将来你加入AEB自动紧急制动、ESP车身稳定系统干预时只需要在仲裁层增加一条规则不需要改动蠕行模型内部逻辑。2.2 选型Stateflow还是纯Simulink模块这是一个被问过无数次的问题。蠕行控制本身并不复杂用纯Simulink模块完全能实现但如果你要同时处理挡位状态切换、Autohold介入、上下电状态等多个离散状态Stateflow的可读性和维护性会好很多。我的习惯是模式判断用Stateflow底层扭矩计算用Simulink模块两者通过信号线连接。这样既避免了Stateflow里写了大量浮点计算的尴尬也避免了纯Simulink里状态逻辑嵌套过多导致的可读性灾难。针对本次教程我选择的是Stateflow加Simulink混合方案因为蠕行控制涉及SPN状态-参数-网络切换比如驾驶员踩下加速踏板时要迅速退蠕行模式踩下制动踏板时要进入“停止”状态松开制动踏板时要重新进入“激活”状态。这些逻辑用Stateflow画状态图非常直观。2.3 用到的关键Simulink模块清单我列出我在模型里实际用到的模块新手可以按图索骥In1/Out1模型输入输出端口Constant常量比如标定参数初值Lookup Table1-D或2-D蠕行目标扭矩查表、坡道补偿系数表Rate Limiter扭矩变化率限制器防止蠕行扭矩突变Saturation扭矩上下限幅PID Controller蠕行车速闭环控制可选Switch和逻辑运算模块模式切换、条件判断Stateflow Chart状态机Data Type Conversion数据类型转换Signal Editor / From Workspace仿真输入信号导入你不需要把所有模块一次拖完可以一边搭一边加。但Rate Limiter和Saturation一定要从一开始就想好放哪扭矩安全不是后期加的装饰而是模型的骨架。3. 保姆级建模实操一步步搭出蠕行控制模型3.1 建立基础输入信号先把数据喂进模型这一步看起来简单但很多人的模型后期出问题都是因为输入信号处理不当。我们需要在Simulink模型最左侧创建一组输入端口然后为每个端口配置好Sigal Data类型和初始值。以我常用的模型为例建立以下输入端口AccPedalPos%范围0-100BrakeSwboolean1代表制动踏板踩下GearPosenum或uint80N1D2R3PVehSpdkm/h或m/s建议统一用m/s便于计算MotSpdrpmBrakeMasterCylPressbar作为制动程度参考VehicleReadyboolean整车Ready信号为什么要单独处理BrakeSw和BrakePress因为有些低成本车型只有一个制动开关信号但想做精细蠕行退出控制需要根据制动压力大小来判断是“点刹减速”还是“持续驻车”。如果只有开关量那模型只能简单地在踩下和未踩下之间切换无法做缓停标定。建议在输入端口后接一个Signal Conversion模块把总线信号拆开同时加一个Memory或Unit Delay模块做信号时序对齐。高速采样下各个传感器信号往往来自不同的CAN报文周期有些是10ms有些是20ms如果不做对齐后面做模式状态机时很容易出现状态抖动。3.2 第二步Stateflow状态机设计——蠕行模式仲裁这是整个模型的核心逻辑中枢。我设计的状态机包含四个状态命名为OFF蠕行功能未激活通常发生在VCU未Ready、挡位在P/N、踩下加速踏板时CREEP_ACTIVE正常蠕行状态车按照目标车速行驶BRAKE_HOLD制动驻车状态驾驶员踩下制动踏板蠕行扭矩被切断车停止CREEP_EXIT退出过渡状态比如驾驶员踩加速踏板进入人工驾驶此时蠕行扭矩会按照一定速率下降至0状态切换条件需要充分考虑驾驶员的真实意图。我在项目里常用的切换条件如下OFF到CREEP_ACTIVEVCU Ready 挡位为D或R 加速踏板开度小于某个阈值比如1% 无制动开关激活或制动压力小于0.5barCREEP_ACTIVE到BRAKE_HOLD制动开关激活 或 制动压力大于0.5barBRAKE_HOLD到CREEP_ACTIVE制动信号消失 加速踏板开度小于阈值 挡位D/R任意状态到OFFVCU未Ready 或 挡位不在D/R 或 加速踏板开度大于2%这里有个容易被忽略的点加速踏板开度阈值不要设成0因为实际踏板传感器会有偏移噪声松踏板后信号可能不是绝对0而是0.5%或1%。如果阈值设太小会导致状态频繁抖动。我一般给到1%~2%且加一个30ms的滤波时间避免临界点抖动。还有挡位切换的处理。D挡和R挡的蠕行方向是不同的D挡蠕行扭矩为正R挡蠕行扭矩为负。实际项目里切换挡位瞬间要防止蠕行扭矩正负跳变否则会听到变速箱或传动系的“咔哒”冲击。我采用的策略是在挡位切换后的200ms内蠕行扭矩请求为0让系统先稳定然后再按照目标挡位输出扭矩。这个“扭矩零位保持时间”是可以标定的不同车型标定值不同。3.3 第三步蠕行目标扭矩计算——查表为主PID为辅状态机确定了什么时候进入蠕行接下来要解决的是进入蠕行后电机扭矩到底应该是多少这里的核心思想是蠕行控制不是简单的“固定扭矩输出”而是“目标车速闭环”和“目标扭矩直接标定”两种策略的组合。在低速蠕行工况下我更倾向于用目标车速闭环即VCU根据车速偏差通过PI控制器计算蠕行扭矩这样能自动适应坡道和负载。但在实际工程中纯PID也有问题比如起步瞬间车速传感器信号为零积分项容易饱和导致起步“发猛”。所以我的方案是“查表前馈PID闭环补偿”。具体算法为根据挡位和当前车速通过一张二维查表得到基础蠕行扭矩BaseCreepTrq。横轴为车速纵轴可以按坡度或制动压力选择不同曲线。根据坡度补偿表将基础蠕行扭矩叠加一个坡道补偿扭矩用于坡道起步防溜。根据目标车速与当前车速的偏差通过PI控制器得到一个补偿扭矩。最终的蠕行目标扭矩 基础蠕行扭矩 坡道补偿扭矩 PI补偿扭矩然后再做限幅和变化率限制。其中基础蠕行扭矩查表设计是关键。给大家一个参考表以一辆整备质量1.5吨、电机峰值扭矩280Nm的车型为例车速 (km/h)D挡基础蠕行扭矩 (Nm)R挡基础蠕行扭矩 (Nm)080-80260-60535-35815-151000注意车速大于8km/h以后基础蠕行扭矩逐渐降为0这意味着蠕行只在低速范围内起作用车速高于一定值时就不需要额外请求蠕行扭矩了否则会和驾驶员加速踏板请求冲突。坡道补偿一般通过车身纵向加速度信号估算坡度。简单的方式坡道补偿扭矩 整车质量 * 重力加速度 * sin(坡度角) * 车轮半径 / 传动比。如果你没有坡度信号可以暂时用纵向加速度滤波值来近似但在标定时需要注意滤波延时会带来补偿滞后。3.4 第四步扭矩安全限制与输出蠕行扭矩计算出来以后不能直接作为最终请求发送给电机控制器必须经过安全限制。这个“安全”不仅指物理极限还包括驾驶性要求。我在项目中设计了逐级限制第一级根据电机外特性限制。蠕行扭矩不得超过当前转速下电机允许的最大驱动扭矩也不能低于最小再生扭矩R挡同理。这一级限制一般通过查电机外特性表实现。第二级扭矩变化率限制。蠕行扭矩变化率通常限制为50-150Nm/s。这个值非常影响整车平顺性。如果蠕行扭矩从0跳到80Nm变化率太大会有“闯动感”太小会觉得车“肉”。我习惯用Rate Limiter模块Rising和Falling可以分别设置。考虑到起步和停止的体验我一般会设置成上升100Nm/s、下降150Nm/s但具体值需要实车标定。第三级驾驶员干预限制。一旦检测到加速踏板开度大于阈值例如2%蠕行扭矩请求立即以更大变化率衰减到0让驾驶员请求接管。这里要注意衰减率不能过快否则会在驾驶员踩踏板的瞬间产生负扭矩冲击。经过这三层限制后的最终扭矩通过Out1输出到后续扭矩仲裁模块。同时建议输出几个调试信号例如蠕行目标扭矩、蠕行PI补偿值、蠕行状态的标志位方便在CANalyzer或Simulink Scope里观测。4. 核心算法细节蠕行车速闭环与标定逻辑4.1 PI参数怎么定先工程经验再仿真微调蠕行PID不是我定义的什么复杂算法实际就是一个标准PI控制器这里我不建议增加微分项因为微分对车速噪声非常敏感低速时车速信号通常来自轮速脉冲本身具有量化噪声微分容易放大抖动。我常用的PI参数范围比例系数Kp在50-200之间积分系数Ki在10-50之间。怎么理解这个量级呢假设车速偏差为0.5km/h如果Kp100那么比例项贡献的扭矩就是50Nm这个扭矩足以让一辆1.5吨的车缓慢起步但不至于窜车。积分项负责消除稳态误差比如在5%坡道上没有积分项时前馈补偿不够准确最终车速可能达不到目标车速积分项会慢慢补上。仿真调整PI参数时我建议分两步断开前馈查表只用PI控制器在平坡工况下调整Kp和Ki观察车速曲线是否快速稳定在目标车速且无超调。重新接入前馈查表保持PI参数不变上坡工况验证补偿是否合理。若车速波动过大优先调整前馈表而不是PI参数。4.2 目标车速到底是多少不是一个固定值很多教程会直接告诉你蠕行目标车速是5km/h或8km/h但真实项目里目标车速是随驾驶场景动态变化的。比如在平地上D挡蠕行目标车速可以设定为8km/h但在上坡起步时如果设定目标车速过高车辆会持续加速冲坡驾驶感受很差。所以更合理的方案是设置一个目标车速上限和一个基础蠕行扭矩下限通过PI闭环在“0到上限”之间自动调节。我的模型里使用二维表的方式横轴为制动压力或制动开关松开后的保持时间纵轴为坡度查表得到目标车速范围通常在3~8km/h。举个例子平路坡度0无制动目标车速8km/h5%坡道无制动目标车速5km/h10%坡道无制动目标车速3km/h这样的标定逻辑非常实用既保证了驾驶员的“预期蠕行感”又不会在上坡时过于激进。需要注意的是蠕行目标车速上限还要考虑整车是否具备AUTOHOLD。如果有Autohold功能且Autohold激活期间蠕行目标车速应直接被钳制为0让Autohold的液压制动器保持车辆静止等驾驶员踩加速踏板再解除。这个逻辑在状态机中也应该有单独分支。4.3 抖动问题低速蠕行最容易踩的坑蠕行控制最常见的售后问题是低速时车辆抖动甚至在停车场挪车时出现“一耸一耸”的现象。原因多半出在以下几个方面一是PI控制器输出脉动。当车速在目标车速附近振荡时PI输出会小幅度波动如果电机扭矩响应很快波动会直接传递到齿轮箱和车轮。解决办法是给PI输出加一个幅值滞回Hysteresis当车速偏差小于0.3km/h时PI补偿扭矩固定为上一次输出值防止频繁调节。二是查表数据不够平滑。很多新手做查表时直接填一个断点数值之间转折太陡导致车速跨越断点时扭矩跳变。对于1-D查表在Simulink里要勾选“Input fallback”和“Extrapolation method”同时检查表数据的二阶导连续性。简单的判断方法把表数据画出来看几何上有没有明显的折角。三是信号周期不匹配。VCU控制周期通常为10ms而电机控制器的扭矩响应时间大约20-30ms如果模型里用了连续模块而没有做离散化仿真结果和实车差距很大。建议蠕行控制模型内部所有动态模块的采样时间都显式设置为0.01sTs 0.01并且使用离散PID控制器。5. 仿真验证与联合仿真扩展5.1 如何用Simulink搭建一个简易整车纵向动力学模型模型搭完只有开到路上才能验证吗不是仿真阶段就能发现大量问题。为了验证蠕行控制模型不需要一开始就上CarSim可以先在Simulink里搭一个简单的整车纵向动力学模型。虽然精度没那么高但用于控制策略开发足够了。整车纵向动力学核心公式就一个F m * a驱动力F由电机扭矩产生公式为F_trac T_motor * i_trans * eta / r_wheel其中T_motor是电机输出扭矩i_trans是传动比eta是传动效率r_wheel是车轮滚动半径。同时要考虑行驶阻力F_resist F_roll F_aero F_slope滚动阻力约等于m * g * f_r空气阻力约等于0.5 * rho * Cd * A * v^2坡道阻力为m * g * sin(slope)。把这些公式用Integrator模块搭起来就能得到车速反馈。我在实际模型中还加入了整车惯量包含旋转质量换算系数不然整车起步响应会显得过于敏感。如果你有CarSim当然可以直接做CarSim和Simulink联合仿真。CarSim提供高精度的车辆动力学模型和路面环境蠕行控制尤其需要考虑坡道起步CarSim里可以设置不同坡度、不同附着系数路面非常方便。联合仿真时注意CarSim的接口采样时间要和Simulink模型一致我一般都用1kHz的步长保证扭矩动态过程不失真。5.2 蠕行控制模型的测试用例设计仿真不是跑一条油门曲线看到结果就完了控制策略的验证要有测试用例概念。我建议至少覆盖以下典型场景场景编号场景描述预期行为TC1平路D挡松开制动车速缓慢上升至约8km/h并稳定TC2踩下制动车速降为0蠕行扭矩请求降为0车辆保持停止TC310%坡道D挡松开制动车辆不溜坡缓慢爬坡车速低于5km/hTC4蠕行过程中深踩加速踏板蠕行扭矩快速退出驾驶员扭矩接管TC5挂R挡松开制动车辆缓慢向后移动目标车速为反方向TC6D挡切N挡再切回D挡切换过程中蠕行扭矩不出现突变TC7制动压力缓慢释放车辆从停止到蠕行的过渡平顺把这些用例做成Signal Editor里的激励信号每次仿真后回放观测数据可以快速验证模型是否符合预期。我强烈建议保留这些测试用例因为在后续修改标定参数后你不可能每次都重新写一遍信号回归测试会变得异常高效。5.3 模型代码生成与HIL测试的衔接如果你做的是量产VCU开发最终Simulink模型要被自动生成C代码并刷写到英飞凌Infineon、瑞萨Renesas等MCU上。这时候模型的代码生成配置在搭建阶段就要考虑清楚。首先模型里的所有信号不能有“inherit”类型要显式定义成single或uint16等固定类型避免代码生成时出现歧义。其次Stateflow中的状态名、事件名尽量用英文字母加下划线不要用中文避免某些编译器兼容问题。在代码生成前可以先做模型在环MIL和软件在环SIL测试。MIL就是刚才说的Simulink仿真SIL则会把生成的C代码包装成S-Function再在Simulink里跑一遍同样的测试用例对比MIL和SIL的仿真结果是否一致。理论上应该完全一致如果出现差异通常是因为浮点计算顺序不同或数据类型转换造成。对于VCU系统我还建议做HIL硬件在环测试把生成的代码刷写到VCU快速原型硬件中通过CAN和真实的电机模型连接。这能提前发现CAN通信周期、信号范围、心跳检测等问题。当然HIL比较复杂这里不展开但你要知道蠕行模型是整个HIL测试台架中的重要一环。6. 常见问题与排查技巧实录6.1 模型编译报错数据类型的隐式转换问题这是我带新人时遇到最多的问题。比如车速信号来自总线默认是uint16类型你直接和double类型的常量比较Simulink会报“Data type mismatch”或者自动插入转换模块。解决办法是在模型里统一规范所有标定量都用double所有从CAN进来的原始信号先用Data Type Conversion转成double再做后续逻辑运算。但要注意类型转换不能乱插尤其是Stateflow里定义的局部变量必须明确设置类型。我一般在“Chart Properties”里把“Action Language”设为“MATLAB”然后所有局部变量都初始化成0.0double这样能减少很多类型错误。6.2 仿真时蠕行扭矩输出为0状态机却没有进CREEP_ACTIVE先检查Stateflow状态是否真的进入了。从症状上看很多人卡在这一步刹车信号已经松开挡位也是D挡但是车就是不动扭矩请求始终是0。我的排查步骤是在Stateflow的CREEP_ACTIVE状态入口处加一个传感信号比如用“entry: debug_active 1”然后在外界观测这个变量确认状态是否激活。如果状态没进去检查挡位信号是否是期望的枚举值。很多模型里GearPos信号用的是自定义枚举但Signal Editor里喂的是uint8数值导致比较条件永远为假。解决办法就是在输入端口后把挡位信号标准化成统一的内部枚举类型。如果状态进去了但输出还是0检查基础蠕行扭矩查表的输入范围。若车速以km/h输入而查表断点用的是m/s车速为5km/h时查表断点超出范围输出会变成0。建议在模型命名时明确标注单位查表模块前加Unit Conversion。6.3 坡道起步溜车坡度补偿怎么调溜车现象在实车测试中非常常见。原因很简单蠕行扭矩小于坡道下滑力矩。很多人第一反应是把基础蠕行扭矩表整体往上调这样会把平路起步搞得很难受。更好的做法是单独增大坡道补偿系数。坡道补偿扭矩可以根据纵向加速度估算我模型里用了一个一阶惯性滤波后的纵向加速度信号再乘以一个标定系数限制在正负100Nm以内。标定时先在10%坡道上测试调整系数让车辆刚好不溜然后乘以0.9的余量系数保证有足够裕量但不过度猛冲。但要注意纵向加速度信号在坡道上会有很大噪声尤其是在非铺装路面。我给坡道补偿信号加了低通滤波截止频率大概5Hz能滤除大部分噪声同时保留坡道变化的慢特征。如果你发现这样补偿响应太慢也可以增加来自ESP的重力加速度坡度信号通过CAN直接读取。6.4 蠕行扭矩跳变导致抖动Rate Limiter参数怎么设接前文如果设置的变化率太小起步扭矩上升过慢驾驶感受“拖沓”如果太大起步瞬间冲击明显。我给出一个常用的标定范围实测下来比较稳妥扭矩上升速率80-120 Nm/s扭矩下降速率120-160 Nm/s注意这个数值是针对280Nm级别电机的。如果是小电机100Nm左右可以适当缩小40%。另外Rate Limiter模块在仿真步长较大时会存在截断误差建议把模型的最大步长设置为0.01s对应于10ms控制周期能够显著降低抖振。6.5 模型下载与下一步怎么用这次讲的蠕行控制模型我已经按上述逻辑搭建完成包含Stateflow状态机模块、PI控制器、扭矩查表和Rate Limiter以及一套简单的整车纵向动力学仿真环境。模型下载方式在文末统一说明有需要的朋友可以在评论区留言或私信获取我会把Simulink版本R2020b及以上的模型文件发给你。拿到模型以后我建议按这个顺序去学习和修改在Simulink里打开模型按CtrlD编译跑一遍预置的测试场景先看仿真曲线理解各个信号的传递关系。修改基础蠕行扭矩表观察车速和扭矩的变化直观感受查表对驾驶性的影响。修改PI参数看车速闭环的跟随效果理解“前馈反馈”双层结构。尝试把蠕行扭矩请求模块接入你自己的项目架构替换原来的扭矩输出源做一次模型在环仿真。我个人在实际项目里踩过最大的坑就是拿到一个模型后急着改参数却忽略了模型本身的状态机逻辑。磨刀不误砍柴工先把状态仲裁理顺再改参数你后面能省下大量排错时间。最后再分享一个实用技巧模型里加一个“扭矩请求来源切换”的Manual Switch在仿真时可以自由切换“蠕行扭矩”和“手动给定扭矩”两种模式。这样调试PI参数时会特别方便不用一遍遍改模型结构也能直接对比蠕行介入前后的驾驶性差异。希望这个保姆级教程能帮你把蠕行控制这块硬骨头啃下来。
返回列表