PMSM十二扇区直接转矩控制仿真项目
项目介绍
本项目实现了一个基于MATLAB代码的高性能永磁同步电机(PMSM)直接转矩控制(DTC)系统仿真。与传统的DTC六扇区控制策略不同,本项目核心采用了十二扇区(12-Sector)划分策略。通过将电压矢量空间细分为十二个区域,结合多级滞环比较器,该系统能够显著增加电压矢量的选择灵活性,从而有效降低电磁转矩和定子磁链的脉动,改善电流波形质量,并提升系统的动态响应能力。
仿真模型完全通过 main.m 脚本以离散时间步进的方式构建,手动实现了电机物理模型、逆变器逻辑以及DTC控制算法的核心数学方程,适合深入理解DTC内部原理及算法验证。
功能特性
- 十二扇区细分策略:将360度电角度空间划分为12个30度的扇区,相比传统六扇区提供了更精细的电压矢量选择逻辑。
- 高精度离散仿真:仿真步长设定为 1us (1e-6s),能够精确模拟高频开关动作下的电机瞬态响应。
- 纯代码物理建模:不依赖Simulink工具箱模块,直接在代码中通过微分方程(欧拉法)构建表贴式PMSM(SPMSM)的动态数学模型。
- 完整的DTC控制闭环:包含定子磁链观测器、转矩估算器、滞环比较器(磁链2点/转矩3点)以及开关表查找。
- 多工况模拟:内置了负载突变(0.02秒)和转矩给定阶跃(0.05秒)的测试工况,用于验证系统的抗扰动能力和动态跟随性能。
系统要求
- MATLAB R2016a 或更高版本
- 无需额外的Simulink工具箱,仅需基础MATLAB环境即可运行
使用方法
- 确保工作路径包含
main.m 文件。 - 直接运行
main.m 函数。 - 程序将初始化系统参数,执行指定时长的仿真循环,并记录电机状态数据。
- 仿真结束后,程序将生成相关数据数组(如
data.time, data.Iabc, data.Te 等),可用于后续的绘图分析(注意:代码中包含了数据记录逻辑,但绘图部分需要用户根据记录的数据自行调用或补全)。
代码实现与算法分析 (main.m)
main.m 是整个仿真的核心入口与执行脚本,其内部逻辑严格按照以下流程实现:
1. 系统参数初始化
代码首先定义了全局仿真参数和电机物理参数:
- 电机参数:配置了定子电阻 (Rs=1.2Ω)、d/q轴电感 (Ld=Lq=0.0085H,表贴式)、转动惯量、摩擦系数及极对数。
- 控制参数:设定直流母线电压为 311V,仿真总时长为 0.1s。
- 给定信号:设定初始目标转矩为 5.0 N.m,定子磁链给定幅值为 0.3 Wb。
- 滞环阈值:分别定义了转矩滞环宽度 (0.1) 和磁链滞环宽度 (0.01)。
2. 状态变量与存储预分配
- 初始化电机状态向量
[id, iq, omega_m, theta_m] 为零。 - 为了提高运行效率,对用于记录时间、三相电流、转矩、转速、磁链分量及扇区号的
data 结构体进行了内存预分配。 - 初始化磁链积分器和PI控制器的积分项。
3. 主仿真循环 (核心逻辑)
仿真采用
for 循环按时间步
Pars.Ts //迭代,模拟真实的数字控制系统与物理对象交互:
A. 电机物理模型 (Plant)
- 坐标变换:将上一时刻逆变器输出的 ABC 电压转换为 dq 轴电压。
- 微分方程求解:基于电压平衡方程,计算 $dI_d/dt$ 和 $dI_q/dt$;基于运动方程,计算转速变化率 $domega_m/dt$。
- 转矩计算:根据 $Te = 1.5 times nP times Psi_f times I_q$ 计算实际电磁转矩(表贴式电机无磁阻转矩)。
- 负载模拟:在 t > 0.02s 时,施加 2.0 N.m 的负载转矩,模拟突加负载工况。
- 状态更新:使用欧拉法(Euler method)更新电流、转速和转子位置角度,并对角度进行 $0-2pi$ 归一化。
- 传感器模拟:利用更新后的状态量反变换得到三相电流 $I_{abc}$,作为控制器的反馈输入。
B. DTC 控制器 (Controller)
- 磁链观测器 (电压模型):利用定子电压方程 $U = Ri + dpsi/dt$,通过离散积分估算定子磁链在 $alpha-beta$ 坐标系下的分量,并计算磁链幅值和相位角。
- 转矩估算:基于估算的磁链和测量的电流,利用叉乘公式计算估算转矩 $Te_est$。
- 速度外环处理:虽然代码中包含PI速度环的计算逻辑(计算出了
Te_ref_cal),但为了测试DTC内环的动态性能,实际逻辑强制使用了给定的转矩参考值。代码设定在 t > 0.05s 时,转矩指令由 5.0 N.m 阶跃至 8.0 N.m。 - 滞环比较器:
*
磁链滞环:计算磁链误差,采用两点式逻辑(h_psi = 1 增磁,0 减磁)。
*
转矩滞环:计算转矩误差,采用三点式逻辑(h_te = 1 增转矩,-1 减转矩,0 保持)。
- 十二扇区判断:根据观测到的磁链角度
theta_flux,将其除以 30度 ($pi/6$) 并取整,确定当前磁链矢量所处的扇区 (1~12)。 - 开关表查找:调用
get_12sector_voltage 函数(需外部定义),根据当前扇区和滞环输出状态,选择最优的电压矢量编号。
C. 逆变器模型
- 根据开关表输出的矢量编号,确定三相逆变器开关状态 (Sa, Sb, Sc)。
- 利用直流母线电压 $V_{dc}$ 和开关状态,重构出实际施加到电机端的三相电压 $V_a, V_b, V_c$,用于下一拍的电机模型计算。
D. 数据记录
- 采用降采样策略(每100步记录一次),将仿真过程中的关键变量(时间、电流、转矩、速度等)存入
data 结构体,便于后续分析。