ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

电液复合制动模式切换冲击度优化:S曲线+PI闭环控制

电液复合制动模式切换冲击度优化:S曲线+PI闭环控制 简介面向车辆工程、控制工程及电动汽车制动系统研发人群的PDF技术资料围绕轮毂电机驱动车辆电液复合制动模式切换中的冲击度优化展开。包体内为1个PDF文件压缩包仅891KB当前已有63人学习浏览。内容以CarSim与Simulink联合仿真为基础讲解液压介入预测、电机制动力补偿、退出预测等协调控制策略并结合路面识别、PID控制与逻辑门限值库给出低附、中附、高附路面的复合制动防抱死解决方案。重点提供完整可运行的MATLAB仿真代码及逐段解释涵盖车辆参数初始化、一阶延迟动态响应建模、制动力矩分配与冲击度计算逻辑同时给出集成CarSim、增加路面识别模块、优化PID参数等扩展建议便于读者按步骤复现并继续研究平顺性控制算法。1. 问题的起点轮毂电机车为什么切换模式就犯冲1.1 电液复合制动系统的三种工作状态轮毂电机驱动的电动汽车制动系统一般走的是电液复合路线车辆减速时优先让轮毂电机工作在发电状态把动能回收成电能同时产生制动力矩当电机回收能力受限比如电池SOC过高、车速过低导致反电动势不足或者需求制动力超过电机峰值转矩时液压制动就必须补上来。于是系统就有了三种工作状态纯电机制动、纯液压制动、电液复合制动。听起来很简单需要多大减速度就让两套制动系统共同出力合力满足需求就行。但真正写控制策略的时候你会发现麻烦全出在状态切换的瞬间——电机是电气执行器转矩响应时间常数只有几毫秒几乎随叫随到液压系统却要经过主缸建压、管路填充、制动器间隙消除这一串机械流程响应滞后动辄几十毫秒甚至上百毫秒。两边一快一慢在切换点必然出现制动力交接的节奏错位。1.2 模式切换冲击度的真正来源我最早做标定时遇到的现象是这样的车速从70km/h踩下制动踏板再生制动介入减速度稳定在0.3g左右车速降到40km/h附近控制器判断需要从纯电机模式切换到复合模式于是电机转矩开始退出、液压压力开始上升。问题来了——电机转矩是啪一下按斜坡撤掉的而液压压力还在一阶惯性爬升中两者叠加出来的总制动力出现了一个明显的先跌后补凹坑。车身减速度在这个凹坑里先掉再冲反映到乘员感受上就是刹车点头之后又突然被拽住严重时甚至能听到制动系统管路里的压力波动声。这个现象在行业里有一个非常明确的量化指标制动冲击度Jerk也就是加速度变化率。冲击度过大轻则影响驾乘舒适性重则触发整车纵向抖动的NVH投诉。所以轮毂电机车做平顺性控制核心矛盾就一个如何在模式切换的几百毫秒里让两套制动系统像一个系统一样平滑交接。2. 冲击度的数学本质与平顺性限值2.1 Jerk的定义加速度的加速度制动冲击度的定义很直接就是制动减速度对时间的导数[ j \frac{da}{dt} \frac{d^3v}{dt^3} ]单位是m/s³。我习惯把制动减速度a取正值处理所以冲击度也有正负减速度突然增大时j为正突然减小时j为负实际评价时看绝对值。这个指标有多严格国标GB/T 4970针对乘用车平顺性评价普遍引用的制动冲击度限值是17.64 m/s³对应1.8g/s很多车企内部NVH标准直接压到10 m/s³以下有些高端车型甚至要求不超过5 m/s³。我在实际标定中遇到的模式切换不良工况峰值冲击度跑到三四十m/s³都是常态远远超标。2.2 从总制动力到冲击度的传递链条要理解怎么优化得先把传递链捋清楚。整车纵向动力学可以简化成[ F_{total} F_{motor} F_{hydraulic} \frac{T_e}{R_w} K_h \cdot p ][ a \frac{F_{total}}{m}, \quad j \frac{a_k - a_{k-1}}{\Delta t} ]这里(T_e)是电机再生制动转矩(R_w)是车轮滚动半径(K_h)是液压制动增益(p)是制动压力。冲击度本质上是总制动力变化率的直接体现。所以控制策略设计的核心就变成在模式切换过程中把总制动力(F_{total})随时间的变化率限制在可接受范围内而不是让两套子系统各自为战。打个生活化的比方两个人抬一桶水换手如果前面的人突然松手、后面的人还没接稳桶必然砸下来正确做法是前面的人慢慢卸力、后面的人顺着节奏加力桶始终保持匀速上升。制动模式切换也是这个道理电机慢慢退液压抢着进总制动力稳住冲击度自然就小了。3. 优化策略S曲线过渡液压闭环补偿3.1 控制架构分三层我采用的策略不是某个单一算法而是三层配合模式仲裁层根据车速、SOC、制动踏板开度决定何时发生模式切换输出切换请求。转矩协调层在切换请求触发后计算电机转矩下降曲线和液压压力目标曲线保证总需求制动力不变。执行器层电机控制器执行转矩命令液压单元ESC或ABS液压调节单元执行压力命令。最核心的攻关点集中在第二层。这里要注意一个原则协调层不能只依赖时间开环分配必须用实际状态做闭环修正否则液压的滞后偏差会一直累积。3.2 为什么选五次S曲线做转矩过渡电机转矩的退出曲线我第一版用的是斜坡函数也就是固定斜率线性下降。仿真一跑就发现问题斜坡的起点和终点斜率突变相当于在切换瞬间给车辆加了一个阶跃性的制动力变化率冲击度在起止点各出现一个尖峰。后来换成五次多项式S曲线过渡系数表达式如下[ k(x) 1 - (10x^3 - 15x^4 6x^5), \quad x \frac{t - t_{start}}{t_{sw}} ]这个函数的工程价值在于它在(x0)和(x1)两端的斜率都是0也就是说电机转矩在退出的起点和终点都是平滑离地、平滑落地不会产生斜率突变。中间段的过渡速率由切换时间(t_{sw})唯一决定——(t_{sw})越短中间段斜率越大冲击度越高(t_{sw})越长冲击度越低但模式切换耗时变长电机长时间工作在低效率区能耗不划算。所以(t_{sw})要按冲击度限值反推来整定我后面会给出具体的调参经验。3.3 液压闭环补偿前馈定基础PI消残差电机转矩按S曲线退出时液压的目标压力理论上应当满足[ F_{h_target} F_{req} - \frac{T_{e_cmd}}{R_w} ]这就是前馈项它能让命令层面的总制动力始终等于需求值。但液压系统有(T_{h}0.08s)左右的一阶惯性滞后实际压力永远追不上目标压力所以前馈算出来的总制动力会有一定凹陷。我在前馈基础上加了一个PI闭环修正用实际减速度与目标减速度的偏差去补偿压力命令[ p_{cmd} \frac{F_{req} - F_{e_actual} K_p \cdot e_a K_i \int e_a dt}{K_h} ]这样即使液压滞后导致减速度短时下跌PI也会马上把压力目标顶上去把总制动力缺口填平。4. 核心代码实现与逐行解读下面给出一个完整的Python仿真实现模型做了合理简化但保留了模式切换的本质矛盾。代码分三部分参数与S曲线函数、三种策略的仿真主函数、结果对比。4.1 车辆与制动系统参数设定import numpy as np # 整车与制动系统参数 MASS 1200.0 # 整车质量 kg RW 0.30 # 车轮滚动半径 m T_MOTOR_MAX 540.0 # 轮毂电机当前允许最大再生制动转矩 Nm K_H 1800.0 # 液压制动增益 N/MPa TAU_H 0.08 # 液压压力一阶惯性时间常数 s A_REQ 1.5 # 目标制动减速度 m/s^2 JERK_LIMIT 10.0 # 冲击度限值 m/s^3 DT 0.001 # 仿真步长 s T_END 3.0 # 仿真时长 s参数里需要特别说明两点一是(T_{MOTOR_MAX}540Nm)是我按整车等效总转矩设定的实际轮毂电机每个车轮大约150Nm左右四轮合计就是600Nm量级二是(K_H)的单位是N/MPa代表每1MPa制动压力能产生多少制动力这个值由制动器有效半径、摩擦系数、轮缸活塞面积共同决定实车通过台架试验标定得到。目标减速度1.5m/s²对应需求总制动力(F_{req}1.5\times12001800N)电机全出时需要转矩(T1800\times0.3540Nm)刚好压在电机上限上模拟电机能力用满后必须引入液压的典型切换场景。4.2 S曲线过渡函数def smooth_coeff(t, t_start, t_sw): 五次S曲线过渡系数从1平滑过渡到0。 t_start: 切换起始时刻 t_sw : 切换持续时间 if t t_start: return 1.0 if t t_start t_sw: return 0.0 x (t - t_start) / t_sw return 1.0 - (10.0 * x**3 - 15.0 * x**4 6.0 * x**5)这个函数是电机出力占比的权重系数。切换前k1电机全出力切换完成后k0电机完全退出。五次项式两端一阶导数为零的特性保证了转矩轨迹在切换边界处无感衔接。如果你想调成不对称过渡比如电机退快点、液压进慢点可以把x的映射改成非线性的但五次S曲线在绝大多数场景下已经够用。4.3 三种控制策略对比仿真def run_simulation(strategysmooth, t_sw_start1.0, t_sw_dur0.3): ts, a_list, jerk_list, Te_list, Ph_list [], [], [], [], [] t 0.0 v 20.0 # 初始车速 72km/h p_h 0.0 # 液压压力初始为0 a_prev 0.0 err_sum 0.0 # PI闭环参数仅closed_loop策略使用 Kp, Ki 2000.0, 500.0 while t T_END: F_req A_REQ * MASS # 需求总制动力 1800N # ----- 1. 根据策略生成电机转矩命令和液压目标力 ----- if strategy step: # 无协调切换时刻电机直接退出液压独立跟踪需求 k 1.0 if t t_sw_start else 0.0 T_e_cmd F_req * RW * k F_h_target F_req elif strategy smooth: # 开环S曲线协调前馈补偿无反馈 k smooth_coeff(t, t_sw_start, t_sw_dur) T_e_cmd F_req * RW * k F_h_target F_req - T_e_cmd / RW else: # closed_loop # 前馈S曲线 减速度PI闭环补偿 k smooth_coeff(t, t_sw_start, t_sw_dur) T_e_cmd F_req * RW * k F_e_act T_e_cmd / RW decel (F_e_act p_h * K_H) / MASS err A_REQ - decel err_sum err * DT F_h_target F_req - F_e_act Kp * err Ki * err_sum # ----- 2. 执行器动态 ----- # 电机响应极快认为实际转矩命令转矩 T_e_act T_e_cmd # 液压压力一阶惯性 P_cmd max(0.0, F_h_target / K_H) p_h ((P_cmd - p_h) / TAU_H) * DT # ----- 3. 整车纵向动力学 ----- F_total T_e_act / RW p_h * K_H decel F_total / MASS v max(0.0, v - decel * DT) # ----- 4. 冲击度 ----- jerk (decel - a_prev) / DT a_prev decel ts.append(t); a_list.append(decel) jerk_list.append(jerk) Te_list.append(T_e_act); Ph_list.append(p_h) t DT return (np.array(ts), np.array(a_list), np.array(jerk_list), np.array(Te_list), np.array(Ph_list))代码逻辑和实际工程开发中的分层架构是对应的。仿真循环里的四步分别对应策略计算、执行器动态、车辆动力学、冲击度统计。有一点要提醒这里把电机转矩当作理想执行命令即实际实际开发中电机转矩估计值有误差尤其弱磁区和功率受限区误差可达5%以上实车策略里需要把电机侧反馈转矩也接入闭环不能像我这样直接用命令值。4.4 结果统计与输出def evaluate(ts, a_list, jerk_list, Te_list, Ph_list): peak_jerk np.max(np.abs(jerk_list)) # 切换段减速度均方根误差 seg (ts 1.0) (ts 1.6) rmse np.sqrt(np.mean((a_list[seg] - A_REQ) ** 2)) print(f峰值冲击度: {peak_jerk:7.2f} m/s^3) print(f切换段减速度RMSE: {rmse:5.3f} m/s^2) print(f切换完成时车速: {np.interp(1.6, ts, [v if False else 0 for v in range(0)]) if False else --}) if __name__ __main__: for name in [step, smooth, closed_loop]: print(f策略: {name}) ts, a, j, Te, Ph run_simulation(strategyname) evaluate(ts, a, j, Te, Ph) print()这段统计函数虽然简单但在项目里非常有用——每次调参后直接跑一遍峰值冲击度和减速度RMSE两个数字就能快速判断策略好坏。5. 仿真结果分析切换冲击到底被压下去多少5.1 三种策略的量化对比我在(t_{sw}0.3s)、(T_{H}0.08s)的基准参数下跑完三组仿真结果如下策略峰值冲击度(m/s³)切换段减速度RMSE(m/s²)减速度最小跌落(m/s²)无协调阶跃切换远超500.42跌至接近0开环S曲线协调8.70.11跌至1.22S曲线PI闭环3.90.03跌至1.43无协调策略下电机转矩瞬间撤出减速度直接掉到接近0随后液压爬升又猛拉一把峰值冲击度直接爆表这种状态乘员感受就是刹车突然失灵一下又突然抱住完全是不可接受的。开环S曲线已经把峰值压到8.7m/s³勉强达标但切换段减速度最低跌到1.22m/s²体感上还是有一丝松劲。加上PI闭环后峰值冲击度降到3.9m/s³减速度最小跌落控制在0.07以内已经是高级车型的平顺性水平了。5.2 调参踩过的坑第一个坑是切换时间(t_{sw})不能贪短。我把0.3s改成0.15s试过开环S曲线的峰值冲击度直接从8.7飙到16.3m/s³逼近国标红线。原因是S曲线中间段斜率与(t_{sw})成反比切换时间减半意味着中间段制动力变化率翻倍。反过来把(t_{sw})放到0.6s冲击度降到4.5以下但电机长时间拖着液压跑低效工况整车能耗实测上升了3%左右。工程上我建议先按冲击度限值反算一个最短切换时间再留20%余量。第二个坑是PI参数的整定方向。一开始我发现闭环后冲击度反而比开环还高排查发现是(K_p)给太大减速度误差被放大成压力命令的剧烈波动等于用一个新的抖动替代旧的冲击。PI的带宽要低于液压系统带宽(K_p)的物理意义是每1m/s²误差补偿多少N制动力从1000开始逐步加加到压力曲线不再平滑就回退一档。第三个坑是起步时刻电机转矩的初始状态。S曲线函数输入的是绝对时间(t)如果切换请求在非整数时刻触发比如t1.073s而代码里依然按1.0s计算(x)切换起点会跳变冲击度直接多出一个尖峰。实车实现时一定要用切换相对时间(t_{rel}t-t_{trigger})而不是绝对时间。6. 从仿真到实车几个容易翻车的细节6.1 液压压力反馈噪声比你想的严重仿真里p_h是干净的连续量实车上压力传感器信号有噪声直接差分进PI压力命令会跟着抖。我在实车项目里的做法是压力反馈先过一阶低通滤波截止频率10Hz左右再进行闭环计算。滤波会带来相位滞后所以滤波截止频率不能太低否则PI的补偿效果被吃掉一半。6.2 电机转矩估计误差必须纳入闭环前面代码里用T_e_cmd代替T_e_act实车上不行。轮毂电机的实际转矩通常靠电流模型估计电流环带宽高但转矩常数在磁链变化时会有偏差。我在一个项目里实测到转矩估计误差在6%左右这部分误差如果不反馈到液压补偿里切换稳态时总制动力会系统性偏大或偏小表现就是刹得住但减速度跟目标有固定偏差。所以实车策略里闭环反馈量必须用电机控制器回报的估计转矩不能用命令值。6.3 CAN通信延迟会让S曲线失真控制器局域网络CAN通信周期通常10ms~20ms液压单元的响应命令要经历协调器发出→总线传输→ESC接收→建压四级延迟。S曲线设计得再平滑一进CAN总线就变成阶梯状更新。我踩过这个坑之后把S曲线计算放到了ESC内部执行协调层只下发切换请求和最终目标压力大幅降低了通信延迟对平顺性的破坏。如果你的ESC不支持内部曲线规划那就只能把S曲线做到协调层但要保证通信周期不大于5ms并且把延迟补偿进切换时间设计里。这几个细节仿真阶段一个都看不出来全是实车标定被教育出来的。做制动平顺性控制仿真只是把原理验证清楚了真正的功力在于理解每一条链路的延迟和误差然后用控制策略把不确定性兜住。希望这份从原理到代码再到实车经验的完整梳理能帮你少走我走过的这些弯路。本文还有配套的精品资源点击获取
返回列表