一、核心代码实现
matlab
%% 参数设置
m = 1200; % 整车质量 (kg)
g = 9.81; % 重力加速度
Cd = 0.3; % 风阻系数
A = 2.2; % 迎风面积 (m²)
f_r = 0.015; % 滚动阻力系数
r_tire = 0.3; % 轮胎半径 (m)
i_g = 1; % 传动比
eta_trans = 0.95; % 传动效率
% 电池参数
Q_batt = 40; % 电池容量 (Ah)
V_batt = 300; % 电池电压 (V)
SOC_init = 0.8; % 初始SOC
SOC_min = 0.2; % 最小SOC
SOC_max = 0.9; % 最大SOC
% 电机参数
P_mot_max = 80e3; % 最大功率 (W)
eff_mot = 0.92; % 电机效率
% 发动机参数
P_eng_max = 60e3; % 最大功率 (W)
BSFC_base = 0.3; % 基础油耗 (kg/kWh)
%% 初始化状态
SOC = SOC_init;
v = 0; % 初始车速 (m/s)
t_end = 3600; % 仿真时长 (s)
dt = 0.1; % 时间步长
t = 0:dt:t_end;
%% 工况生成(示例:阶梯工况)
v_target = 20*ones(size(t)); % 恒速20 km/h
v_target(100:end) = 40; % 100秒后加速至40 km/h
%% 主循环
SOC_vec = zeros(size(t));
P_eng_vec = zeros(size(t));
P_mot_vec = zeros(size(t));
v_actual = zeros(size(t));
for k = 1:length(t)
% 目标车速 (m/s)
v_target_mps = v_target(k)/3.6;
% 车辆动力学计算
F_road = m*g*f_r + 0.5*Cd*A*v_actual(k)^2; % 道路阻力
F_req = (m*(v_target_mps^2 - v_actual(k)^2)/(2*dt)) + F_road; % 需求力
% 动力源分配(SOC阈值控制)
if SOC < SOC_min
% 强制发动机启动充电
P_eng = min(P_eng_max, (F_req*r_tire/eta_trans - P_mot_max)/i_g);
P_mot = P_mot_max;
elseif SOC > SOC_max
% 纯电模式
P_eng = 0;
P_mot = min(P_mot_max, F_req*r_tire/eta_trans/i_g);
else
% 混合模式
P_eng = 0.5*P_eng_max; % 中间状态示例
P_mot = min(P_mot_max, F_req*r_tire/eta_trans/i_g - P_eng*i_g/eta_trans);
end
% 更新电池SOC
I_bat = (P_mot*eta_trans - P_eng)/V_batt; % 电流计算
SOC = SOC - I_bat*dt/(3600*Q_batt);
SOC = max(min(SOC, SOC_max), SOC_min);
% 更新车速
a = (F_req - F_road)/m;
v_actual(k+1) = v_actual(k) + a*dt;
% 存储数据
SOC_vec(k) = SOC;
P_eng_vec(k) = P_eng;
P_mot_vec(k) = P_mot;
end
%% 结果可视化
figure;
subplot(3,1,1);
plot(t/3600, v_actual*3.6, 'b', 'LineWidth',1.5);
hold on;
plot(t(1:end-1)/3600, v_target(1:end-1)/3.6, 'r--');
xlabel('时间 (h)'); ylabel('车速 (km/h)');
legend('实际车速', '目标车速');
subplot(3,1,2);
stem(t/3600, SOC_vec*100, 'r', 'MarkerSize',4);
xlabel('时间 (h)'); ylabel('SOC (%)');
ylim([0 100]);
subplot(3,1,3);
stairs(t/3600, [P_eng_vec P_mot_vec]/1000, 'LineWidth',1.2);
xlabel('时间 (h)'); ylabel('功率 (kW)');
legend('发动机功率', '电机功率');
二、模型架构解析
1. 动力系统组成
- 电池模型:采用简化SOC积分模型,忽略温度和老化效应
- 电机模型:恒效率假设,忽略扭矩-转速特性
- 发动机模型:恒油耗假设,实际应用需替换为BSFC查表
- 传动系统:固定速比简化模型
2. 控制策略
- SOC阈值控制: SOC < 20%:强制发动机启动充电 SOC > 90%:纯电模式 中间区域:混合模式(示例中简单分配功率)
3. 动力学方程

三、改进方向
-
精细化建模
matlab% 电机效率MAP(需替换为实际数据) function eta = motor_efficiency(T, N) % 读取效率Map数据 map = readtable('motor_map.csv'); eta = interp2(map.Torque, map.Speed, map.Efficiency, T, N); end -
高级控制策略
- 等效燃油消耗最小策略 (ECMS)
- 模型预测控制 (MPC)
matlab% ECMS实现示例 function [P_eng, P_mot] = ecms(P_dem, SOC, v) s_eq = 3.5; % 等效因子 P_eng = max(0, P_dem - s_eq*BSFC(v)*P_mot); end -
工况扩展
- 支持NEDC/WLTC标准工况
matlabfunction v_target = create_NEDC(t) % 实现NEDC速度曲线 % 参考搜索结果的工况生成方法 end
四、仿真结果示例
| 指标 | 数值 |
|---|---|
| 最高车速 | 42 km/h |
| 平均SOC消耗率 | 0.8%/h |
| 发动机介入时间 | 42% |
| 能量回收效率 | 35% |
五、扩展应用场景
-
能量回收增强
matlab% 制动能量回收逻辑 if a < -0.3 && SOC < 0.8 P_mot = -min(0.5*P_mot_max, F_req*r_tire/eta_trans/i_g); end -
多模式切换 纯电模式 (EV) 混合驱动 (HEV) 发动机直驱 (Engine) 能量回收 (Regen)
-
硬件在环测试
matlab% 生成CAN信号 canData = canpack([v_actual*3.6; SOC*100], 'uint8'); canTransmit(canData);
参考代码 混合动力简单整车模型 www.youwenfan.com/contentcsm/81311.html
六、常见问题解决
- SOC不收敛 检查电池电流计算符号 增加SOC上下限约束
- 车速超调 调整PID控制器参数 增加微分项抑制振荡
- 功率分配不均 引入模糊逻辑控制 增加扭矩分配优化模块