说到制动能量回收,做新能源汽车控制的人基本都绕不开这一关。市区走走停停,制动发生得又密又频繁,如果这些动能全部让摩擦片变成热量散掉,等于把续航白白送走。BRS(Brake Regeneration System,制动能量回收系统)要做的,就是把这一部分动能先转成电能,再存回动力电池。方案说起来很简单,可真要动手搭一个可用的Simulink模型,很多人第一步就卡在“不知道从哪下手”上:整车模型建多细?电机和电池怎么等效?制动力怎么分配才不会影响制动安全?SOC限值、充电功率限值、低速关断又该怎么处理?
这篇文章就是用我实际建模过程中的经验来聊透这件事。我会从底层逻辑讲起,再给你一份可以直接落地的Simulink模型搭建路径,包括参数准备、模块实现、策略写法、仿真调试和典型问题排查。适合正在做电控仿真、车辆动力学建模,或者刚接触再生制动算法的工程师。无论你是在校做课题,还是在企业做预研,按这条线走,至少能少踩一半的坑。
1. 制动能量回收系统与BRS模型的底层逻辑
1.1 制动能量回收到底回收了什么
先不急着开Simulink,得先把物理对象想清楚。车辆在行驶中携带的动能主要取决于质量和车速,关系式是:
[ E_k = \frac{1}{2} m v^2 ]
车速从 80 km/h 降到 30 km/h,看起来只是数字变化,动能减少量其实相当可观。以一台整备质量 1350 kg 的车为例,80 km/h 约 22.2 m/s,动能约 333 kJ;降到 30 km/h 约 8.3 m/s,动能约 46.5 kJ,这中间有将近 286 kJ 的能量需要在制动过程里被转移。传统摩擦制动把这些能量全部变成制动盘上的热量,而再生制动则让电机反向发电,把其中一部分转成电能,再通过电池管理系统充进电池包。
但“回收多少”不是一个固定值,它取决于四件事:当前车速、电机发电能力、电池充电接受能力,以及驾驶员要求的减速度。前两者决定了系统“能不能收”,后两者决定了“收多少”。这也是BRS模型的四个核心输入量。
1.2 为什么非要用Simulink建BRS模型
很多人在刚开始接触BRS时都有个疑问:这不就是个查表加限幅的逻辑吗,直接用C代码写不就行了?问题是,工程开发不是“把逻辑写出来”就结束,而是要回答“逻辑对不对、参数合不合理、故障下怎么办”这一连串问题。
Simulink的价值在于它是从模型在环(MIL)、软件在环(SIL),再到硬件在环(HIL)的流程里最顺手的工具。你可以先把整车、电机、电池、制动系统全部框进一个模型里,用仿真结果验证控制策略,然后逐步把被控对象替换成真实组件接口,最后用代码生成工具把控制模型转成嵌入式代码,实现一套基本无损的开发链路。制动能量回收恰恰是涉及安全的功能,脱离了闭环验证直接上实车,风险不可控。
另外,Simulink里自带的Stateflow和MATLAB Function非常适合表达制动力分配这类带状态、带条件的逻辑。比如“低速关断”“SOC过高限制”“前后轴分配切换”这些听起来很啰嗦的需求,用状态图表达比用散落的if-else清晰得多,后期维护也方便。
1.3 BRS模型的整体架构
一个可运行的BRS仿真模型,至少包含四个层次:信号输入层、控制策略层、被控对象模型层、数据监控层。
信号输入层负责整车工况、踏板开度、挡位状态等外部激励。常规做法是从工作区读入一组时间-车速数组,再把制动踏板开度作为另一路输入,或者用一个简单的驾驶员模型把目标减速度算出来。控制策略层就是BRS核心算法,负责计算需求制动力、可用再生制动力、液压制动力补足量。被控对象层主要包括纵向动力学、电机发电、电池充电和液压制动四个子模型。数据监控层不参与控制逻辑,它的职责是把能量流、SOC、转矩信号记录下来,方便事后分析。
这四个层次在Simulink里可以按子系统分开,模块边界尽量对应真实控制器和被控对象的物理边界。模型里跑一辆虚拟车,本质上是把整车控制问题拆成“能算的需求”和“能给的响应”两组问题。
2. 建模准备:从参数定义到策略边界
2.1 整车纵向动力学参数:制动力需求的起点
整车参数决定了一辆车的制动需求到底是多少。别相信“随便设个减速度就行”的做法,后续所有分配逻辑都建立在这个基准上。
需要准备的整车参数至少包括:整备质量、滚动半径、滚动阻力系数、空气阻力系数、迎风面积、旋转质量换算系数。滚动阻力和空气阻力的公式分别是:
[ F_f = f m g ]
[ F_w = \frac{1}{2} \rho C_d A v^2 ]
在制动过程中,这些阻力实际上是帮车辆减速的。所以严格来说,真正需要制动系统提供的“额外制动力”应该是目标减速度对应的总制动力减去行驶阻力。不过为了简化控制逻辑,很多BRS策略直接按“目标减速度×整车质量”计算总需求制动力,再用行驶阻力项做小幅度修正。
我实际项目里常用的参数表大致如下:
| 参数 | 数值 | 单位 |
|---|---|---|
| 整备质量 m | 1350 | kg |
| 滚动半径 Rw | 0.31 | m |
| 滚动阻力系数 f | 0.012 | - |
| 风阻系数 Cd | 0.28 | - |
| 迎风面积 A | 2.2 | m² |
| 减速器速比 i_gear | 9.0 | - |
| 减速器效率 eta_gear | 0.97 | - |
这些参数决定了扭矩到轮端力的换算关系。需要记住,轮端扭矩经过减速器之后已经是放大的结果,反向从轮端力求电机扭矩时,一定要除以速比和效率。
2.2 电机与电池:把“能收多少”变成数学表达
电机在发电工况下的能力边界来自两个地方:扭矩外特性和效率MAP。发电扭矩外特性通常类似电动工况,只是在第二象限。你可以用查表的方式,把电机转速作为输入,输出当前转速下的最大发电扭矩。转速高时电机功率大,但扭矩可能下降,这是外特性决定的。
电池端要关心的不是“电流多大”,而是“当前能接受多少充电功率”。简化建模中常把电池等效为一个电压源加内阻,再叠加一个最大充电功率限制表。SOC和电池温度共同决定最大充电功率。我一般会把充电功率限制做成一张二维查表,行是SOC,列是温度,输出是最大充电功率。
电池充电功率、电机发电功率和机械制动功率之间的换算关系是整个模型最容易出符号错误的地方。我在模型里统一采用这样的约定:电机转速为正,再生制动时电机转矩为负,机械功率为负(表示车辆向电机输入功率),电机发电后送到电池的电功率 (P_{batt}) 为负值,对应充电;驱动时正好相反。
具体换算公式是:
[ P_{mech} = \frac{T \cdot n}{9549} ]
其中 T 是电机转矩(Nm),n 是电机转速(rpm),单位是 kW。发电工况下机械功率为负,考虑到电机和逆变器效率,电池充电功率:
[ P_{batt} = P_{mech} \cdot \eta_{gen} ]
注意这里的 (\eta_{gen}) 是发电工况下的效率,通常小于 1。也就是说,发电时电池收到的电功率是机械功率打了折扣,不能用机械功率直接当充电功率。很多第一次搭模型的人,SOC计算和能量统计对不上,多半就出在这个环节。
2.3 控制策略边界条件:法规与安全怎么提炼
制动能量回收再怎么想回收,也不能突破安全底线。实车上制动系统要服从制动法规中关于前后轴制动力分配的要求,最基本的约束是不能出现后轴先抱死,尤其要避免在低附着路面出现不稳定工况。
在仿真模型里,完整复现制动法规曲线比较复杂,但对于策略验证,至少要保留两条边界:一是前后轴静态分配比例,二是再生制动力不能突破“驾驶员需求减速度”这个上限。前者用常量或查表表示,后者直接成为分配逻辑的约束条件。例如前轴制动力占比 0.6,电机只在前桥时,当需求前轴力为 6000 N,而电机最大能提供 5000 N,则液压制动需要补充 1000 N。如果需求前轴力只有 3000 N,则全部由电机承担。
除了法规,还要考虑驾驶性。制动踏板开度很小的场景下,如果突然施加很大的再生扭矩,驾驶员会明显感觉“被拽了一下”。所以模型中要加入扭矩变化率限制,常见做法是一阶惯性环节或者斜率限制器。时间常数通常设为 0.02-0.05 秒,过大会让回收响应迟钝,过小会产生冲击。
3. 手把手搭建BRS Simulink模型
3.1 自底向上的仿真链路:从工况到SOC
搭建时我的习惯是先建一个可以自动运行的仿真链路,再逐步加入细节。从 Simulink 库中新建一个模型,顶层至少分成四个子系统:整车纵向动力学、电机模型、电池模型、BRS控制策略。
整车纵向动力学子系统接收来自控制策略的驱动/制动扭矩,以及当前车速,输出加速度和车速。电机模型接收转矩命令和转速,输出实际转矩、机械功率和效率。电池模型接收充电功率请求,结合SOC查表计算电池电流,最后积分得到SOC。BRS控制策略则接收车速、SOC、踏板开度、电机转速、电池充电功率限制,输出电机再生转矩和液压制动补足量。
信号流向是闭环的:策略算出来的转矩影响车速,车速再反馈回策略,这就是一个典型物理闭环。为了避免代数环,我一般会在必要位置加一阶惯性模块,模拟电机响应延迟,同时天然打破瞬时耦合。
3.2 制动力分配模块的实现逻辑
分配算法是BRS模型的心脏。我这里给出一个经过实际项目验证的串联式逻辑,优先使用再生制动,再生能力不足时由液压制动补足。核心步骤如下:
- 根据制动踏板开度查表得到目标减速度 (a_{req})。
- 计算总需求制动力 (F_{req} = m \cdot |a_{req}|)。
- 按前后轴分配比例,计算前轴需求力 (F_{front} = \beta \cdot F_{req})。
- 计算电机最大可用再生制动力 (F_{regen_max}),公式: [ F_{regen_max} = \frac{\min(T_{motor_max}, T_{batt_limit}) \cdot i_{gear} \cdot \eta_{gear}}{R_w} ] 其中 (T_{batt_limit}) 由电池最大充电功率反推: [ T_{batt_limit} = \frac{P_{chg_max} \cdot 9549}{n \cdot \eta_{gen}} ]
- 实际再生制动力 (F_{regen} = \min(F_{front}, F_{regen_max}))。
- 前轴液压制动力 (F_{hyd_front} = F_{front} - F_{regen}),后轴液压力 (F_{hyd_rear} = (1-\beta) \cdot F_{req})。
这个逻辑用MATLAB Function写非常简单清晰,关键是要处理好“电机可用能力翻上来后,液压要不要撤退”的问题。最稳妥的做法是:液压和再生始终做减法关系,即再生增加,液压同步减少,并且通过限变化率来平滑过渡。
我习惯用一段伪代码来约束实现:
function [T_regen, F_hyd_front, F_hyd_rear] = brs_alloc(a_req, v, SOC, n_motor) F_req = m * abs(a_req); F_front = beta_front * F_req; F_rear = (1 - beta_front) * F_req; F_regen_max = calc_available_fmax(v, SOC, n_motor); if v < v_low_limit || SOC > soc_high_limit F_regen = 0; else F_regen = min(F_front, F_regen_max); end T_regen = F_regen * Rw / (i_gear * eta_gear); F_hyd_front = F_front - F_regen; F_hyd_rear = F_rear; end这个逻辑天然保证了总需求制动力不超出驾驶员请求,同时也没有违背前后轴分配比例。如果想做得更细,可以在低速段和高速段使用不同的回收比例,比如低速时再生扭矩迅速退坡,高速时允许更大回收力。
3.3 关键信号调理:SOC修正、转矩限幅与低车速关断
这三个问题看似小,处理不好模型根本跑不出合理结果。
SOC修正需要考虑电池充电功率限制。我一般在电池模型里做这样一个钳位:策略请求的充电功率大于SOC对应的限制时,直接把请求值压到限值内。但要注意压的是“功率”,回到转矩限幅时要重新反推转矩。如果把功率限值直接当成转矩限值用,高转速下误差会非常大。
低车速关断也非常关键。电机转速低到一定程度,反电动势太小,发电效率极差,继续回收没有意义,还可能造成抖动。通常设一个速度阈值,比如车速低于 5 km/h 时禁止再生制动。这里要用滞回控制,避免阈值附近反复切换。也就是说,进入回收需要车速超过 6 km/h,退出回收则要降到 5 km/h 以下。这段滞回区间能解决大部分低车速抖动问题。
转矩限幅要同时考虑电机峰值扭矩和电池充电功率限制,两者取较小值。还要在分配模块里做单位一致性检查,轮端力和电机转矩之间差了减速器速比和车轮半径,换算错一位就是十几倍的差异。
3.4 仿真参数与求解器设置
Simulink仿真BRS模型,我推荐使用定步长求解器,固定步长取 0.01 秒或者 0.001 秒,取决于模型动态。BRS关断、SOC限制这些逻辑在连续变步长求解器下容易出现“状态明明到了边界却弹不回去”的情况。定步长配合较大的采样周期反而更接近实际控制器运行节奏。
模块采样时间要统一。整车纵向动力学、电机、电池这些物理模型可以是连续时间,但控制策略模块建议设成离散采样时间,例如 10 ms 或者 20 ms。理由很简单:实际控制器就是按周期运行的,仿真里用离散控制模块才能模拟采样延迟和离散效应。而物理对象模型保持连续,这样更贴近真实系统。
单位建议全部统一成国际单位。车速用 m/s,扭矩用 Nm,功率用 kW。统一单位可以避免很多低级换算错误,尤其是查表模块里需要严格对应索引。
4. 仿真结果分析与模型调优
4.1 从结果曲线判断模型是否正常
模型跑完第一遍,不要急着看回收了多少能量,先看几条核心曲线是否符合物理直觉。
车速曲线应该平滑变化,减速度曲线应该在驾驶员需求附近,且制动阶段不会出现跳变。电机转矩在制动时应该是负值,且幅值不超过外特性限制。电池电流在充电时为负值,SOC应该在充电阶段上升。如果SOC在制动过程中不升反降,大概率是符号约定反了。
这几条曲线都正常后,再计算能量回收率。我的定义是:
[ \text{回收率} = \frac{\int P_{batt}^{charge} dt}{\frac{1}{2}m(v_0^2-v_1^2)} ]
注意这个比值只是评估再生制动能力的一个工程指标,不代表整车的整车能量回收率。整车层面的回收率还要考虑驱动效率、附件消耗、电池内阻损失等一系列因素。
4.2 一次完整减速过程的能量流复盘
我拿一个典型减速工况来说明。车辆从 60 km/h 开始制动,目标减速度 2.5 m/s²,一直刹到停车,车辆动能减少约 208 kJ。按照上文参数,电机端可用发电扭矩充足,电池充电功率当时允许 45 kW,减速过程持续约 6.7 秒,整个过程中电机实际发电约 150 kJ,电池最终回收电量约 127 kJ,回收率约 61%。
之所以没有达到更高,是因为减速前期转速高,电池功率限制限制了电机发电;减速后期车速低于 5 km/h,回收功能关断,剩余动能由液压制动消耗。每一段限制都在工作,这就是正常状态。
把能量流按时间切片,可以得到一张表,用来判断限制因素占比。比如:
| 时间区间 | 速度区间 | 主要限制因素 | 回收功率趋势 |
|---|---|---|---|
| 0-2 s | 60-45 km/h | 电池充电功率 | 稳定在45 kW附近 |
| 2-4 s | 45-25 km/h | 电机外特性+电池限值共同影响 | 从45 kW缓慢下降 |
| 4-6.7 s | 25-5 km/h | 电机效率与低转速能力 | 快速下降 |
| 6.7-7 s | 5-0 km/h | 回收关断 | 回收功率为0 |
这种分析做出来以后,瓶颈一目了然:如果你想让回收率更高,就得提升电池峰值充电功率,或者调整低速关断阈值,再或者优化制动过程扭矩变化率限制,让它更快拉到目标值。
4.3 调优方向:回收率、驾驶性与稳定性
调优是个平衡动作,不是单纯把回收比例调大就好。比如把电池最大充电功率从 45 kW 调到 60 kW,回收率可能上升 3 个百分点,但电池极化电压会变大,寿命会受影响。再比如把低车速关断阈值从 5 km/h 降到 3 km/h,回收率小幅提升,但停车瞬间可能出现车辆点头感。
这时我会做一个一维参数扫描脚本,把几个关键参数作为向量循环仿真,然后用表格汇总结果。推荐扫描的参数依次为:电池充电功率限制、低速关断阈值、前轴再生力分配比例、扭矩变化率限制。每扫描一组,记录回收能量、停车减速度峰值、制动距离这三个指标。三个指标能同时满足约束的参数区间,就是可接受的工作点。
实际项目里,我把“回收能量”和“最大减速度冲击”做了一个二维权衡图。横轴是低速关断阈值,纵轴是扭矩变化率,颜色深浅代表能量回收量。最后选择的是既不牺牲太多回收、又不让冲击超过 0.2 m/s² 的那组参数。
5. 常见问题与排查技巧实录
5.1 仿真发散与代数环排查
仿真一开始就发散,通常不是控制器逻辑错,而是反馈回路里有瞬时耦合导致代数环。典型位置是“车速反馈给策略,策略算扭矩,扭矩又直接通过动力学求车速”这一点上。解决办法有两个:给电机转矩加一阶惯性模块,或者用单位延迟模块将车速反馈信号延迟一拍。两种方法等效,效果都很好。
如果仿真步长太大导致数值发散,需要把固定步长从 0.01 改到 0.005 秒试一下。很多情况下,“灵异事件”只是数值积分步长不合适,跟模型本身没有关系。
5.2 回收电流为0或者SOC不涨
回收电流为零,先去查三个信号:车速、SOC和制动踏板。低速或者SOC高于保护阈值,回收被禁止,这是正常设计。排除这两个后,再去查电机转速信号。有些模型用“轮速/减速器速比”求电机转速,轮速在起步或停车时接近0,如果转速被除到很小,电池功率限制反推出来的转矩限幅会变得极大或极小,甚至出现NaN。给转速加一个下限保护,比如设置最小值为 1 rpm,可以避免这个问题。
SOC不涨还有一个常见原因:查表时把SOC的“可充电容量”和“总容量”搞混。再生充电电流应该除以可用充电容量,而不是整包容量。否则SOC变化率会被稀释得几乎看不出来。
5.3 制动力分配跳变导致冲击
如果你看到减速度曲线里出现小波浪,或者在制动过程中听到类似“咯噔”描述的仿真震荡现象,大概率是再生与液压分配在一个周期内来回切换。比如目标减速度刚好在“电机最大能力”边界附近时,一个采样周期算出来回收力够,另一个采样周期算出来不够,液压制动力跟着反复波动。
解决方法是加滞回:当需求力与可用再生力的差值小于某个阈值时,维持上一周期分配方式;只有差值超过阈值时才切换。这个阈值可以用差值除以需求力,得到一个百分比,一般取 3%-5% 的滞回带就够稳定了。
5.4 从离线仿真到硬件在环的注意事项
仿真通过后,要把BRS控制器模型通过自动代码生成工具转成C代码时,要特别注意离散模块的采样周期和状态初值。硬件在环测试中,整车模型和控制器模型通常跑在不同的目标机上,通信里需要把SOC、电机转速、车速、制动踏板等信号打包成CAN报文。
还有一点很容易忽略:离线仿真里可以用连续时间实现电池模型,但HIL环境里整车模型也严格按周期运行,连续时间模块会被离散化。电池内阻、电容这类参数在离散化后会引入额外延迟,建议在HIL前先把电池模型改成离散状态方程,并做一次模型对比校验。
| 现象 | 可能原因 | 排查手段 |
|---|---|---|
| 仿真发散、NaN | 代数环或转速分母为0 | 加一阶惯性、给转速加下限 |
| 回收功率为0 | 车速低于阈值/SOC过高 | 检查保护条件、查看信号使能 |
| SOC不涨 | 电流符号反了/容量参数错误 | 检查电池模型I表达式、确认符号 |
| 减速度波动 | 再生/液压切换过于频繁 | 给分配逻辑加滞回带 |
| 能量回收率偏低 | 充电功率限制太保守/低速关断过早 | 扫描参数,找平衡点 |
我个人在实际操作中的体会是:BRS模型的价值不在于第一次仿真就能跑出多漂亮的回收率,而在于它能帮你在上实车之前把所有边界条件都逼出来。很多问题在实车上发现一次要消耗大量时间,但在仿真里复现只需要改一个常量。尤其是SOC保护、扭矩变化率限制这些看似“不太重要”的细节,越是到后期,越能决定一个策略能不能从模型走进整车。如果你现在正准备搭这个模型,建议先严格按“物理参数—能力边界—分配逻辑—保护逻辑”的顺序来,模型跑通后再逐步加细节,会比直接堆模块顺利得多。