直接上手说正事。增程式混合动力汽车,业内习惯叫EREV,这几年热度一直没下来过。原因不复杂——它有纯电驱动的平顺安静,又用一台发动机当“充电宝”兜底续航,结构上比并联混动和功率分流简单得多,特别适合城市通勤和高速巡航的混合场景。而研究这种车,最难的从来不是装一台电机或者选一块电池,而是整车的能量流到底怎么分配:什么时候纯电跑,什么时候发动机启动,SOC压到多少开始充电,充到多少又停机。这些问题不放到仿真平台里反复跑,光靠实车标定,时间和成本都兜不住。
所以就有了这篇东西。我想用一个完整案例,手把手带你把一套增程式混动整车的Matlab/Simulink模型从零搭起来:先讲清楚增程构型背后的能量逻辑,再拆整车动力学模型、电池模型、电机模型、发动机模型怎么建,然后写一套简单的CD/CS能量管理策略,最后跑一个标准工况看结果。整个过程用的都是Simulink/Simscape里最常见的基础模块,不依赖第三方工具箱,适合车辆工程在校生、刚转行做三电系统的工程师,以及想自己搭平台验证控制策略的算法工程师。下面内容有点长,但每一步我都标注了参数来源和避坑点,跟着走,大概率能一次跑通。
1. 增程式混动构型与建模整体思路
1.1 增程式构型的基本能量流
增程式混动在结构上是典型的串联构型,发动机不直接驱动车轮,发动机只带动发电机发电,发的电要么直接供给驱动电机,要么存进动力电池,车轮永远只由电机驱动。这个构型最大的好处是发动机可以始终工作在高效区,转速和负载由控制器主动调节,不跟车速绑定,噪声振动控制也相对容易。
建模之前先画一张能量流图(用文字示意):
- 纯电模式:电池 → 电机控制器 → 驱动电机 → 车轮
- 增程模式:发动机 → 发电机 → 电机控制器 → 驱动电机(多余电量存入电池)
- 制动能量回收:车轮 → 电机(发电状态)→ 电池
三条路径对应三种核心工作状态,后文的所有模型都是围绕这三条路径展开的。建模第一步不是急着拖模块,而是先把这条路想明白,否则后面信号线会绕成蜘蛛网。
1.2 前向仿真与后向仿真的取舍
搞混动仿真的人一定会遇到一对概念:前向仿真(Forward Simulation)和后向仿真(Backward Simulation)。
后向仿真假设车辆完全跟随工况车速,从车轮端反向推导,逐级计算工况需求功率,沿着传动链往上游反推,最终得到发动机或电池需要提供的能量。这种模型计算快、精度要求低,适合做燃油经济性的粗略估算,但是它的缺点是没法真实反映驾驶员行为,也做不了动态控制策略。
前向仿真则相反,模型里有一个“虚拟驾驶员”,通过PID调节模拟驾驶员踩加速/刹车踏板,把目标车速和实际车速的误差换算成踏板开度,再转成功扭矩和功率需求,向下游部件逐级传递。这种方式更接近真实车辆行为,适合验证控制策略,代价是计算量更大、模型更复杂。
我这次选择前向仿真,原因很直接:我们建模型的目的就是为了写能量管理策略,策略要能真正跑起来,就必须有闭环反馈,后向模型没有这个能力。
1.3 Simulink模型顶层架构
建议把模型按物理子系统拆成几个模块,而不是把所有东西堆在同一个model里。推荐的最低粒度是这样:
| 模块名称 | 作用 | 输入信号 | 输出信号 |
|---|---|---|---|
| 驾驶员模块 | 生成踏板开度 | 目标车速、实际车速 | 加速踏板、制动踏板 |
| 整车控制器模块 | 模式判断、功率分配 | 踏板、SOC、车速 | 发动机启停指令、发电机功率指令 |
| 增程器模块 | 发动机+发电机发电 | 功率指令、状态指令 | 发电功率、燃油消耗率 |
| 动力电池模块 | 电池充放电 | 功率需求 | SOC、端电压 |
| 驱动电机模块 | 电机驱动与回馈 | 扭矩指令 | 实际扭矩、功率消耗 |
| 整车动力学模块 | 车辆纵向运动 | 驱动力/制动力 | 实际车速 |
信号流方向:驾驶员模块输出的踏板信号进入控制器,控制器根据SOC和踏板开度决定模式,然后分别向增程器、电池、电机发送指令,最后所有功率汇总到整车动力学模块,算出新车速反馈回驾驶员模块。这是一个闭环结构,层与层之间用Goto/From或者Bus都行,我建议用Bus,信号多了以后管理更清晰。
2. 整车纵向动力学模型搭建
2.1 整车关键参数与行驶阻力方程
车辆行驶时,电机输出扭矩经过减速器和主减速器后变成轮端驱动力,这个力要克服滚动阻力、空气阻力、坡度阻力和加速阻力。这是所有整车模型的物理基础,增程式混动也不例外。
行驶阻力公式为:
F = m·g·f·cos(α) + 0.5·ρ·Cd·A·v² + m·g·sin(α) + δ·m·a
其中,m是整车质量,g是重力加速度,f是滚动阻力系数,α是道路坡度,ρ是空气密度,Cd是风阻系数,A是迎风面积,v是车速,δ是旋转质量换算系数,a是纵向加速度。
以一台典型增程式SUV为例,取一组常用参数:整备质量1850kg,满载质量2150kg,考虑到成员和行李,仿真质量取2000kg;风阻系数0.31,迎风面积2.48m²,滚动阻力系数0.012,旋转质量换算系数取1.08。坡度默认0,平路工况为主。
2.2 需求功率与轮端扭矩换算
有了阻力就可以算轮端需求功率:
P = F·v
这个功率就是整车需要电机提供的机械功率(暂不考虑制动回收时,驱动工况下)。再往上游推,电机的输出功率需求为:
P_motor = P / (η_gear · η_motor)
其中η_gear是减速机构的传动效率,取0.95,η_motor是电机在不同工况点的效率,由电机MAP图查表得到。
建模建议:用Simulink的Constant模块放参数,用Product/Sum组合搭建公式,用Lookup Table模块放电机效率MAP。不要硬编码数字,后面调参的时候你会感谢自己当初用了变量。
2.3 驾驶员模型与循环工况
前向仿真需要一个虚拟驾驶员。标准做法是目标车速与实际车速做差,经过一个PID控制器输出踏板开度(0到1),再通过“加速踏板→驱动扭矩”“制动踏板→制动力”的映射关系,转换成对车辆的输入。
PID参数的粗调经验:车速这类大惯量对象,比例项取0.8~1.5,积分项取0.05~0.3,微分项可以很小甚至取0。我遇到过很多人问为什么车速跟踪不上,一看PID参数全是0——那当然跟踪不上,插个零就断开了反比例。
循环工况选择方面,国内最常用的三个:WLTC(全球轻型车测试循环)、CLTC(中国轻型车测试循环)、NEDC(旧欧洲循环,已逐渐淘汰但在学术文献里还在大量出现)。CLTC更适合国内场景,比较常见。直接把循环工况的Excel数据导出成Signal Builder块或者From Workspace,作为目标车速输入。
2.4 整车模块的Simulink实现
整车动力学模块本质是解这个方程:由驱动力-阻力差求得加速度,再积分得到车速。
在后向路径上,从目标车速反推需求扭矩;在前向路径上,从电机输出的实际驱动力向前推车速。这里最容易犯的错是:用需求功率/需求扭矩去算车速,导致模型出现代数环。正确的做法是在整车模块里只做一件事——受力分析和牛顿第二定律,把驱动力当成输入,把车速当输出,扭矩和功率的换算放在电机和控制器那一层。
3. 动力部件模型:电池、电机与增程器
3.1 动力电池模型——初学者版Rint
电池建模是一个很大的领域,但从整车控制策略验证的角度,一个Rint模型完全够用。Rint模型把电池等效为理想电压源与一个串联内阻,开路电压Voc和内阻R0都是SOC的函数,通过查表得到。
核心关系式是这样:
- 端电压:U = Voc(SOC) - I·R0(SOC)
- 功率平衡:P_batt = U·I
- 电流求解:I = (Voc - sqrt(Voc² - 4·R0·P_batt)) / (2·R0) (放电为正方向)
SOC由安时积分法的表达式计算:
SOC(t) = SOC_0 - (1 / Q_max)·∫I·dt
其中Q_max是电池最大可用容量(Ah)。
实现注意三点:
第一,Voc和R0对SOC的查表曲线,可以取磷酸铁锂或三元锂的典型数据,前期没有实验数据时用文献参考值就行,但要保证SOC在0.2~0.9之间不要剧烈跳变。
第二,安时积分法的问题在于SOC误差会随积分累积,在策略验证场景可以接受,但你要是想研究SOC估计,就得换卡尔曼滤波等方案,这不属于本文讨论范围。
第三,仿真容易遇到的数值问题是在功率P_batt很大且SOC很低时,根号内出现负数。这就是Rint模型的物理极限——彻的低电量大功率时电池已经“供不上”了,模型直接报错。工程上的处理方法是限制电池最大放电功率:
P_max_disch = (Voc² / (4·R0)) (根号内为零的临界功率)
在模型里加一个Min块,把功率指令限幅到P_max_disch以内。这一步是很多初版模型跑崩的最常见原因,加了之后基本能消除。
3.2 驱动电机建模——效率MAP查表法
整车仿真不需要电机电磁内部结构,用稳态外特性+效率MAP就够了。电机模型要做两件事:根据扭矩指令和当前转速,计算实际输出扭矩(受外特性限制);根据输出机械功率查效率,计算出输入电功率。
外特性的处理方式:在Simulink中用Lookup Table实现扭矩上限随转速变化。低速恒扭矩区、高速恒功率区是典型特征。临界转速看电机类型,永磁同步电机通常在4000~6000rpm进入弱磁区。
效率MAP是一个二维查表:输入转速和扭矩(或功率),输出效率。推荐用Lookup Table(n-D)模块,把效率矩阵填进去。数据来源可以有三种:台架实验数据、文献参考数据、用电机设计软件仿真出来的数据。很多公开论文都有某功率等级电机的效率MAP,可以拿来当初始数据。
电机模型的功率关系要注意方向:
- 驱动状态:P_electric = P_mech / η
- 发电状态(回馈):P_electric = P_mech · η
有些模型在电机前面统一乘效率,导致制动回收时能量反而变大,这是方向性错误。
3.3 增程器模型——发动机万有特性与发电机效率
增程器是“发动机+发电机”组合,发动机拖动发电机发电,输出的电功率进入直流母线。增程器建模的核心是:给定一个发电功率指令,发动机要工作在什么转速、什么扭矩点,对应多少燃油消耗。
工程上的简化做法:认为增程器有最佳的“功率-油耗率”曲线,也就是在发电功率P_gen的每个值下,发动机都工作在最优BSFC点(制动比油耗,Brake Specific Fuel Consumption,单位g/kWh)。于是可以提前计算出一条静态曲线:
- 横轴:发电功率 P_gen(kW)
- 纵轴:发动机最优油耗率 b_e(g/kWh)或每小时燃油消耗 m_dot_fuel(g/s)
模型运行时,根据发电功率指令,直接查表得到燃油消耗率。这种方式避免了发动机动态过程的建模,对能量管理策略验证完全够用,甚至很多整车厂的初步仿真都是这么干的。
发电机模型更简单:一个效率常数或效率查表。永磁同步发电机在高效区效率可以达到0.92~0.95,取一个随功率变化的效率表更合适。发电功率除以发电机效率就是机械功率,机械功率除以发动机效率就是燃油能量。
燃油消耗计算:
m_dot_fuel = P_gen / (η_gen · η_engine · LHV_fuel)
其中LHV_fuel是燃油低热值,取44.3MJ/kg(等效12.3kWh/kg)。注意单位换算,这里坑特别多,我第一次换算的时候整整浪费了半天,最后的油耗结果整整差了一个数量级。
3.4 油箱和整车质量耦合
增程器工作时要烧油,油箱里的油减少,整车质量也跟着变。绝大多数初学模型不会考虑这一点,直接用固定质量。在短工况(比如一个CLTC约30km)里这个问题确实可以忽略,但如果要跑超长里程或者跑能量流分析,质量变化会引起阻力变化,最后会影响电耗和油耗的准确度。
建议在模型里把整车质量定义为初始质量减去消耗燃油量。Simulink里做法不复杂:燃油消耗率积分得到累计耗油量,再用Sum块更新质量即可。需要注意单位是kg,油耗单位从g换算的时候除以1000。
4. 能量管理策略:CD/CS两阶段控制
4.1 CD/CS策略的核心思想
增程式混动最常见的控制策略是电量消耗-电量维持(Charge Depleting - Charge Sustaining),也就是CD/CS。CD阶段相当于一台纯电动车,电池SOC从满电往下消耗;当SOC降到阈值(比如25%),整车进入CS阶段,此时增程器开始工作,维持电量在一定范围内波动。
为什么用CD/CS?因为增程混动本质上是“纯电优先”,日常通勤距离短就直接当纯电车开,跑长途才启动增程器。这种策略在NEDC/WLTC/CLTC下测试时,结果直接体现为CD阶段的纯电续航和CS阶段的油耗两个指标。
4.2 SOC阈值与功率分配标定
判据逻辑如下:
- SOC > SOC_high:纯电模式,增程器停机
- SOC_low < SOC < SOC_high:维持当前状态(滞回,避免频繁启停)
- SOC < SOC_low:增程模式,增程器开机
SOC_high和SOC_low之间要设置滞回区间(比如SOC_low=25%,SOC_high=30%)。没有滞回的话,发动机在临界点附近会反复启停,不仅NVH差,油耗也高。
增程器工作时的功率分配有几种策略:
- 恒功率:发动机固定在某个功率点发电,比如20kW。简单粗暴,但可能造成电池过充或过放。
- 功率跟随:发动机发电功率跟随需求功率。电池只作为“缓冲池”,削峰填谷。这个模式效率较高,但发动机动态起伏大。
- 最优曲线:按SOC查表决定发电功率。SOC低多发电,SOC高少发电。这是最常用、最稳的折中方案。
我个人推荐初版模型用“SOC查表+功率跟随限幅”组合:先根据SOC的偏差确定目标发电功率,再用一个大范围的跟随项修正,最后限幅在增程器最高发电功率以内。
4.3 Stateflow实现逻辑状态切换
Simulink里做模式切换,最顺手的工具是Stateflow。定义三个状态:
- EV_Mode(纯电)
- CS_Mode(增程)
- Transition之间的转移条件
核心转移条件:
- 从EV进入CS:SOC <= SOC_low 且车速 > 0(车速太低时即使SOC低也不急着启动)
- 从CS退回EV:SOC >= SOC_high
- 停机条件:停车且SOC > SOC_high,触发发动机延时停机
Stateflow里可以顺便写功率分配逻辑,用一个函数块查表或算公式输出P_gen指令和发动机启停标志。
写策略时有几个细节容易出错:
第一,发动机启动不能瞬态响应,应加一个启动延迟和功率爬坡。最简单的做法是给P_gen指令加一阶惯性环节,时间常数取0.5~1秒。
第二,模式切换瞬间要防止功率跳变导致模型数值振荡。加个Rate Limiter模块可能给你省掉大麻烦。
第三,CD阶段不是完全不能启动发动机,比如你踩地板油爬山,功率需求远超电池放电能力,这时即使SOC很高也要启动增程器“助力”。更完善的做法是加一个“大功率请求”条件:需求功率超过电池最大放电功率与电机最大功率的差额时,无条件启动增程器。
4.4 几种经典策略的对比
| 策略类型 | 实现难度 | 油耗水平 | 电池寿命影响 | 适用场景 |
|---|---|---|---|---|
| CD/CS恒定阈值 | 低 | 中 | 中 | 入门学习、初版验证 |
| 功率跟随 | 中 | 较低 | 较好 | 日常场景优化 |
| 动态规划/MPC | 高 | 最优 | 好 | 科研、离线优化参考 |
CD/CS不是最优策略,但它是理解能量管理的必要起点,后面的模型预测控制、动态规划都是在它的基础上演进的。
5. 从模型到仿真:集成、调试与结果分析
5.1 模型集成要点与代数环问题
各个部件模型建好后,用Bus对象将信号连接起来。最关键的连接线有两条:一条是“功率需求”线从控制器到电池和增程器;另一条是“车速反馈”线从整车动力学模块回到驾驶员模块。
连完线后最容易遇到的问题就是代数环。典型表现:Simulink报错“Algebraic loop”。本质是一个模块的输出经过纯增益/查表路径直接回到自己输入,中间没有状态更新。
举一个最常见的例子:电池模块需要电流来算功率,而功率计算公式里又需要电流——如果直接用电流输入功率模块再除以电压,就会产生代数环。解决办法有两个:一是给电流反馈路径加一个单位延迟(Unit Delay)或一阶惯性环节,打断循环;二是改写公式,像前面第3.1节那样用二次方程直接由功率解出电流,彻底绕开代数环。专业人士更推荐后者,加延迟会引入不需要的动态误差。
5.2 仿真参数设置
求解器选择:固定步长比变步长更稳,推荐用ode4(四阶Runge-Kutta),步长0.01~0.05秒。如果模型里有一阶惯性为0.1秒级别,步长0.01秒已经足够。
仿真时长:CLTC工况时长1800秒,仿真时间设置1800秒即可。如果内存足够,可以一次性把数据存到工作空间。
有一个参数很多人容易漏掉:微分环节的采样时间。Simulink里PID模块默认连续时间,如果整模型都是离散步长,PID模块也要改成离散时间,不然会出现仿真警告。
5.3 结果分析:怎样判断模型是对的
跑完仿真,第一步不是看油耗,而不是先看“合理性”:
- 车速跟踪是否贴合工况曲线:虚拟驾驶员如果不能跟踪车速,应该是PID参数的问题,模型本身无错。
- SOC曲线是否平滑下降:CD阶段以稳定斜率下降,CS阶段在滞回区间内波动,没有突变。
- 增程器启停是否太频繁:一个CLTC循环里,启停次数控制在个位数。如果几十次,说明滞回阈值设小了,或者功率跟随太激进。
- 油耗是否在合理范围:参照增程式车型官方油耗(馈电状态5-8L/100km)看自己结果的量级,如果算出来是几十升/百公里,多半是单位换算错了。
输出燃油消耗率时,把瞬时耗油率(g/s)积分得到总耗油量(g),然后除以工况行驶里程(km),再乘以100,就得到百公里油耗。
5.4 常见问题速查表
我把搭建和调试过程中最常踩到的坑整理成一张速查表,每一项都是实际运行中遇到的问题。遇到报错时可以对照排查。
| 现象 | 原因 | 解决方案 |
|---|---|---|
| 仿真起步就报错“Root found when evaluating” | 代数环 | 检查电池功率/电流反馈回路,改写公式法解电流 |
| SOC在CD阶段先升后降 | 制动回收能量大于驱动消耗,正常现象 | 不用处理,观察整体趋势 |
| CS阶段发动机反复启停 | 滞回区间过窄或功率跟随过强 | 拉大SOC_low与SOC_high间距,功率跟随加惯性 |
| 整车车速恒为0 | 扭矩到加速度的传导链路断开 | 检查整车动力学模块里驱动力与车速积分的连接 |
| 油耗大得离谱 | 燃油低热值单位错误或效率方向反了 | 核对LHV单位,确认查询效率时功率方向正确 |
| PID跟踪不上车速 | 比例增益过小或积分饱和 | 调大Kp,给积分加限幅 |
| 高功率时仿真崩溃 | 电池模型根号内负数 | 加上文提到的P_max_disch限幅 |
| 结果油耗为0 | 增程器没有启动指令 | 检查SOC阈值设置,确认工况循环前是否初始化满电 |
5.5 初版模型的扩展方向
模型跑通之后,我建议按下面的优先级去扩展。
第一步,完善SOC精度。安时积分法在长周期仿真里误差会积累,接一个卡尔曼滤波或扩展卡尔曼滤波对SOC做在线估计。
第二步,把电池热模型加进来。增程式在CS模式下电池反复充放,热管理对电池寿命影响很大,加个集总热容模型,看温升趋势。
第三步,替换逻辑策略为实时优化策略。等值燃油消耗最小策略(Equivalent Consumption Minimization Strategy,ECMS)比CD/CS省油5%~10%,是业内用的最多的实时次优策略,实现也不复杂——核心是定义等效因子,把电能折算成等效燃油消耗,然后每个时刻最小化等效油耗,选出发电功率或放电功率。这个比MPC简单得多,强烈建议作为CD/CS的下一个进阶方向。
写在最后
整套模型的搭建和调试过程里,我体会最深的一点是,增程式混动建模的难度不在某个部件有多复杂,而在于能量流怎么跨层级串起来。电池里解的电流要和发动机烧的油发生关系,两者又在一个状态机控制下协同工作——这种跨物理域的逻辑链是Simulink建模的价值的真正来源。我第一次把整车模型跑通的时候,SOC曲线在CS阶段稳定维持、增程器只在需要的时刻启动,那种感觉确实是“通了”。如果你搭的过程中卡在哪一步,大概率可以在上面的速查表里找到答案。给初学者的建议,先跑通,再调参,最后才谈得上算法优化——仿真平台本来就是试错成本最低的地方,这一步走得越扎实,后面做策略优化越省力。