PMSM_SMO_Sensorless_Control
项目简介
本项目实现了一个基于MATLAB脚本(.m文件)的永磁同步电机(PMSM)滑模观测器(SMO)无位置传感器控制仿真系统。项目摒弃了传统的Simulink模块搭建方式,完全通过编写MATLAB代码来实现离散时间域下的电机物理模型、FOC控制算法、滑模观测器及PLL锁相环算法。该模型主要用于验证SMO算法在动态负载和变速条件下的转子位置估算精度及系统的鲁棒性。
主要功能特性
- 纯代码仿真环境:不依赖Simulink工具箱,直接通过MATLAB脚本实现完整的数字控制系统与被控对象仿真。
- FOC 矢量控制:实现了包含速度环和电流环的双闭环控制架构,采用 $i_d=0$ 控制策略。
- 滑模观测器 (SMO):
* 利用电流观测误差构建滑模面。
*
Sigmoid 函数优化:使用连续的Sigmoid函数替代传统的开关符号函数(Sign),有效抑制了滑模固有的抖振现象。
*
反电动势重构:结合低通滤波器(LPF)从滑模控制量中提取反电动势信号。
- 锁相环 (PLL):集成软件锁相环,通过解析滤波后的反电动势,实时追踪转子的电角度与转速。
- 物理对象建模:内置基于电压方程和机械方程的PMSM离散化物理模型,用于模拟真实电机的响应。
- 工况模拟:自动生成分段变速指令和突加负载转矩,验证系统的动态性能。
系统要求
- MATLAB R2016a 或更高版本(仅需基础MATLAB许可证,无需额外Simulink工具箱)。
使用说明
- 确保MATLAB的工作路径包含本项目的脚本文件。
- 直接运行
main 函数即可启动仿真。 - 程序将自动执行以下步骤:
* 初始化电机与控制器参数。
* 执行时间步进仿真循环。
* 计算并记录仿真数据(电流、转速、角度、误差等)。
- 仿真结束后,数据存储在
Data 结构体中,可用于后续绘图分析(注:绘图代码需自行补充)。
核心算法与实现逻辑
本项目的主程序 main.m 包含完整的仿真流程,具体实现逻辑如下:
1. 参数配置与初始化
- 电机参数:配置了表贴式PMSM参数(Rs, Ld, Lq, Flux, Pn, J, B)。
- 仿真参数:设定采样/控制频率为 20kHz ($T_s = 50mu s$),总仿真时长为 0.8秒。
- 控制器参数:定义了速度环和电流环的PI增益,以及电压/电流的限幅值。
- SMO参数:配置滑模增益 $K_{slide}$,Sigmoid函数平滑因子 $a$,以及反电动势低通滤波器的截止频率(2000 rad/s)。
2. 外部工况生成
在仿真循环的每一步,根据当前时间自动生成控制指令:
- 转速指令:0-0.2s (50 rad/s) -> 0.2-0.5s (150 rad/s) -> 0.5-0.8s (100 rad/s)。
- 负载转矩:0-0.3s (0.5 N.m) -> 0.3s后 (2.0 N.m,模拟突加负载)。
3. FOC 控制算法实现
- 传感器采样:获取实际电流 $i_{abc}$ 并进行Park变换得到 $i_d, i_q$。此处使用SMO估算的相位 $theta_{est}$ 进行坐标变换,实现无感控制。
- 速度环:计算速度误差,通过PI控制器生成 $i_q$ 参考值,并进行限幅,$i_d$ 参考值设为0。
- 电流环:计算电流误差,通过PI控制器生成 $u_d, u_q$ 参考电压。
- 解耦与限幅:包含简化的电压前馈解耦,并根据直流母线电压 $V_{dc}$ 进行SVPWM圆形限幅。
- 反变换:利用估算角度将 $u_d, u_q$ 变换为静止坐标系下的 $u_alpha, u_beta$。
4. 电机物理模型仿真 (Plant Simulation)
为了验证控制效果,代码内部手动实现了电机的物理方程:
- 反电动势计算:基于真实机械角度和转速计算实际反电动势。
- 电流更新:使用显式欧拉法求解电压平衡方程 $di/dt = (u - Ri - e)/L$,更新实际电流状态。
- 机械运动:根据电磁转矩 $T_e$、负载转矩 $T_l$ 和摩擦系数,求解机械运动方程,更新真实的机械转速和位置。
5. 滑模观测器 (SMO) 设计
这是本项目的核心部分,用于估算反电动势:
- 电流观测器:建立电流观测模型,计算观测电流与实际电流的误差。
- 滑模控制律 (Sigmoid):为了减少高频抖振,采用Sigmoid函数
2/(1+exp(-a*s)) - 1 代替传统的 sign(s) 函数。 - 状态更新:根据滑模输出 $z_{alpha}, z_{beta}$ 修正估算电流。
- 反电动势提取:通过一阶低通滤波器(LPF)对 $z_{alpha}, z_{beta}$ 进行滤波,从而获得重构的反电动势 $e_{alpha_lf}, e_{beta_lf}$。
6. 锁相环 (PLL) 位置解算
- 相位误差检测:利用三角函数关系构造相位误差信号:$Err = -e_{alpha} cos(theta_{est}) - e_{beta} sin(theta_{est})$。
- PI调节:误差信号经过PI控制器得到估算电角速度 $omega_{est}$。
- 角度积分:对估算角速度进行积分得到估算电角度 $theta_{est}$,用于FOC变换。
7. 数据记录
代码预分配了内存,并在每一步记录关键数据,包括:
- 实际转速 vs 估算转速
- 实际角度 vs 估算角度
- 实际电流
- 估算的反电动势
注意事项
- 代码中假设了表贴式电机 ($L_d = L_q$),若用于内嵌式电机可能需要调整模型方程。
- 程序末尾的数据记录部分包含角度归一化处理及误差计算,用于后续分析观测器的跟踪精度。
get_motor_currents, park_trans, inv_park_trans 为辅助函数,但在主逻辑中被调用,需确保这些逻辑在路径下或已合并在脚本中(注:本说明仅针对提供的main.m内容)。