
一句话介绍: 这套 MATLAB / Simulink 程序以永磁同步电机三相电压、电流为观测输入,先转换到 αβ 静止坐标系,再利用滑膜观测器估算电流和反电动势,通过反电动势幅值、反正切关系得到电机转速与转子位置,并把估计结果真正反馈到 FOC 电流变换和转速闭环中,最后输出转速估计值与实际值、转速误差、转子位置估计值与实际值以及位置误差。
永磁同步电机做矢量控制时,有两个量非常关键:
转子转得多快?转子现在转到什么位置?
最直接的办法当然是安装编码器或旋转变压器。
但如果希望研究无位置传感器控制,就需要从已经能够测量的电压、电流中把转速和位置“反推”出来。
当前程序采用的完整链路是:
三相电压/电流 → αβ 坐标变换 → 滑膜电流观测 → 开关量等效控制 → 低通滤波得到反电动势 → 估算电角速度与电角度 → FOC 反馈控制 → SVPWM → 逆变器 → PMSM
与此同时,电机模型自身给出的真实转速和真实转子角度并没有拿去替代观测器参与控制,而主要用于最后的估计效果对比。
这正是这套模型最值得看的地方:
它不是单独画一个“估计曲线”,而是把滑膜观测器得到的转速和位置真正接回了电机控制闭环。
1. 当前工程里真正有哪些关键文件?
整个工程的核心非常集中。
文件 | 主要作用 |
|---|---|
PMSM_SMO_atan.slx | 主 Simulink 模型,包含 PMSM、FOC、SVPWM、逆变器以及滑膜观测器 |
pmsm_plot.m | 仿真结束后绘制转速、转速误差、转子位置和位置误差 |
PMSM_SMO_atan.slxc | Simulink 编译缓存文件,不是主要算法源码 |
slprj/... | Simulink 自动生成的仿真缓存目录 |
因此真正需要理解的主线就是:
PMSM_SMO_atan.slx负责仿真和数据输出 →pmsm_plot.m负责结果绘图
模型文件记录的版本信息为 MATLAB / Simulink R2013a,模型内部保存字符编码为 GBK。
2. 当前仿真的永磁同步电机是什么参数?
模型使用 SimPowerSystems / powerlib 中的 Permanent Magnet Synchronous Machine。
当前主要参数如下。
项目 | 当前值 |
|---|---|
定子电阻 R | 2.875 Ω |
d 轴电感 Ld | 8.5 mH |
q 轴电感 Lq | 8.5 mH |
永磁体磁链 ψf | 0.175 V·s |
极对数 p | 4 |
转动惯量 J | 1×10⁻³ kg·m² |
粘性摩擦系数 | 0 |
直流母线电压 | 311 V |
转速给定 | 1000 r/min |
仿真结束时间 | 0.05 s |
求解器 | ode3 |
固定步长 | 2×10⁻⁷ s |
SVPWM 周期 | 1×10⁻⁴ s |
负载转矩 TL 使用 Step 模块,但当前设置在 0.05 s 前后均为 0。
由于整个模型也恰好仿真到 0.05 s,因此当前默认实验实际上是在:
1000 r/min 给定、零负载条件下观察滑膜观测器的转速和位置估算过程。
3. 这套程序的控制闭环是怎样连起来的?
程序外层仍然是一套典型的 PMSM 双闭环矢量控制结构,但关键区别在于反馈量来自滑膜观测器。
转速环首先计算:
eₙ = n − n̂*
其中:
n*:1000 r/min 转速给定;
n̂:滑膜观测器估算出来的机械转速。
转速误差进入 PI 控制器以后形成 q 轴电流给定:
转速误差 → PI → i*q
当前 d 轴电流给定直接设为:
i*d = 0
随后实际三相电流经过 dq 变换得到 id、iq,与给定值比较:
i*d − id → d 轴电流 PI
i*q − iq → q 轴电流 PI
得到 ud、uq 后再执行逆 Park 变换:
ud、uq + 估计转子角度 → uα、uβ
接着:
uα、uβ → SVPWM → IGBT 三相逆变桥 → PMSM
这里有一个很重要的工程事实:
真实转速和真实转子位置没有拿去作为 FOC 的闭环反馈量,控制所使用的是 SMO 输出的估计转速和估计位置。
所以它确实构成了一个基于滑膜观测器的无位置传感器仿真闭环。
4. 为什么观测器先把三相量变成 αβ 两相量?
滑膜观测器没有直接处理 ia、ib、ic 三相电流,而是先把三相变量转换到 αβ 静止坐标系。
当前程序中电流变换为:
iα = (2iₐ − iᵦ − i𝚌) / 3
iβ = (iᵦ − i𝚌) / √3
三相电压也采用相同形式:
uα = (2uₐ − uᵦ − u𝚌) / 3
uβ = (uᵦ − u𝚌) / √3
这样,原来的三相交流变量就被压缩成两个互相正交的静止坐标分量。
对当前滑膜观测器来说,这一步的意义非常直接:
α 轴和 β 轴可以分别建立电流状态方程,随后再从两个轴上的等效滑模控制量中恢复反电动势。
因此当前真正送入 SMO 子系统的输入只有两组:
Iαβ + Uαβ
5. 滑膜观测器到底怎样估算电流?
SMO 内部又包含一个真正执行滑模计算的 SMO 子系统。
它首先对 α、β 两个轴分别建立电流观测状态。
以 α 轴为例,可以把当前模块连接关系写成:
dîα/dt = uα/L − (R/L)îα − zα/L
β 轴同理:
dîβ/dt = uβ/L − (R/L)îβ − zβ/L
其中:
îα、îβ:观测器内部估算电流;
iα、iβ:电机实际测量电流;
R = 2.875 Ω;
L = 8.5 mH;
zα、zβ:滑膜开关控制量。
当前程序先计算估计电流和实际电流之间的差:
sα = îα − iα
sβ = îβ − iβ
然后使用 Sign 模块生成符号函数,再乘以滑膜增益:
zα = Ksw·sign(sα)
zβ = Ksw·sign(sβ)
模型中的:
Ksw = 200
这就是整个滑膜观测器最核心的一层。
直观上可以理解为:
只要估计电流偏离实际电流,符号函数就会根据误差方向产生较强的切换修正,让估计状态不断被“推回”实际电流附近。
6. 电流估计以后,反电动势从哪里得到?
滑膜观测器真正想得到的并不只是 îα、îβ。
因为 PMSM 的转子速度和转子位置更直接地隐藏在:
反电动势 Eα、Eβ
里面。
当滑模运动建立以后,前面的开关控制量 zα、zβ 可以用来逼近反电动势。
但 sign() 带来的信号具有明显开关特性,如果直接送进转速和角度计算,波形会非常尖锐。
因此程序分别给两个通道增加了一阶低通滤波器:
G(s) = 20000 / (s + 20000)
处理链变成:
电流估计误差 → sign → Ksw=200 → 开关控制量 → 一阶低通滤波 → Êα、Êβ
其中滤波器截止参数采用:
ωc = 20000
所以这一部分实际上同时完成了两件事:
利用滑模切换量恢复反电动势信息;
抑制滑模切换产生的高频分量,为后面的角度和速度计算提供更平滑的输入。
7. 反电动势怎样变成电机转速?
对于当前正弦反电动势 PMSM,反电动势矢量幅值与电角速度、永磁体磁链之间存在直接关系。
程序先计算:
|Ê| = √(Êα² + Êβ²)
随后利用当前电机磁链:
ψf = 0.175 V·s
得到估计电角速度:
ω̂e = |Ê| / 0.175
也就是说:
反电动势越大,在磁链固定时,对应的电角速度就越高。
不过 ω̂e 还是电角速度,而最后绘图需要的是机械转速 r/min。
当前电机有:
p = 4 对极
因此模型使用增益:
15 / (2π)
完成换算:
n̂ = ω̂e × 15 / (2π)
这实际上就是:
电角速度 → 除以 4 得机械角速度 → rad/s 转 r/min
真实电机转速则由电机模型直接输出机械角速度,并通过:
30 / π
转换成 r/min。
因此最后能够在同一个坐标尺度下比较:
实际机械转速 n ↔ 估计机械转速 n̂
8. 转子位置又是怎样估算出来的?
有了 Êα、Êβ 两个正交反电动势分量以后,转子电角度可以从它们的空间方向得到。
当前 Arctan_function 并不是一个单独的普通 atan。
它主要执行三件事:
根据 atan((-Êα)/Êβ) 得到反电动势矢量对应角度;根据 Êβ 的符号进行象限修正;增加与低通滤波相对应的相位补偿。
其中相位补偿部分使用:
Δθ = atan(ωc / ω̂e)
当前:ωc = 20000
程序把这一补偿量与前面的反正切角度相加,形成估计角度。
为了避开启动初期反电动势尚未建立时的角度输出,模型还设置了一个时间开关:
0~0.001 s:位置输出为 0
0.001 s 以后:输出滑膜观测器计算角度
而真正进入 FOC 坐标变换以前,模型还对估计角度进行了:
θcontrol = θ̂ − π/2
的坐标参考修正。
因此位置估计在当前程序中并不是孤立的显示结果,而是直接决定了后续 dq 变换和逆 Park 变换使用的旋转坐标方向。
9. 估计位置怎样真正参与 FOC 控制?
这一点非常适合判断一个“无位置传感器模型”是不是真的把观测器接进去了。
当前模型的连接关系非常明确:
SMO 估计角度 → 减 π/2 → abc/dq 变换
同时:
SMO 估计角度 → 减 π/2 → 逆 Park 变换
也就是说:
实际三相电流向 d、q 轴投影时,用的是估计位置;
ud、uq 转回 αβ 电压时,用的还是估计位置。
与此同时:
SMO 估计速度 → r/min 换算 → 转速反馈 PI
所以观测器的两个主要结果都有实际用途:
估计转速 → 转速环
估计位置 → 坐标变换
真实转速和真实位置则主要留在旁路,用于结果验证。
这比“观测器只负责画图”的模型更能体现无位置传感器控制的实际工作链。
10. 速度环和电流环当前用了什么参数?
转速 PI 子系统中:
Kp = 1、Ki = 0.2
PI 输出作为 q 轴电流给定,并限制在:
−21 A ~ 21 A
也就是:
1000 r/min − n̂ → 速度 PI → i*q
d 轴给定则保持:i*d = 0 A
两个电流环采用相同参数生成方式:
Kp,current = L × 2000
Ki,current = R × 2000
代入当前电机参数:
Kp,current = 8.5×10⁻³ × 2000 = 17
Ki,current = 2.875 × 2000 = 5750
d、q 两轴电压 PI 输出均限制在:
−350 V ~ 350 V
因此当前控制链可以概括成:
速度误差 → 速度 PI → iq 给定 → dq 电流误差 → 电流 PI → ud/uq → 逆 Park → uα/uβ
11. SVPWM 和逆变器在这里负责什么?
电流控制器最终算出来的是连续的 uα、uβ 电压指令。
实际三相电机不能直接使用这两个连续控制量,因此模型后面还配置了完整的 SVPWM_control。
当前 SVPWM 使用:T = 0.0001 s
也就是 100 μs 的开关周期,对应约:10 kHz
直流母线:Vdc = 311 V
SVPWM 子系统依次完成:
扇区判断 → 有效矢量作用时间计算 → 三相比较时间生成 → PWM 脉冲输出
脉冲最终驱动 Universal Bridge。
逆变桥器件类型设置为:IGBT / Diodes
所以整个功率链并不是简单的理想三相电压源,而是:
311 V 直流电源 → SVPWM → IGBT 三相桥 → PMSM
这让观测器接收到的电机端电压、电流和控制器输出之间形成了完整闭环。
12. 程序最后具体输出哪四组结果?
模型中的多个 Scope 已经打开了 Save to Workspace。
与项目说明直接对应的四组工作区变量是:
工作区变量 | 内容 |
|---|---|
wm | 实际转速与估计转速 |
wme | 转速估计误差 |
The | 实际位置与估计位置 |
Thee | 位置估计误差 |
仿真结束后执行 pmsm_plot.m,程序依次绘制四幅图。
第一幅:电机转速估计值与实际值,单位 r/min
第二幅:电机转速估计误差,单位 r/min
第三幅:电机转子位置估计值与实际值,单位 rad
第四幅:电机转子位置估计误差,单位 rad
脚本中还保留了一段已经注释掉的第五幅图代码,原本用于绘制:
反电动势 Eα 的估计值
但它当前不会执行,因此正式输出仍以四组转速/位置结果为主。
还有一个值得注意的当前实现细节:
用于位置对比绘图的实际角度和估计角度,在进入 The、Thee 前均经过了 mod(·, π/4) 处理。
其中电机模型输出的机械转子角首先乘以极对数 4,再进入取模模块。因此当前位置曲线更准确地说,是经过程序内部周期折叠处理后的电角度对比,而不是无限累加的原始机械转子角。
13. 当前资料能不能直接证明“比传统观测器精度高”?
项目辅助说明中给出了:
“精度比传统观测器精度高。”
但当前程序压缩包中实际只有这一套 PMSM_SMO_atan.slx 滑膜观测器模型,没有同时提供:
一个传统观测器对照模型;
相同工况下两种观测器的误差数据;
RMSE、MAE、最大误差等量化指标;
专门执行精度比较的脚本。
因此依据当前工程能够确认的是:
程序确实同时输出估计值、实际值和估计误差,可以直接观察 SMO 的转速与位置跟踪效果。
但仅依据当前压缩包,不能进一步写成:
“误差降低了多少百分比”
或:
“相对于某种传统观测器提升了多少精度”
否则就超出了现有程序能够直接复核的范围。
14. 这套程序适合用在哪里?
程序把:
电流观测 → 滑模面 → sign 开关控制 → 低通滤波 → 反电动势 → 转速/位置
全部拆成了可打开的 Simulink 模块。
因此它很适合用来理解:
SMO 为什么能够从电机电压、电流中恢复转子运动信息。
观测器结果不是旁路输出,而是真正参与:
转速反馈;abc/dq 变换;逆 Park 变换。
所以可以围绕完整闭环研究:
观测误差怎样进一步影响电流控制和电机转速响应。
Ksw=200 和 ωc=20000 都直接暴露在模型中。
改变它们以后,可以继续观察:
滑模跟踪能力 ↔ 高频切换 ↔ 反电动势平滑程度 ↔ 转速/位置估计质量
之间的关系。
模型已经包含:
PMSM + 双闭环 FOC + SVPWM + IGBT 逆变桥 + SMO
因此适合在控制器上硬件以前,先进行算法结构和参数趋势验证。
不过当前工程仍属于 Simulink 仿真模型。
它没有表现出完整嵌入式部署中常见的 ADC 量化、传感器噪声、采样延迟、死区补偿、参数在线辨识以及低速特殊启动策略等工程环节,因此不应直接把它描述成已经可以部署到实际电机控制器上的成品系统。
15. 哪些参数最值得修改?
当前模型里真正值得做实验的,不是所有常数,而是下面这些会直接改变观测和闭环行为的参数。
参数 | 当前值 | 为什么值得改 | 调整后的主要影响 |
|---|---|---|---|
Ksw | 200 | 决定滑模切换修正强度 | 增大可强化到达滑模面的能力,但切换和高频成分也可能更加明显 |
ωc | 20000 | 决定反电动势低通滤波与相位补偿 | 改变 Êα、Êβ 的平滑性、动态响应及位置补偿 |
速度 PI Kp / Ki | 1 / 0.2 | 直接决定 1000 r/min 转速闭环响应 | 影响上升过程、超调和 iq 给定变化 |
电流环系数 | 2000 | 当前由 Kp=L×2000、Ki=R×2000 生成 | 改变 d/q 电流环响应速度和控制电压变化 |
转速给定 | 1000 r/min | 是最直接的工况切换入口 | 可测试不同转速下反电动势幅值和 SMO 估算表现 |
其中 ωc=20000 在当前工程中不仅出现在两个低通滤波器里,还在 Arctan_function 中作为角度补偿参数使用。
因此如果修改这一带宽,最好同步检查这两处设置,而不是只改其中一个数值。
16. 怎么运行这套程序?
PMSM_SMO_atan.slx 的模型初始化函数已经设置:
R = 2.875、L = 8.5e-3
运行时首先保证 PMSM_SMO_atan.slx 和 pmsm_plot.m 位于 MATLAB 当前目录或搜索路径中。
然后打开:
PMSM_SMO_atan.slx
模型依赖 Simulink,以及提供 powerlib 中 PMSM、Universal Bridge、Three-Phase V-I Measurement、DC Voltage Source、powergui 等模块的电力电子仿真组件。旧版本中通常对应 SimPowerSystems;在较新的 MATLAB 产品体系中,对应 Simscape Electrical 中的相关 Specialized Power Systems 功能。
直接运行模型后,当前默认仿真时间为:0~0.05 s
转速实际值/估计值 → 转速误差 → 位置实际值/估计值 → 位置误差
17. 一句话看懂这个项目
这是一个 MATLAB / Simulink 永磁同步电机滑膜观测器无位置传感器控制模型:当前 PMSM 使用 R=2.875 Ω、Ld=Lq=8.5 mH、磁链0.175 V·s和4对极参数,在311 V直流母线、1000 r/min给定和零负载条件下运行;三相电压、电流先转换到 αβ 坐标系,SMO 以 Ksw=200 对估计电流和实际电流的偏差实施滑模切换控制,再通过 20000/(s+20000) 低通滤波恢复 Êα、Êβ,由反电动势幅值估算转速、由反正切和相位补偿估算转子位置;估计转速真正进入速度 PI,估计位置真正进入 dq/Park 坐标变换,最后由pmsm_plot.m输出转速实际值与估计值、转速误差、位置实际值与估计值以及位置误差,因此最适合用于 PMSM 滑膜观测器、无位置传感器 FOC 和 SMO 参数影响规律的仿真教学与方案验证。