【原创】MATLAB/Simulink汽车电动助力转向模型EPS模型
模型包括整车二自由度模型,eps模型,上下转向柱模型,包括建模方程,整车参数,匹配计算,模型,使用说明
电动助力转向系统控制系统
电动助力转向系统被控系统
逻辑门限值控制算法
控制策略
软件在环仿真测试
文章目录
文章目录
构建一个完整的 MATLAB/Simulink 模型来模拟电动助力转向系统(EPS)涉及多个模块,包括整车二自由度模型、EPS 动力学模型、上下转向柱模型以及控制策略。以下是基于 MATLAB 的代码框架和 Simulink 模型的实现思路。
1. 整车二自由度模型
整车二自由度模型用于描述车辆的横向动力学特性。主要包括以下方程:
状态空间方程
[
\begin{aligned}
\dot{v}y &= \frac{F{yf} + F_{yr}}{m} - v_x r \
\dot{r} &= \frac{a F_{yf} - b F_{yr}}{I_z}
\end{aligned}
]
其中:
- ( v_y ): 侧向速度
- ( r ): 横摆角速度
- ( F_{yf}, F_{yr} ): 前后轮侧向力
- ( m ): 整车质量
- ( I_z ): 车辆绕 Z 轴的转动惯量
- ( a, b ): 质心到前后轴的距离
MATLAB 实现
function [vy_dot, r_dot] = vehicle_dynamics(vx, vy, r, delta, params)
% 输入参数
m = params.m; % 整车质量 (kg)
Iz = params.Iz; % 绕Z轴转动惯量 (kg*m^2)
a = params.a; % 质心到前轴距离 (m)
b = params.b; % 质心到后轴距离 (m)
Cf = params.Cf; % 前轮侧偏刚度 (N/rad)
Cr = params.Cr; % 后轮侧偏刚度 (N/rad)
% 计算前后轮侧向力
alpha_f = delta - atan((vy + a * r) / vx); % 前轮侧偏角
alpha_r = -atan((vy - b * r) / vx); % 后轮侧偏角
Fyf = Cf * alpha_f; % 前轮侧向力
Fyr = Cr * alpha_r; % 后轮侧向力
% 状态导数
vy_dot = (Fyf + Fyr) / m - vx * r;
r_dot = (a * Fyf - b * Fyr) / Iz;
end
2. EPS 模型
EPS 模型描述了电机助力与驾驶员输入扭矩之间的关系。助力扭矩 ( T_a ) 是根据驾驶员输入扭矩 ( T_d ) 和车速 ( v_x ) 计算得出的。
助力逻辑门限值控制算法
[
T_a =
\begin{cases}
k_1 T_d & \text{if } |T_d| \leq T_{th1} \
k_2 T_d + b & \text{if } T_{th1} < |T_d| \leq T_{th2} \
k_3 T_d + c & \text{if } |T_d| > T_{th2}
\end{cases}
]
MATLAB 实现
function Ta = eps_assist_control(Td, vx, params)
% 输入参数
k1 = params.k1; % 第一区间增益
k2 = params.k2; % 第二区间增益
k3 = params.k3; % 第三区间增益
b = params.b; % 第二区间偏移
c = params.c; % 第三区间偏移
Tth1 = params.Tth1; % 第一阈值
Tth2 = params.Tth2; % 第二阈值
% 根据门限值计算助力扭矩
if abs(Td) <= Tth1
Ta = k1 * Td;
elseif abs(Td) <= Tth2
Ta = k2 * Td + b;
else
Ta = k3 * Td + c;
end
end
3. 上下转向柱模型
上下转向柱模型描述了方向盘输入扭矩 ( T_d ) 与转向系统输出扭矩的关系。通常可以简化为一个刚性或弹性模型。
弹性模型
[
T_s = K_s (\theta_s - \theta_c) + C_s (\dot{\theta}_s - \dot{\theta}_c)
]
其中:
- ( T_s ): 转向柱扭矩
- ( \theta_s ): 方向盘转角
- ( \theta_c ): 转向齿轮转角
- ( K_s ): 刚度系数
- ( C_s ): 阻尼系数
MATLAB 实现
function Ts = steering_column(theta_s, theta_c, dtheta_s, dtheta_c, params)
% 输入参数
Ks = params.Ks; % 刚度系数 (Nm/rad)
Cs = params.Cs; % 阻尼系数 (Nm*s/rad)
% 计算转向柱扭矩
Ts = Ks * (theta_s - theta_c) + Cs * (dtheta_s - dtheta_c);
end
4. 控制策略
控制策略包括:
- 逻辑门限值控制:如上所述。
- 闭环控制:使用 PID 或 LQR 控制器优化助力性能。
PID 控制器
[
T_a = K_p e + K_i \int e , dt + K_d \frac{de}{dt}
]
其中 ( e = T_d - T_a )。
5. Simulink 模型
将上述模块集成到 Simulink 中:
- 整车二自由度模型:使用 MATLAB Function 模块实现。
- EPS 模型:包含助力逻辑和电机动态。
- 上下转向柱模型:通过传递函数表示。
- 控制策略:使用 PID 控制器模块。
6. 使用说明
- 设置整车参数(质量、惯量、轴距等)。
- 配置 EPS 参数(助力增益、门限值等)。
- 在 Simulink 中运行仿真,观察车辆响应和助力效果。
- 调整控制器参数以优化性能。
这是一个用于模拟电动助力转向系统(EPS)的模型。该模型包括驾驶员输入扭矩 ( T_d ) 的处理、逻辑门限值控制算法以及电机电流计算等部分。以下是基于该模型的 MATLAB/Simulink 代码实现。
1. 创建 Simulink 模型
首先,在 MATLAB 中创建一个新的 Simulink 模型,并添加必要的模块和连接线。
% 创建新的 Simulink 模型
new_system('EPS_Model');
open_system('EPS_Model');
% 添加模块
add_block('simulink/Commonly Used Blocks/Constant', 'EPS_Model/Driver_Input_Td');
set_param('EPS_Model/Driver_Input_Td', 'Value', '1'); % 驾驶员输入扭矩
add_block('simulink/Math Operations/Abs', 'EPS_Model/Abs');
add_block('simulink/Logic and Bit Operations/If', 'EPS_Model/If1');
add_block('simulink/Logic and Bit Operations/If', 'EPS_Model/If2');
add_block('simulink/Signal Routing/Mux', 'EPS_Model/Mux');
add_block('simulink/Signal Routing/Demux', 'EPS_Model/Demux');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain1');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain2');
add_block('simulink/Math Operations/Product', 'EPS_Model/Product');
add_block('simulink/Math Operations/Sum', 'EPS_Model/Add');
add_block('simulink/User-Defined Functions/Fcn', 'EPS_Model/Fcn');
add_block('simulink/Math Operations/Math Function', 'EPS_Model/Math_Function');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain3');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain4');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain5');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain6');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain7');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain8');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain9');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain10');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain11');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain12');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain13');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain14');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain15');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain16');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain17');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain18');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain19');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain20');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain21');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain22');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain23');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain24');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain25');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain26');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain27');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain28');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain29');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain30');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain31');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain32');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain33');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain34');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain35');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain36');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain37');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain38');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain39');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain40');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain41');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain42');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain43');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain44');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain45');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain46');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain47');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain48');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain49');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain50');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain51');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain52');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain53');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain54');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain55');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain56');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain57');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain58');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain59');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain60');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain61');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain62');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain63');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain64');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain65');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain66');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain67');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain68');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain69');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain70');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain71');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain72');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain73');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain74');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain75');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain76');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain77');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain78');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain79');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain80');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain81');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain82');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain83');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain84');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain85');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain86');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain87');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain88');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain89');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain90');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain91');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain92');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain93');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain94');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain95');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain96');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain97');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain98');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain99');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain100');
% 设置参数和连接线
% ... (设置每个模块的具体参数和连接线)
% 打开模型查看
open_system('EPS_Model');
2. 设置模块参数和连接线
在上述代码中,我们已经添加了所有必要的模块。接下来需要设置每个模块的具体参数并进行连接。由于模块数量较多,这里仅提供关键部分的设置示例:
Abs 模块
set_param('EPS_Model/Abs', 'Operator', 'abs');
If 模块
set_param('EPS_Model/If1', 'Condition', 'u1 < 1');
set_param('EPS_Model/If2', 'Condition', 'u1 > 7');
Gain 模块
set_param('EPS_Model/Gain1', 'Gain', 'K1');
set_param('EPS_Model/Gain2', 'Gain', 'K2');
% ... 设置其他 Gain 模块的增益值
连接线
使用 add_line
函数连接各个模块:
add_line('EPS_Model', 'Driver_Input_Td/1', 'Abs/1');
add_line('EPS_Model', 'Abs/1', 'If1/1');
% ... 连接其他模块
3. 完整的 Simulink 模型
将上述代码整合到一个完整的 Simulink 模型中,并根据实际需求调整参数和连接线。运行模型以验证其功能。
4. 使用说明
- 设置参数:根据实际情况调整各模块的参数。
- 运行仿真:在 Simulink 中运行模型,观察输出结果。
- 调试优化:根据仿真结果调整参数,优化模型性能。
这是一个用于模拟电动助力转向系统(EPS)的模型。该模型包括驾驶员输入扭矩 ( T_d ) 的处理、电机助力扭矩 ( T_m ) 的计算以及电机电流 ( I_m ) 的控制等部分。以下是基于该模型的 MATLAB/Simulink 代码实现。
1. 创建 Simulink 模型
首先,在 MATLAB 中创建一个新的 Simulink 模型,并添加必要的模块和连接线。
% 创建新的 Simulink 模型
new_system('EPS_Model');
open_system('EPS_Model');
% 添加模块
add_block('simulink/Commonly Used Blocks/Constant', 'EPS_Model/Driver_Input_Td');
set_param('EPS_Model/Driver_Input_Td', 'Value', '1'); % 驾驶员输入扭矩
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain_Td');
set_param('EPS_Model/Gain_Td', 'Gain', '1'); % 设置增益为1
add_block('simulink/Math Operations/Subtract', 'EPS_Model/Subtract_Td_Tt_Ek_Bk');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain_1_Jk');
set_param('EPS_Model/Gain_1_Jk', 'Gain', '1/Jk'); % 设置增益为1/Jk
add_block('simulink/Continuous/Integrator', 'EPS_Model/Integrator');
add_block('simulink/Continuous/Integrator', 'EPS_Model/Integrator1');
add_block('simulink/Sinks/Scope', 'EPS_Model/Scope');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain_Bk');
set_param('EPS_Model/Gain_Bk', 'Gain', '-Bk'); % 设置增益为-Bk
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain_Ks');
set_param('EPS_Model/Gain_Ks', 'Gain', 'Ks'); % 设置增益为Ks
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain_8k_8c');
set_param('EPS_Model/Gain_8k_8c', 'Gain', '8k-8c'); % 设置增益为8k-8c
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain_1_lr');
set_param('EPS_Model/Gain_1_lr', 'Gain', '1/lr'); % 设置增益为1/lr
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain_Gm1');
set_param('EPS_Model/Gain_Gm1', 'Gain', 'Gm1'); % 设置增益为Gm1
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain_Gm2');
set_param('EPS_Model/Gain_Gm2', 'Gain', 'Gm2'); % 设置增益为Gm2
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain_Km');
set_param('EPS_Model/Gain_Km', 'Gain', 'Km'); % 设置增益为Km
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain_1_Jm');
set_param('EPS_Model/Gain_1_Jm', 'Gain', '1/Jm'); % 设置增益为1/Jm
add_block('simulink/Continuous/Integrator', 'EPS_Model/Integrator2');
add_block('simulink/Continuous/Integrator', 'EPS_Model/Integrator3');
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain_Bm');
set_param('EPS_Model/Gain_Bm', 'Gain', '-Bm'); % 设置增益为-Bm
add_block('simulink/Math Operations/Gain', 'EPS_Model/Gain_Ka');
set_param('EPS_Model/Gain_Ka', 'Gain', 'Ka'); % 设置增益为Ka
% 连接线
add_line('EPS_Model', 'Driver_Input_Td/1', 'Gain_Td/1');
add_line('EPS_Model', 'Gain_Td/1', 'Subtract_Td_Tt_Ek_Bk/1');
add_line('EPS_Model', 'Subtract_Td_Tt_Ek_Bk/1', 'Gain_1_Jk/1');
add_line('EPS_Model', 'Gain_1_Jk/1', 'Integrator/1');
add_line('EPS_Model', 'Integrator/1', 'Integrator1/1');
add_line('EPS_Model', 'Integrator1/1', 'Scope/1');
add_line('EPS_Model', 'Gain_Bk/1', 'Subtract_Td_Tt_Ek_Bk/2');
add_line('EPS_Model', 'Gain_Ks/1', 'Gain_8k_8c/1');
add_line('EPS_Model', 'Gain_8k_8c/1', 'Gain_1_lr/1');
add_line('EPS_Model', 'Gain_1_lr/1', 'Gain_Gm1/1');
add_line('EPS_Model', 'Gain_Gm1/1', 'Scope1/1');
add_line('EPS_Model', 'Gain_Gm2/1', 'Gain_Km/1');
add_line('EPS_Model', 'Gain_Km/1', 'Gain_1_Jm/1');
add_line('EPS_Model', 'Gain_1_Jm/1', 'Integrator2/1');
add_line('EPS_Model', 'Integrator2/1', 'Integrator3/1');
add_line('EPS_Model', 'Gain_Bm/1', 'Gain_Ka/1');
% 打开模型查看
open_system('EPS_Model');
2. 设置模块参数和连接线
在上述代码中,我们已经添加了所有必要的模块。接下来需要设置每个模块的具体参数并进行连接。由于模块数量较多,这里仅提供关键部分的设置示例:
Gain 模块
set_param('EPS_Model/Gain_1_Jk', 'Gain', '1/Jk'); % 设置增益为1/Jk
set_param('EPS_Model/Gain_Bk', 'Gain', '-Bk'); % 设置增益为-Bk
set_param('EPS_Model/Gain_Ks', 'Gain', 'Ks'); % 设置增益为Ks
set_param('EPS_Model/Gain_8k_8c', 'Gain', '8k-8c'); % 设置增益为8k-8c
set_param('EPS_Model/Gain_1_lr', 'Gain', '1/lr'); % 设置增益为1/lr
set_param('EPS_Model/Gain_Gm1', 'Gain', 'Gm1'); % 设置增益为Gm1
set_param('EPS_Model/Gain_Gm2', 'Gain', 'Gm2'); % 设置增益为Gm2
set_param('EPS_Model/Gain_Km', 'Gain', 'Km'); % 设置增益为Km
set_param('EPS_Model/Gain_1_Jm', 'Gain', '1/Jm'); % 设置增益为1/Jm
set_param('EPS_Model/Gain_Bm', 'Gain', '-Bm'); % 设置增益为-Bm
set_param('EPS_Model/Gain_Ka', 'Gain', 'Ka'); % 设置增益为Ka
连接线
使用 add_line
函数连接各个模块:
add_line('EPS_Model', 'Driver_Input_Td/1', 'Gain_Td/1');
add_line('EPS_Model', 'Gain_Td/1', 'Subtract_Td_Tt_Ek_Bk/1');
add_line('EPS_Model', 'Subtract_Td_Tt_Ek_Bk/1', 'Gain_1_Jk/1');
add_line('EPS_Model', 'Gain_1_Jk/1', 'Integrator/1');
add_line('EPS_Model', 'Integrator/1', 'Integrator1/1');
add_line('EPS_Model', 'Integrator1/1', 'Scope/1');
add_line('EPS_Model', 'Gain_Bk/1', 'Subtract_Td_Tt_Ek_Bk/2');
add_line('EPS_Model', 'Gain_Ks/1', 'Gain_8k_8c/1');
add_line('EPS_Model', 'Gain_8k_8c/1', 'Gain_1_lr/1');
add_line('EPS_Model', 'Gain_1_lr/1', 'Gain_Gm1/1');
add_line('EPS_Model', 'Gain_Gm1/1', 'Scope1/1');
add_line('EPS_Model', 'Gain_Gm2/1', 'Gain_Km/1');
add_line('EPS_Model', 'Gain_Km/1', 'Gain_1_Jm/1');
add_line('EPS_Model', 'Gain_1_Jm/1', 'Integrator2/1');
add_line('EPS_Model', 'Integrator2/1', 'Integrator3/1');
add_line('EPS_Model', 'Gain_Bm/1', 'Gain_Ka/1');
3. 完整的 Simulink 模型
将上述代码整合到一个完整的 Simulink 模型中,并根据实际需求调整参数和连接线。运行模型以验证其功能。
4. 使用说明
- 设置参数:根据实际情况调整各模块的参数。
- 运行仿真:在 Simulink 中运行模型,观察输出结果。
- 调试优化:根据仿真结果调整参数,优化模型性能。