搞混动整车控制这几年,我踩过最多的坑就是转矩分配。并联式混合动力结构本身并不复杂,发动机、电机通过机械耦合装置叠加输出,成本低、改造难度小,但真正把“发动机和电机怎么搭伙干活”这件事做好,一点都不容易。尤其工况一变,低速走走停停和高速巡航对动力源的需求完全是两码事。这篇文章不聊空泛的介绍,直接把基于模糊逻辑的并联式混合动力车辆控制策略掰开揉碎:发动机和电机的转矩怎么分配、模糊规则怎么定、整车仿真是怎么搭起来验证的,以及最后有哪些指标能证明这套策略确实有效。
1. 项目背景与核心问题
1.1 并联式混动结构里,动力系统是怎么耦联的
并联式混合动力车辆(Parallel Hybrid Electric Vehicle)的结构,可以理解成发动机和电机各带一套动力路径,通过变速器或者扭矩耦合器汇合到驱动轮。最常见的形式是在传统手动或自动变速器输入端并联一个电机,电机可以单独驱动车辆,也可以和发动机一起输出,还可以作为发电机给电池充电。这种结构最大的优势是电机可以叠加扭矩,弥补发动机低速扭矩不足;发动机则可以在高效区工作,把剩余功率用来发电。
如果你是从传统车转型做混动,并联式往往是最容易上手的平台:不需要像串联式那样把机械能全部转换成电能再驱动,传动效率高;也不用像混联式那样复杂到动力分配机构都不知道怎么标定。但它对控制器的要求很直接——发动机和电机的输出时刻都要“对上节奏”。耦合器如果处理不好,轻则动力中断,重则齿轮冲击。
1.2 控制策略要解决的三个核心问题
我通常会把并联式混动控制拆成三个问题:
第一个是模式切换。什么时候纯电、什么时候发动机介入、什么时候混合驱动、什么时候能量回收,这个顺序不能乱。第二个是转矩分配。在混合驱动模式下,驾驶员需求转矩给定之后,发动机出多少、电机补多少,这是最核心的优化问题。第三个是电荷平衡。电池SOC不能一直掉,也不能动不动就充满,控制策略必须保证电能在整个循环里保持收支平衡。
这三个问题互相纠缠。比如你为了追求油耗好看,让发动机一直在高效点输出,多余功率给电池充电,结果SOC高了;但下一段路况需要纯电走,电池又来不及放电,模式切换就会很频繁。模糊逻辑之所以适合做这个事,是因为它可以同时把需求转矩、SOC这些信息综合成一系列规则,不需要精确建模,也不需要维护一大张切换表。
1.3 工况变化为什么对分配策略影响这么大
同一个控制参数在城市和高速上表现完全不一样。低速工况下,驾驶员需求转矩不高,但频繁启停,电机效率高、响应快,适合用电;高速巡航时需求转矩平稳,发动机热效率高,应该让发动机多出力。爬坡工况下,需求转矩猛增,如果只靠发动机,可能掉转速;只靠电机,SOC又扛不住。
所以转矩分配不能只用一张固定比例表。传统查表策略在特定点调出来很漂亮,但一旦工况偏离设定点,效果就垮。模糊逻辑的价值在于:用语言化的规则把“什么时候该谁出力”描述清楚,输入变量连续变化时,输出也跟着渐变,不会出现明显跳变。这是后面所有分析的基础。
2. 模糊逻辑控制器设计思路
2.1 为什么选模糊逻辑而不是查表或 PID
最早做这个项目的时候,我其实先试过基于逻辑门限的查表方案:车速低于多少、SOC高于多少就用电,需求转矩高于多少就启动发动机。这种方案写起来很快,但标定工作量大得想摔键盘。原因很简单,门限值一多,相互之间的组合爆炸,什么时候联网、什么时候触发修正,完全没有规律可循。
后来我也试过PID,但PID本质上是在已有的控制量上做修正,它解决不了“到底该用谁驱动”这种策略层面上的决策问题。你让PID去跟踪一个发动机目标转速,它可以做得很好,但它不知道什么时候应该纯电,什么时候应该充电。
模糊逻辑的好处在这时就体现出来了。第一,它天然适合非线性映射。发动机最优工作线、电机效率图、电池内阻变化,这些关系很难用一个数学公式描述,但语言规则很容易。第二,它对参数漂移不敏感。同一个模糊规则库,换一辆车、换一个电池,往往只需要调整隶属函数范围,不用推倒重来。第三,可解释性非常强,标定工程师能看懂,后续调车沟通成本低得多。
2.2 输入变量与输出变量的选择
模糊控制器的输入端,我最终选了三个量:当前整车的需求转矩、车速、电池SOC。输出端是发动机转矩占需求转矩的比例系数K_eng,也就是发动机分到的“活”。
需求转矩是决定动力源的最直接信息。需求转矩小,电动机单独驱动就够;需求转矩大,发动机必须参与。车速是一个修正项,低速工况下发动机效率低、电机效率高,所以车速越低越偏向电驱动;高速巡航则相反,发动机机械效率高,电量应该留着备用。SOC负责电荷平衡,它决定电机到底是“动力源”还是“负载”——SOC低的时候,电机的角色就要往发电机倾斜,利用发动机多余功率充电。
有朋友问过我,为什么不用加速踏板开度做输入,而要用需求转矩。踏板开度确实是驾驶员意图的直接体现,但它忽略了一个关键信息:同样的踏板深度,在低速和高速时对应的需求转矩完全不一样。踏板开度需要通过车速、挡位、转速换算成转矩,才能跨工况比较。直接在模糊控制器里接入需求转矩,规则语义更干净,输出也更稳定。
输出端为什么不直接输出电机转矩,而是发动机转矩比例?这是我踩过坑之后换过来的。直接输出电机转矩,很容易出现发动机吃不下、电机又超限的情况;改成功率比例K_eng之后,需求转矩乘以K_eng得到发动机目标转矩,再用需求转矩减去发动机转矩,剩下的天然落在电机侧。这个结构天然保证了两个动力源输出之和等于驾驶员需求,不会出现“你推我拉”的内耗。
2.3 隶属函数与规则库的设计逻辑
输入变量的论域范围要根据实际车况设定。以一辆典型的并联式混动车为例:需求转矩范围取0到300 Nm,车速范围取0到120 km/h,SOC范围取30%到80%。每个输入量划分成若干个模糊集合,集合数量不是越多越好,我一般采用需求转矩5个、车速3个、SOC 3个,这样组合出来的规则数是5×3×3=45条,不算太夸张,调试起来也还Hold住。
隶属函数一般选三角形或梯形。三角形简单、计算快,但顶点附近输出变化灵敏,容易出现细微抖动;梯形在平台区更稳定,适合SOC这种需要保持区间的变量。我习惯对需求转矩用三角形隶属函数,对车速和SOC用梯形隶属函数,这样兼顾响应速度和稳定性。
规则库的设计逻辑可以总结成一句话:SOC低的时候发动机多干活,SOC高的时候电机多干活;需求转矩大就一起上,需求转矩小就尽量用电。如果把车速也放进去,低速时压低K_eng,高速时抬高K_eng。给我常用的初版规则表举个例子,行是SOC,列是需求转矩,输出是发动机出力程度。
| 需求转矩\SOC | 低(SOC低) | 中 | 高(SOC高) |
|---|---|---|---|
| 小 | 中 | 小 | 很小 |
| 中 | 大 | 中 | 小 |
| 大 | 很大 | 中 | 中 |
| 很大 | 很大 | 大 | 大 |
这张表初看简单,实际用起来已经有了基本盘:SOC低且需求转矩小时依然让发动机中负荷工作,顺便给电池充电;SOC高且需求转矩小时几乎纯电;需求转矩很大时不管SOC高低都全力输出,保护动力性优先。车速修正我通常以包络函数的形式叠加:车速低于30 km/h时,K_eng整体乘0.85;车速高于80 km/h时,K_eng整体乘1.1。这样规则库不用翻倍,效果差别却很大。
3. 转矩分配策略的实现细节
3.1 发动机与电机的工作边界
在做转矩分配之前,必须先清楚发动机和电机各自能干什么。发动机这边,我用的是一台1.5L自然吸气发动机的万有特性数据,最大转矩大概140 Nm,但真正高效的区间其实只有中高转速、中等负荷那一小块。低速小负荷时油耗率能到400 g/kWh以上,比高速巡航时高出将近一倍。所以策略的第一原则就是尽量不让发动机在低速小负荷工况工作。
电机这边,峰值转矩一般能到120 Nm以上,但持续转矩受到电池放电功率和电机散热限制。如果让它长时间顶着峰值转矩输出,电池电压会快速下降,仿真里会出现SOC跳崖,实车上则会触发限功率。所以模糊控制器输出的是“请求值”,真正给到电机的目标转矩还需要经过一个功率限幅模块:电机目标转矩不能超过当前电池允许放电功率换算出的转矩上限。
电池模型我用的是一阶RC等效电路模型,内阻参数随SOC和温度变化。SOC在60%到80%区间时放电内阻较小,适合电机多出力;SOC低于40%后内阻增大,如果还让电机顶着大转矩驱动,电耗会成倍上升,得不偿失。这个边界条件在模糊规则里其实没有显式体现,而是通过SOC隶属函数间接影响输出,规则库里SOC为“低”时发动机出力比例自然就上去了。
3.2 基于 SOC 的电荷维持策略
并联式混动跑工况仿真,最怕的就是SOC像滑梯一样一路往下掉。为了守住电荷平衡,我在模糊控制器外面加了一层CS(Charge Sustaining)修正。目标SOC设为60%,允许波动范围是50%到70%。绿灯区自然交给模糊规则,一旦SOC低于55%,就开始加大修正权重。
修正实现的思路是给模糊控制器的输出K_eng加一个动态偏移量。当SOC低于目标值时,偏移量取正值,强制发动机多输出一部分转矩,多余功率给电池充电;当SOC高于目标值时,偏移量取负值,鼓励纯电和电机助力,把电量释放出来。偏移量大小用比例增益乘SOC偏差计算,增益标定成0.05到0.15之间。这个修正必须做限幅,否则低速低SOC时,K_eng会被修正到超过1,发动机直接“爆表”。
另外还有一条硬规则:SOC低于35%时,禁止纯电模式。这条规则不放在模糊推理里,而是放在上层逻辑门限里,保证最极端情况下电池不会过放。仿真里出现SOC跌到30%以下的情况,基本都是这条硬规则没生效或者规则的触发条件写错了。
3.3 模糊推理与去模糊化的工程取舍
模糊推理我选的是Mamdani模型,输入隶属函数输出模糊集合,规则推理用最小值法取交集,规则聚合用最大值法取并集。Mamdani模型直观、容易理解,实车标定工程师看着规则表就能猜到控制器在干什么,这是它比Takagi-Sugeno更适合这个场景的原因。T-S模型的输出是函数表达式,精度高,但规则语义不透明,出了问题很难查。
去模糊化用的是重心法(Centroid)。模糊推理得到的是一个输出隶属度分布,需要把它变成一个具体的K_eng数值。重心法计算的是隶属函数与横轴围成面积的质心,公式就是加权平均:K_eng等于所有规则输出值乘以对应隶属度之和,除以隶属度之和。用重心法的好处是输出曲线连续平滑,不会像最大隶属度法那样在边界上跳变。
不过重心法也有个坑:如果规则激活量很弱,输出会在模糊集合的“重心区域”附近缓慢移动,实车上表现为发动机转矩轻微飘动。解决办法是对K_eng输出做斜率限幅,发动机转矩请求变化率限制在每秒100 Nm以内,电机转矩变化率可以快一些,限制在每秒300 Nm。这样既保留了模糊控制的平滑性,又避免不了必要的瞬态冲击。
注意:模糊控制器输出的是比例系数,但这个比例系数不等于最终执行的发动机转矩。工程实现上一定要再接一个转矩协调器,把K_eng、发动机当前转速下的最大转矩、电机峰值转矩、电池功率限幅全部约束起来,才能得到真正可执行的目标转矩。很多人仿真结果很漂亮,实车一跑就露馅,问题基本都出在这一层没做限幅。
4. 整车仿真模型搭建与工况设置
4.1 从部件模型到整车模型的层级架构
整车仿真模型的搭建思路,我是从顶层往下拆的。最顶层是驾驶员模型,输入是目标车速和实际车速,输出是加速踏板和制动踏板信号。踏板信号经过整车控制器转换成驾驶员需求转矩。这个转换关系可以用一个简单公式:需求转矩等于踏板开度乘以当前挡位下的最大驱动转矩。
需求转矩和当前车速、SOC一起送给模糊控制器,模糊控制器输出发动机转矩比例K_eng。转矩协调器再把K_eng拆成发动机目标转矩和电机目标转矩。发动机模型接目标转矩后,通过转速和节气门开度查表得到实际输出转矩和瞬时油耗;电机模型接目标转矩后,通过转速查表得到工作效率,进而算电池的放电电流。电池模型负责把电流积分成SOC,再反馈给模糊控制器。
层与层之间一定要用标准接口:转矩单位统一用Nm,功率单位统一用kW,SOC统一用0到1的小数。我见过有人在一个模型里SOC用百分数,另一个用小数,联调时查了三天才找到问题。接口规范这种事,听起来不起眼,但在模型大了之后能救命。
4.2 工况选取:NEDC、WLTC 与自定义工况
仿真工况我一般不会只跑一个。NEDC是有四个市区循环加一个市郊循环组合成的,特征是低速平稳段和高速巡航段非常规则,对控制策略的“容忍度”较高,很多策略在NEDC上能跑出很低的油耗,但一到真实路况就露馅。WLTC则更动态,速度变化频繁,高加速工况多,对转矩分配的实时性要求高得多。如果把NEDC当成考试卷,WLTC就是附加题。
除了标准工况,我习惯自定义两个工况:第一个是“城市早高峰”工况,模拟走走停停、平均车速20 km/h的拥堵路;第二个是“山区连续爬坡”工况,模拟10分钟持续大转矩输出。这两个工况专门用来验证模糊策略的SOC维持能力和发动机过载能力。事实上,模糊控制器的很多问题在NEDC和WLTC上是看不出来的,只有在连续爬坡这种长时间高负荷工况下才会暴露。
需要注意的是,工况文件里的时间步长通常取1秒,但整车仿真模型的求解步长不能也设成1秒。控制策略模块建议用固定步长10毫秒到50毫秒,而司机模型和车辆动力学模型可以用变步长求解器。混在一起跑虽然能出结果,但转矩切换瞬间的细节全被平滑掉了,等于白跑。
4.3 对比基线与仿真参数设置
要验证模糊控制策略的效果,不能只看它自己跑出来的曲线。我在项目里做了一个对照组:基于逻辑门限的规则策略。这个策略的逻辑非常简单,纯电模式、发动机模式、混合模式、行车充电模式四个模式,由SOC、车速和需求转矩三个门限值切换。门限值我是手动标定的,标定目标是让两个策略在仿真中跑出相近的SOC终值,这样才能公平比较油耗差异。
整车关键参数列一下,方便你搭模型的时候做参考:
| 参数 | 数值 | 说明 |
|---|---|---|
| 整车整备质量 | 1500 kg | 包含电池、电机 |
| 迎风面积 | 2.2 m² | 用于空气阻力计算 |
| 滚动阻力系数 | 0.012 | 普通沥青路面 |
| 发动机最大功率 | 80 kW | 1.5L自然吸气 |
| 电机峰值功率 | 35 kW | 额定20 kW |
| 电池容量 | 5 kWh | 锂离子电池 |
| 初始SOC | 0.6 | 仿真起点 |
| 目标SOC | 0.6 | 电荷平衡目标 |
仿真结束后的对比指标我重点看四个:百公里油耗、SOC终值与初始值偏差、模式切换次数、发动机平均有效热效率。这四个指标合在一起,基本能反映同一辆车在不同策略下的真实差距。
5. 仿真结果分析与效果评估
5.1 转矩分配结果随工况的变化
接上仿真模型后,我先在WLTC工况下跑了一遍,把发动机、电机和总需求转矩三条曲线叠在同一个图里。最明显的现象是:WLTC前600秒的市区段,需求转矩基本在50到80 Nm之间波动,模糊控制器的输出K_eng始终低于0.4,电机承担了绝大部分驱动任务。这是因为低速段车速低,车速修正项把K_eng压得很低,同时SOC在中位以上,规则也倾向于用电。
进入WLTC的高速段之后,需求转矩开始稳定在100到120 Nm附近,发动机的K_eng迅速上升到0.7以上,发动机转速也稳定在2200到2500转这个经济区。这个区间发动机万有特性效率高,电机基本不输出转矩,只在需要瞬态加速时叠加一部分。最漂亮的是在加速超车瞬间,需求转矩冲到180 Nm以上,发动机和电机同时输出,K_eng和电机转矩同步上升,没有出现传统逻辑门限策略那种“模式切换瞬间动力中断”的现象。
5.2 油耗与SOC平衡效果
跑完WLTC后,模糊策略的百公里油耗显示5.8 L/100km,SOC从初始的0.6下降到0.58,下降幅度只有2个百分点。这个SOC曲线很让我满意:它在绝大部分时间里贴着0.6上下波动,只有在大加速段短暂跌到0.55,随后在巡航段又通过发动机充电补了回来。这说明电荷维持修正模块起到了预期作用,没有让SOC出现单边趋势。
换到NEDC工况后,油耗降到了5.1 L/100km。NEDC的稳态巡航比较多,发动机在高效率点工作时间更长,纯电起步比例也更高,所以油耗比WLTC低是正常的。SOC终值是0.61,甚至比初始值还高了一点,说明策略在低速段多回收了一些能量,EV模式下也没有过度消耗。
不过我提醒自己,仿真油耗好看不代表实车一定省油。模型里的电池温度、附件功率损耗、变速箱换挡逻辑这些都没完全建模,实车油耗通常要比仿真高10%到15%。但控制策略的横向对比依然有效,因为对照组是用同一个模型跑出来的。
5.3 与门限逻辑策略的数据对比
把模糊策略和逻辑门限策略放在一起对比,结果非常直观:
| 指标 | 模糊逻辑策略 | 逻辑门限策略 |
|---|---|---|
| 百公里油耗 (WLTC) | 5.8 L | 6.3 L |
| 百公里油耗 (NEDC) | 5.1 L | 5.5 L |
| SOC终值与初始偏差 | -0.02 | -0.01 |
| 模式切换总次数 (WLTC) | 52 | 87 |
| 发动机平均热效率 | 34.2% | 31.5% |
两组SOC终值偏差都控制在很小的范围内,说明对比是公平的。模糊策略在WLTC下油耗省了大约8%,NEDC下省了7%,节能效果很明显。但更让我看重的是模式切换次数,从87次降到52次,降幅40%。模式切换每发生一次,发动机启停、离合结合、转矩过渡都会带来额外油耗和磨损,频繁切换不仅费油,实车标定的时候还容易出现NVH投诉。
发动机平均热效率提升了快3个百分点,这主要是模糊策略让发动机更多运行在经济工作线附近,而不是像门限策略那样经常被硬性门限拽出最优区间。我做了一个统计:模糊策略里发动机工作点落在经济区(有效比油耗低于245 g/kWh)的时间占比约65%,门限策略只有52%。
6. 常见问题与排查经验
6.1 SOC 一直往下掉
这个现象我在初版模糊控制器里遇到过。仿真跑到一半,SOC从0.6一路掉到0.3,发动机频繁启动充电都补不回来。排查下来,问题出在模糊规则里SOC“低”的隶属函数范围设置不合理。当时我把SOC“低”的峰值设在0.3,而实际SOC在0.5以下时发动机比例已经需要明显提高了,但规则库还在按“中”处理,导致充电功率不足。
解决办法是把SOC隶属函数里“低”和“中”的边界整体右移,让SOC低于0.5就进入较强的发动机出力修正。另外,我还在CS修正模块里把SOC偏差的比例增益从0.05提高到0.08,SOC掉到0.55以下时,K_eng会自动加0.2到0.3的修正量。经过这两处调整,SOC曲线基本能锁在目标值附近。
6.2 发动机频繁启停、模式切换抖动
模糊控制器输出本身是连续的,但模糊规则在边界上偶尔会出现争议区。比如车速在35 km/h附近、SOC刚好卡在中位时,某几个规则同时激活,输出K_eng会在0.4和0.6之间来回摆。表现在仿真结果里,就是发动机目标转矩反复跨过启动阈值,造成频繁启停。
我给发动机启动逻辑加了一个滞回环:进入发动机模式需要K_eng大于0.5且持续超过1秒,退出发动机模式则要K_eng降到0.35以下再持续1秒。这样相当于给模糊输出加了一个“迟滞”,虽然损失了一点理论上的最优性,但换来了模式切换次数的显著下降。另一个辅助手段是给K_eng输出加低通滤波,时间常数取0.2秒,能消除高频摆动,但要注意时间常数太大会让动力响应变迟钝。
6.3 模糊控制器仿真卡顿或结果振荡
有朋友复制我的方案后反馈说,模型跑起来特别慢,而且发动机转矩曲线有高频锯齿状波动。卡顿的原因多半是隶属函数数量太多,规则数量爆炸。我当时用过5×5×5的划分,规则库125条,仿真速度直接慢了一倍不止。其实45条规则已经足够,关键是规则质量而不是数量。
锯齿波动则另有原因:去模糊化采用重心法时,如果输出隶属函数的平台区太宽,重心位置会在平台边界附近反复跳动。解决办法是把输出隶属函数从梯形改成三角形,或者缩小平台区宽度。还有可能是求解器步长太大,控制模块和车辆动力学模块共用了一个大步长,转矩变化被“跳”过去了。把控制模块的采样步长固定为10ms,锯齿问题基本消失。
6.4 规则库越调越大,调试效率低
做模糊控制器和做查表策略一样,都有“越调越多,越调越乱”的风险。一开始45条规则,为了适应各种复杂工况,不停增加输入变量和模糊子集,最后膨胀到200多条,自己都看不懂哪条规则在起作用。
后来我给自己立了个规矩:先跑一个只用SOC和需求转矩两个输入、5×5规则库的模型,把SOC维持和油耗做到跟门限策略差不多,再逐步加入车速修正。每加一个新规则前,先看旧规则库里哪几条规则长期覆盖不到,优先替换它们,而不是横向扩张。这个流程走下来,最终规则库只保留了40条,而且每条规则都能在仿真曲线上找到对应的激活区间。
调试时还有个小技巧:把模糊规则输出面画出来,X轴是需求转矩,Y轴是SOC,Z轴是K_eng。这个三维曲面如果有明显的台阶或尖峰,就说明规则之间衔接不平滑,需要调整隶属函数重叠度或规则强度。表面平滑的规则库,仿真曲线基本不会出大问题。
最后分享一个经验:在处理模糊控制器之前,先用一个固定需求转矩信号驱动控制模块,人工检查输出是否符合规则语义。这个习惯帮我避开了至少一半的“低级错误”。并联式混动看似简单,但转矩分配必须较真,希望这篇分析对正在做或者准备做混动控制的你有实际帮助。