1. 项目概述
12/8极开关磁阻电机(SRM)因其结构简单、可靠性高、成本低廉等优势,在电动汽车、工业驱动等领域应用广泛。但它的强非线性特性也给控制带来挑战,传统方法往往难以兼顾动态性能和稳态精度。这次我们基于Simulink搭建的仿真平台,实现了四种典型控制策略的完整闭环验证。
我在工业伺服系统开发中接触过各种电机控制方案,SRM的"简单结构+复杂控制"特性尤为突出。这个仿真项目最初是为了验证新型预测算法效果,结果意外发现基础参数设置对系统性能的影响远超预期。下面就把从模型搭建到算法实现的完整过程,结合踩过的坑和实战技巧,给大家做个详细分享。
2. 仿真环境搭建
2.1 基础模块选择
Simulink的Simscape Electrical库中提供了现成的SRM模块,但直接使用会错过关键建模细节。我的建议是:
-
从磁链特性曲线入手,用实测数据构建非线性电感模型。12/8电机的每相电感周期为15度机械角,建议至少采集72个位置点的数据。
-
功率电路建议采用不对称半桥结构,用MOSFET模块替代理想开关,并添加:
- 寄生电容(Coss=100pF典型值)
- 导通电阻(Rds_on按器件手册设置)
- 体二极管反向恢复时间(trr=50ns)
-
机械负载模型要包含:
matlab复制J = 0.02; % 转子惯量(kg·m²) B = 0.005; % 粘滞摩擦系数(N·m·s/rad) Tc = 0.1; % 库伦摩擦扭矩(N·m)
2.2 多速率仿真配置
电力电子仿真需要微秒级步长,而机械动态响应通常在毫秒级。通过Solver Configuration模块分组设置:
-
电力电子部分:
- 求解器:ode23tb(刚性系统适用)
- 步长:1e-6s
- 相对容差:1e-4
-
机械部分:
- 求解器:ode4(Runge-Kutta)
- 步长:1e-4s
- 最大步长限制:1e-3s
注意:在Model Settings的Data Import/Export中取消勾选"Single simulation output",否则会强制统一时间步长。
3. 电流斩波控制实现
3.1 滞环比较器设计
电流斩波的核心是滞环控制,但标准Relay模块无法满足快速切换需求。改用Hit Crossing+Memory组合实现:
matlab复制function [gate_signal] = hysteresis_control(current, ref, hys_width)
persistent last_state;
if isempty(last_state)
last_state = 0;
end
if (current > ref + hys_width/2)
gate_signal = 0;
last_state = 0;
elseif (current < ref - hys_width/2)
gate_signal = 1;
last_state = 1;
else
gate_signal = last_state;
end
end
关键参数经验值:
- 滞环宽度:额定电流的5%~10%
- 采样时间:小于开关周期的1/10
- 延迟补偿:根据MOSFET开通延迟添加50-100ns的前馈补偿
3.2 续流路径优化
实测发现续流期间的电流振荡主要来自:
- 二极管反向恢复效应
- 线路寄生电感与开关管结电容谐振
改进方案:
- 采用SiC二极管模块(如Cree C3D06060A)
- 在直流母线添加snubber电路:
code复制Rsnub = 100Ω Csnub = 100nF - 在相线串联小电感(1-2μH)抑制高频振荡
4. 角度位置控制策略
4.1 最优开通角计算
开通角对转矩脉动影响显著。通过离线有限元分析获取转矩特性曲面,再用二次曲面拟合:
matlab复制theta_on = @(w,T) p00 + p10*w + p01*T + p20*w^2 + p11*w*T + p02*T^2;
典型12/8电机参数范围:
- 开通角:-5°~10°(相对于对齐位置)
- 关断角:15°~25°
- 重叠角:5°~15°
4.2 动态调整算法
转速突变时采用模糊PID调整开通角:
-
输入变量:
- 转速误差:e = w_ref - w_actual
- 误差变化率:ec = de/dt
-
输出变量:
- 开通角修正量:Δθ
-
规则库示例:
code复制IF e is PB AND ec is NB THEN Δθ is PS IF e is ZO AND ec is PS THEN Δθ is NS
5. 模型预测电流控制
5.1 预测模型建立
考虑磁饱和效应,电感矩阵L(θ,i)需在线更新。采用递推最小二乘法(RLS)实时辨识:
matlab复制function [L] = update_inductance(theta, i, prev_L)
persistent P lambda;
if isempty(P)
P = eye(2)*1e3;
lambda = 0.99; % 遗忘因子
end
phi = [theta; i];
K = P*phi/(lambda + phi'*P*phi);
P = (P - K*phi'*P)/lambda;
L = prev_L + K*(v - R*i - prev_L*di/dt);
end
5.2 代价函数设计
多目标优化代价函数:
code复制J = k1*(i_ref - i_pred)^2 + k2*(T_ref - T_pred)^2 + k3*du^2
权重系数建议:
- k1/k2 = 0.7~1.5(电流跟踪优先)
- k3 = 0.1~0.3(抑制开关频率)
6. 转矩分配优化
6.1 转矩脉动抑制
采用转矩分配函数(TDF)实现平滑过渡:
matlab复制function [w_A, w_B] = torque_sharing(θ)
θ_overlap = 10; % 重叠角
θ_rise = θ_overlap/2;
if θ < -θ_rise
w_A = 1; w_B = 0;
elseif θ < θ_rise
w_A = 0.5*(1 + cos(pi*θ/θ_overlap));
w_B = 1 - w_A;
else
w_A = 0; w_B = 1;
end
end
6.2 在线补偿策略
实时检测转矩误差并补偿:
- 高频注入法:叠加1kHz正弦信号检测磁链变化
- 观测器设计:
code复制
增益K取系统带宽的2~3倍dT_hat/dt = -K*(T_meas - T_hat) + u
7. 调试问题排查指南
7.1 常见故障现象
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 电流尖峰 | 续流路径不畅 | 检查二极管模型参数 |
| 转速振荡 | 机械惯量过小 | 增大J或降低速度环带宽 |
| 转矩脉动大 | 开通角设置不当 | 扫描5°~25°寻找最优值 |
7.2 参数敏感度分析
- 电感非线性度:影响预测精度,误差>15%需更新模型
- 开关频率:高于20kHz时效率下降明显
- 采样延迟:超过2个控制周期会导致不稳定
8. 性能优化技巧
-
并行计算加速:
- 在Simulink Configuration中启用"Allow tasks to execute concurrently"
- 将机械和电气部分分配到不同核
-
模型简化方法:
- 用Lookup Table替代实时RLS计算
- 开关管采用平均值模型
-
代码生成准备:
matlab复制% 配置Embedded Coder cfg = coder.config('lib'); cfg.TargetLang = 'C'; cfg.GenCodeOnly = true;
这个仿真框架经过多个工业项目的验证,最深刻的体会是:SRM控制效果60%取决于基础建模精度,30%在于控制参数配合,剩下10%才是算法本身的优劣。建议新手先把机械参数测准、功率电路建真,这些基础工作到位了,高级算法才能显出效果。