一台分布式驱动电动汽车,四个轮子各由一个电机独立驱动,真正踩下加速踏板那一刻,你才会发现所有的控制策略都得在这一瞬间接受考验。我最初设计的VCU整车控制器模型,第一版在台架测试阶段几乎挑不出毛病,可等四个电机全部接入路试,同一脚油门下去,车辆却出现了明显的横向摆动——左右车轮扭矩不协调,方向盘都在抖。可以说,分布式驱动把整车控制器的设计难度放大了好几倍,但也正因如此,一趟完整的“从原理到模型再到实车验证”的流程走下来,收获是完全值得的。
当时项目组里有人建议直接把传统单电机的VCU模型拿来改改就用,我坚持重写,原因非常简单:传统方案里VCU只需要给电机控制器一个总扭矩指令,而分布式驱动要求VCU同时对四个车轮做扭矩分配、电子差速和稳定性协调,逻辑复杂度完全不是同一个量级。这篇分享,我想把从原理分析、策略设计、模型搭建到联调验证的全过程完整拆开讲一遍,包括我踩过的坑和最终沉淀下来的参考做法,适合正在做分布式驱动车型VCU开发,或者刚接触整车控制策略的朋友。
1. 为什么分布式驱动车型的VCU不能直接复用传统单电机的方案
1.1 机械差速器消失之后,VCU肩上多扛了三块责任
传统集中驱动车型,左右驱动轮之间一般都有机械差速器在兜底。机械差速器的作用,本质上就是允许两侧车轮以不同转速旋转,同时让传递到两侧车轮的扭矩保持比较接近的状态,这样车辆转弯时内外侧车轮因为路径长度不同而产生的转速差,就被这个机械部件天然消化了。
而分布式驱动车型基本都取消了机械差速器,相当于把这个物理部件的决策权完全交给了VCU软件。差速不再是一个纯机械的自适应结果,而是要VCU主动计算出四个车轮各自该出多大的力,这个计算既要满足驾驶员的需求扭矩,又要照顾车辆的转向特性和稳定性。
用我的话说,传统方案里的VCU更像一个传令官,驾驶员踩多少,机械结构负责把动力分给左右轮;分布式驱动里的VCU要同时当好裁判和调度员,它要根据踏板开度、车速、转向角度、横摆角速度综合判断,再决定每个车轮出多少力。这里面的策略写得好不好,直接决定了这台车是好开还是难开。
1.2 扭矩自由度的双刃剑:灵活度越大,协调问题越多
分布式驱动最大的卖点,是四个车轮的扭矩可以独立控制、独立调节,从整车动力学角度看,这是直接横摆力矩控制最理想的执行方案:转弯半径不足时,可以给外侧车轮适当增加扭矩;出现转向过度的趋势时,又可以减小内侧电机扭矩或者给外侧施加回正力矩。
但自由度的代价也很明显。左右车轮扭矩分配一旦不均匀,尤其是在高附着路面上,车辆会表现出跑偏、方向盘拉扯,甚至低速整车抖动。我遇到过一种非常具体的情况:左右后轮扭矩只相差四牛米,实车上就能明显感觉到方向在朝一侧偏移。虽然四牛米的扭矩在今天看来不算大,但它确实说明了扭矩分配精度对整车稳定的影响是极其敏感的。所以分配策略绝不只是均分那么简单,它必须包含基础均分、驾驶员意图修正、稳定性修正、降级保护多层嵌套。
还有一个容易被忽略的点:传统单电机方案里如果驱动系统故障,通常就是整车下高压或者动力系统报警;分布式驱动方案则完全有机会做单轴或者单轮降功率继续运行。这就要求VCU在模型设计阶段就具备清晰的故障降级逻辑。比如右后轮退出工作,剩余的三个车轮要怎么重新分配扭矩,才不会让车辆产生额外的横摆,这个问题如果不提前在模型里想清楚,实车故障注入测试时会非常狼狈。
1.3 冗余信号与状态管理复杂度同步上升
分布式驱动车型的传感器和执行器数量几乎翻倍,对VCU来说最直接的影响,就是输入输出信号数量暴增。以我实际的信号清单为例,整车控制至少涉及四个电机控制器的状态和扭矩反馈、四路轮速、方向盘转角、横摆角速度、纵向加速度、两路加速踏板、一路制动踏板、多个高压继电器状态,以及电池系统的SOC、功率限制和温度信息。
信号多了,模型就不能再像传统小车模型那样随性连线。接口是否完整、单位是否统一、故障码之间是否互斥,都必须在建模之初就规划好。这部分如果不提前定边界,后面联调时大概率会变成无休止地对信号名,两边各持一份Excel表却对不上单位,这种情况我见过太多次了。
2. 模型动工之前,先把信号接口和功能边界钉死
2.1 输入输出信号清单:这是整个模型的IO骨架
很多人刚拿到分布式驱动项目,第一件事就打开建模工具开始放模块连线,我强烈建议先停下来做一件事:完完整整列出所有输入输出信号,包括信号名、物理单位、数值范围、来源去向和更新周期。下面这张表是我在项目里整理出的简化版接口清单,可以直接参考。
| 信号分组 | 信号示例 | 单位 | 数值范围 | 关键说明 |
|---|---|---|---|---|
| 驾驶员输入 | 加速踏板位置1/位置2、制动踏板位置、挡位 | % / 挡位码 | 0-100 / 0-3 | 两路踏板信号需做合理性比较 |
| 车辆状态 | 车速、四个轮速、方向盘转角、横摆角速度、纵向加速度 | km/h、rad/s、deg/s、m/s² | 按整车定义 | 轮速方向需要统一为正值处理 |
| 动力系统反馈 | 四个电机实际扭矩、转速、温度、母线电压 | Nm、rpm、℃、V | 按电机峰值定义 | 用于闭环校验和降功率保护 |
| 能量系统 | SOC、最大充电功率、最大放电功率、高压状态 | %、kW、kW、- | 0-100 | 能量回收必须使用实时充电功率限制 |
| 输出指令 | 各电机扭矩指令、液压制动请求、仪表状态 | Nm / 无量纲 | 按执行器范围 | 所有输出必须做限幅和速率限制 |
这份表的好处,是它把模型的外边界一次就框死了。后面不管做纯软件仿真还是硬件在环测试,输入输出变量都不需要靠记忆去猜。我在这份接口梳理上花了两天时间,后期省下来的调试时间至少有两周,这笔时间账怎么算都划算。
2.2 功能分层规划:信号层、决策层、执行层互不越界
我倾向于把VCU模型在顶层分成这样四个层次:信号处理层、状态管理层、策略决策层、执行输出层。信号处理层专门做滤波、标定换算、质量码判定;状态管理层跑整车状态机,负责上电、下电、行车、充电、故障等状态的切换;策略决策层只关心当前处于什么模式、这个模式下该给哪个车轮多少扭矩;执行输出层统一处理所有输出信号的限幅、斜坡,以及为外部通信做信号打包。
分层最重要的意义,是后面做自动代码生成和策略迭代时非常舒服。如果所有逻辑混在一个大模块里,每改一次策略都要重新做一遍完整回归测试,成本很高;分层之后,我一般只改动策略决策层内部的子模块,信号接口保持稳定,已有的仿真测试用例还能继续复用。另外,模型做到全模块化之后,版本对比和评审也会轻松很多,评审时能直接定位到某个子模块,而不是在一堆连线的汪洋里大海捞针。
2.3 先建立数据字典,再碰任何图形化模块
这一步很关键,也经常被着急赶进度的人忽略。我建议从第一天起就建立共享数据字典,把用到的参数、信号、总线对象全部放进去统一管理。比如扭矩请求、模式码、故障状态这类信号,在数据字典里定义成总线对象之后,模型里的连线就不会乱成一团,信号名稍有拼写错误,工具会立刻提示找不到对象。
数据字典还有一个更实际的价值:标定参数的集中管理。举个小例子,加速踏板开度到需求扭矩的转换斜率,我一开始是写死在模型里的常量,结果发现不同驾驶模式下这个斜率差异很大,每次调驾驶性都要翻遍整个模型去改常量。改成数据字典里的标定参数之后,从标定工具里直接修改数值并刷写控制器,前后不到半小时就完成了。经历过一次你就会明白“参数不进模型、模型不带魔法数字”这句话的价值。
3. 核心算法怎么从控制公式变成可运行的分配策略
3.1 驾驶员需求扭矩的解析与滤波:基础但不简单
驾驶员需求扭矩解析是整个VCU策略的最前端,也是模型里最容易写得粗糙的地方。理想情况下,加速踏板开度直接映射到扭矩请求,但实际踏板信号进来之后,通常要做三件事:死区处理、迟滞消除、滤波平滑。
死区是为了避免踏板在轻微抖动时误触发,一般设置在百分之零点五到一个百分点的范围。迟滞消除是让踏板踩下和松开不完全走同一条映射曲线,避免在临界位置反复跳变,类似很多家用车油门踏板调校的那种“段落感”。滤波一般用一阶惯性环节,也可以用斜率限制来做,目的是去掉信号噪声,但不能把驾驶员快速变化的意图给滤没。
这里有个参数值得专门标注:滤波时间常数不能太大。最开始我用了0.1秒的一阶惯性滤波,结果实测时发现猛踩踏板之后,车辆响应明显迟钝,主观感受就是“车不听手”。后来把滤波时间常数调到20毫秒左右,同时配合斜率限制,既能比较干净地抑制噪声,又保留了踏板响应的直接感。如果你也是从框架模型起步,建议先试这个数量级,再根据自己车型的驾驶性目标调整。
3.2 四轮扭矩分配:从均匀分配到附着利用率
基础模式下,扭矩分配一定是四轮均分,每个车轮得到总需求扭矩的四分之一。这样做的好处,是最大程度上保证不产生额外的横摆力矩,车辆呈现中性转向特性。
但均分并不总是最优解。低附着系数路面,比如雪地或者湿滑路面,四个车轮的附着能力往往不一致,均分策略可能导致某个车轮先滑转。我把分配策略设计成带优先级的两级结构:第一级,根据当前驾驶模式选择基础分配系数,经济、舒适、运动、雪地各有各的系数;第二级,根据轮速差和横摆角速度偏差做动态修正。如果检测到某轮滑转,就降低该轮扭矩请求,同时把降低的那部分扭矩按一定比例转移给同轴另一侧车轮,前提是转移后不会造成更大的横摆。
这其实已经涉及直接的横摆力矩控制范畴,但在VCU模型里实现时,可以先从保守的小修正系数开始,不要一上来就把力矩转移量做得过大,否则车辆会变得过于敏感,反而影响驾驶稳定性。
附着利用率计算我建议做工程化简化,用名义附着系数加轮速差来估计。精确的附着估计算法在学术研究中可以非常复杂,但在量产整车控制器里,更常用的是滑转阈值加扭矩降额曲线。把重点放在响应快、不过冲、能收敛上,对这个层面的模型更实用。
3.3 能量回收协调:扭矩叠加时最容易出意外
分布式驱动的能量回收策略,是整个VCU模型里风险最高的区域之一。它涉及到电机扭矩和液压制动的叠加协调,一旦配合不好,轻则车辆点头让人不舒服,重则出现减速度突变,直接影响行驶安全性。
我设计能量回收策略时,按三步锁定逻辑。第一步,判断能量回收是否允许。前提条件是驾驶员意图为减速、车速高于最低回收车速(一般10到20公里每小时以下就不回收,因为转速太低时电机发电效率很差)、SOC低于设定回收上限(通常在95%以下)、电池允许充电功率大于零、电机没有过温报警。第二步,计算回收扭矩目标。基础公式是驾驶员制动踏板开度对应的整车减速度需求,减掉液压制动已经贡献的部分,剩余部分由电机回收来承担。第三步,做扭矩变化率限制。回收开始时扭矩按标定斜率上升,避免瞬间冲击;退出时也要按斜坡缓慢撤掉,特别是当车速降低到回收阈值以下时,如果扭矩瞬间归零,车辆会有一个明显的“突然加速”错觉,这是实车标定里很容易被驾驶评价员投诉的细节。
还有一个容易被忽视的点:电池允许充电功率不是静态查表就能搞定的。它随温度、SOC、电芯电压波动而实时变化,VCU模型必须接收电池管理系统发来的动态功率上限,实时压缩电机回收扭矩。如果模型里用的是固定上限,低温环境下很容易触发电池保护导致回收突然中断。那种非预期的降功,比系统主动顺滑降功造成的安全问题严重得多。
4. 用Simulink把策略一点点搭成能生成代码的模型
4.1 顶层模型的骨架:总线进、总线出
我搭建顶层模型时,坚持把所有输入都用一个大总线封装,输出也用一个大总线封装,模型内部再按前面提到的四个层次划分成独立子系统。这样做带来的好处,第一是模型接口一目了然,外部信号和内部逻辑完全解耦;第二是做自动代码生成时,输入输出结构体和外部接口信号可以直接映射,生成的代码可读性也会更好。
具体搭建顺序是这样:先在数据字典里定义好输入总线和输出总线的类型对象,然后新建顶层模型,拉入四个子系统,分别对应信号处理层、状态管理层、策略决策层、执行输出层。连线之前,先把总线选择器拉出来,逐一确认每个子系统的输入端口字段都存在,越早发现字段拼写问题越省时间。否则等整个模型全部连完,再回头查总线字段,那排查起来真的会让人头皮发麻。
4.2 用Stateflow搭整车状态机:把模式切换写得像逻辑图一样清楚
整车状态管理,我强烈推荐用Stateflow。上电、待机、行车驱动、能量回收、跛行、故障下电这几个主状态,用状态图表示非常直观。我在状态机设计里重点做了三件事。
第一件事,明确状态迁移条件。每个迁移必须写清楚输入信号和判定阈值,禁止出现“未定义迁移”。比如从行车驱动切到能量回收的条件,是制动踏板开度大于某个死区值且车速大于回收最低车速;从能量回收退回行车驱动的条件,是制动踏板松开且车速仍然在回收区间内。这些条件全部写死在迁移边线上,评审时一眼就能看到逻辑是否完整。
第二件事,加超时保护。如果某个信号中断,状态机可能会一直停在某个状态。我一般会给关键信号额外加一个看门狗计数器,连续若干周期没有收到有效整车信号,就强制切入安全状态。这样即使通信出问题,状态机也能主动降级而不是被动等待。
第三件事,状态机里只输出状态编码和迁移结果,不直接在状态内计算扭矩。真正控制扭矩大小的逻辑,放到状态输出之后的策略模块里。这样状态机的职责就只管模式判定,和具体的扭矩计算彻底解耦。后面调策略时完全不需要动状态机,降低了反复回归测试的负担。
4.3 扭矩计算子模块:查表、限幅、斜坡三件套
策略决策层里的核心扭矩计算子模块,我一般遵循“查表、限幅、斜坡”三件套结构来写。查表完成踏板开度到需求扭矩的映射,以及不同驾驶模式下的修正系数;限幅把计算后的扭矩框在电机实时允许的峰值能力范围内,这里面包括电机峰值扭矩、当前转速下的外特性扭矩、电池允许的瞬时功率折算扭矩,取三者最小值作为硬上限;斜坡则对扭矩指令的变化率做约束,防止整车冲击。
这三步的顺序不能乱,一定是先查表得到基础需求,再做物理约束限幅,最后做变化率斜坡。如果顺序调换,比如先做斜坡再限幅,就有可能在极限工况下出现限幅后跳变的问题,相当于把冲击从限幅环节引到了斜坡环节后面。我第一版模型就是在这个顺序上栽过跟头,后来完整重构才稳定下来。
5. 联合仿真和硬件在环测试里最容易翻车的几个细节
5.1 单位不统一:模型里最隐蔽的玄学Bug
单位问题看起来很小,实车联调时却能把人折磨到崩溃。我经历过一次非常典型的“玄学”问题:轮速信号在整车动力学模型里用的是rad/s,而VCU模型里当成rpm用,结果轮速一进模型,车速估算直接偏了几十倍,能量回收入口条件永远不满足,整段路试里回收功能完全没生效。排查了一整天,最后才发现就是单位换算这里少乘了60/2π。
我现在的习惯,是在数据字典里给每个信号标注单位,模型里所有涉及物理量的计算模块,都在注释里写清楚输入单位和输出单位。另外,在联合仿真的接口层专门放一组单位换算模块,把整车模型输出的原始单位统一换算成控制器内部的标准单位,避免策略计算层出现单位纠缠。
5.2 采样步长不一致:仿真阶段看不到、上环才现形的冲突
这类问题在纯软件仿真阶段容易被掩盖,一旦上到硬件在环就非常明显。整车动力学模型为了描述高频动态特性,往往需要1毫秒甚至更小的步长;而VCU控制算法模型为了兼顾执行效率,常用10毫秒的固定周期。两边信号交换时,控制器模型每10毫秒才采到一次整车状态,相当于整个控制回路里多了一个可变延迟环节。
我在上硬件在环之前会先做一次静态检查:控制器模型里是不是存在多个不同速率的模块混用而没有做速率同步,总线信号在跨步长传递时是不是被工具自动插入了成本高昂的转换逻辑。这个问题不处理的话,会造成控制相位延迟,让本来自作稳定的扭矩分配在硬件在环上出现高频抖动。后来我统一用10毫秒作为控制器主周期,整车状态输入经过速率同步模块处理后再参与计算,这个问题基本消失了。
5.3 实车测试中的扭矩不协调与车辆跑偏问题排查
等到实车测试,最典型的故障是:明明四个电机都按指令输出了,车辆却明显跑偏。我遇到过的原因主要有三类。一是扭矩分配指令在总线配置或数据字典字段映射时发生了错位,导致左右指令颠倒,这种问题通常事前一整天的总线矩阵核对就能避免。二是某个电机的实际响应时间明显滞后于其他电机,起步时左右扭矩建立速度不一致,车辆就会出现瞬间偏转,这属于执行器响应特性差异,需要在VCU模型里对响应较慢的电机做提前补偿或时间对齐。三是某轮轮速信号方向处理错误,本来应该正转的轮速变成负值,导致滑转检测误触发,策略主动降低了该轮扭矩,反而造成车辆跑偏。
排查这类问题时,不要一上来就怀疑控制算法。先把四路电机反馈扭矩、四路轮速、方向盘转角、横摆角速度打在同一根时间轴上,看数据是否自洽。然后用阶跃测试逐一验证四轮扭矩响应的一致性。我在测试文件里专门保存了几组阶跃响应对照曲线,每次实车排故都先拉出来对比,能省掉很多无效猜测。
5.4 硬件在环测试前的快速检查清单
除了常规的信号类型、数据范围检查,我每次上硬件在环之前还会过一遍这组清单,全部满足才允许开跑:
- 模型中是否存在代数环。尤其是踏板信号经过滤波之后,又被同一计算周期里的逻辑引回来参与查表的情况,这种最容易出现隐蔽的代数环。
- 所有状态量是否有明确的初始值。Stateflow的默认状态是否合法,是否会出现上电之后直接进入行车驱动这种危险情况。
- 模型中是否存在除零或溢出风险。比如车速为零时计算滑转率,或者SOC值为异常数值时参与了除法运算。
- 输出扭矩指令是否有上下限保护。即使策略计算出现异常,也有锚点值兜底,不会输出超出执行器物理极限的指令。
- 标定参数与模型版本是否一致。避免出现模型是新的、标定文件还是旧的情况,这种错位会制造出特别难查的“半新半旧”问题。
- 故障注入测试是否覆盖到位。至少要考虑信号丢失、信号超边界、信号发生跳变、多个信号同时异常这四类情况。
这套清单听起来基础,但每条背后都有真实的联调事故支撑。比如我有一次上环测试之前忘记检查Stateflow默认状态,结果硬件重启之后整车状态机直接停在行车驱动状态,上电瞬间电机就产生了扭矩请求,幸好台架安全保护机制动作足够快。事后回想,如果当时先过了这套清单,根本不会走到那一步。
6. 从模型到实车:三句最想对后备说的话
6.1 先把信号链跑通,再回头调策略
这是我在整个开发过程中反复踩坑之后最强烈的体会。第一版VCU模型,我把大量精力花在扭矩分配算法上,觉得这才是核心技术。结果第一次与整车动力学模型联调,踏板信号链都没理通,扭矩请求根本没送到电机模型里,后面再精巧的策略全部变成空中楼阁。
后来我调整了开发顺序:先把所有信号从输入到输出完整走一遍,哪怕用最简单的“踏板开度乘以系数就是扭矩”的雏形模型,确认每个信号链路没有断点、方向、单位、增益都正确,然后才逐步替换成更复杂的分层分配策略。这个过程看起来慢,但它的价值在于把所有隐患都提前排除了,后续优化策略时再也不会被莫名其妙的信号问题打断。
6.2 扭矩的平顺性不是靠一个滤波器能解决的
整车驾驶质感里的平顺性,不是简单在扭矩信号后面接一个低通滤波器就能做出来的。滤波确实能平滑信号,但它会把驾驶员意图也滤掉,让扭矩响应变得拖沓。真正的平顺来自策略结构本身:在不同扭矩来源之间建立明确的优先级,在所有会改变扭矩的点上做一致的斜坡限制,在模式切换时先确认切换条件稳定再允许状态跳转。
我教带过的后备时常用一个类比:扭矩指令就像水龙头,你不能在出水口加阻尼器去堵水,而应该在源头控制水流变化的速度。后来我把所有可能引起扭矩突变的路径全部加上斜率限制,并且集中到执行输出层做最后的统一兜底,模型的稳定性和主观驾驶感受都明显改善。
6.3 保留一套可回放的测试场景,比单个算法模块更值钱
经验越攒越多,最终难发现真正让自己受益的不是某个花哨的算法模块,而是那一整套能反复回放的测试场景和标定数据组合。遇到类似的问题,直接把旧场景重新跑一遍,看那些关键波形,问题往往一眼就能定位。我在项目推进过程中养成了一个习惯:每调整一次策略,就把对应的仿真工况、实车数据、标定文件一起归档。这套“经验库”在后来的多个版本迭代和故障排查里,发挥的作用比重写公式推导大得多。
如果你也正在搭分布式驱动VCU模型,请尽早开始建立自己的场景回放机制。不需要特别复杂的工具,哪怕一开始只是有序的文件目录加一份备注说明,都会在某个深夜排故时成为你最可靠的帮手。
从全套流程回过头来看,分布式驱动电动汽车的VCU模型开发,难的不是某一个具体算法,难的是把一个多执行器、多状态的复杂控制问题,拆成清晰稳定的层次,再逐层验证扎实。经过联合仿真、硬件在环和实车排故的几轮打磨,这套从接口定义到分层建模,再到反复验证的方法,如今已经变成我做整车控制项目离不开的基础框架。上面这些过程和教训,希望能给正在搭建或者准备搭建分布式驱动VCU的同路人一点参考。也欢迎有不同思路的同行来交流,大家碰撞出来的控制策略,确实比自己闷头写模型要有意思得多。