一、全维状态观测器(Full-order State Observer)
1. 背景与动机
在现代控制理论中,状态反馈控制 (如极点配置、LQR)要求系统所有状态变量都可测。但现实中,很多状态(如电机内部磁链、速度、负载扰动等)无法直接测量。此时就需要状态观测器来重构这些不可测状态。
2. 基本原理
考虑一个线性定常系统:
{x˙=Ax+Buy=Cx \begin{cases} \dot{x} = Ax + Bu \\ y = Cx \end{cases} {x˙=Ax+Buy=Cx
其中 x∈Rnx \in \mathbb{R}^nx∈Rn 是状态向量,uuu 是输入,yyy 是输出。
全维状态观测器构造如下:
x^˙=Ax^+Bu+L(y−Cx^) \dot{\hat{x}} = A\hat{x} + Bu + L(y - C\hat{x}) x^˙=Ax^+Bu+L(y−Cx^)
其中 x^\hat{x}x^ 是状态估计值,LLL 是观测器增益矩阵。
定义估计误差 e=x−x^e = x - \hat{x}e=x−x^,则误差动态为:
e˙=(A−LC)e \dot{e} = (A - LC)e e˙=(A−LC)e
若能选择 LLL 使得 A−LCA - LCA−LC 的所有特征值具有负实部(即系统稳定),则 e→0e \to 0e→0,即 x^→x\hat{x} \to xx^→x。
3. 设计条件
- 充分条件 :系统 (A,C)(A, C)(A,C) 完全能观测。
- 充要条件:不能观测子系统是渐近稳定的。
- 设计方法 :通常通过极点配置 (Ackermann 公式或 place 函数)选择 LLL,使观测器极点比原系统更快(一般快 2~5 倍),以保证快速收敛。
4. 分离原理(Separation Principle)
当将状态反馈 u=−Kx^u = -K\hat{x}u=−Kx^ 与观测器结合时,闭环系统极点由两部分独立决定:
- 控制部分:A−BKA - BKA−BK
- 观测部分:A−LCA - LCA−LC
这使得控制器和观测器可以分别设计,极大简化工程实现。
二、永磁同步电机(PMSM)模型与 id=0 控制
1. PMSM 数学模型(dq 同步旋转坐标系下)
电压方程:
ud=Rsid−ωeLqiq+dψddtuq=Rsiq+ωeLdid+ωeψf+dψqdt \begin{aligned} u_d &= R_s i_d - \omega_e L_q i_q + \frac{d\psi_d}{dt} \\ u_q &= R_s i_q + \omega_e L_d i_d + \omega_e \psi_f + \frac{d\psi_q}{dt} \end{aligned} uduq=Rsid−ωeLqiq+dtdψd=Rsiq+ωeLdid+ωeψf+dtdψq
磁链方程:
ψd=Ldid,ψq=Lqiq+ψf \psi_d = L_d i_d,\quad \psi_q = L_q i_q + \psi_f ψd=Ldid,ψq=Lqiq+ψf
电磁转矩方程:
Te=32p[ψfiq+(Ld−Lq)idiq] T_e = \frac{3}{2} p \left[ \psi_f i_q + (L_d - L_q) i_d i_q \right] Te=23p[ψfiq+(Ld−Lq)idiq]
其中:
- ppp:极对数
- ψf\psi_fψf:永磁体磁链
- Ld,LqL_d, L_qLd,Lq:d/q 轴电感
2. id=0 控制策略
-
适用对象 :面贴式 PMSM(SPMSM),其 Ld=LqL_d = L_qLd=Lq,故转矩简化为:
Te=32pψfiq T_e = \frac{3}{2} p \psi_f i_q Te=23pψfiq即转矩仅由 iqi_qiq 决定。
-
控制目标 :令 id=0i_d = 0id=0,从而:
- 解耦励磁与转矩分量
- 最大化功率因数
- 简化控制器设计(只需调节 iqi_qiq)
-
实现方式 :采用双闭环 PI 控制:
- 外环:速度环 → 输出 iq∗i_q^*iq∗
- 内环:电流环 → 调节 id,iqi_d, i_qid,iq 跟踪指令(id∗=0i_d^* = 0id∗=0)
注:对于内置式 PMSM(IPMSM,Ld≠LqL_d \ne L_qLd=Lq),更优策略是最大转矩电流比(MTPA),而非 id=0。
三、Matlab/Simulink 仿真方法
1. 仿真目标
- 验证 id=0 控制下 PMSM 的动态性能
- 设计全维观测器估计不可测状态(如转速、负载转矩)
- 实现无传感器或抗扰控制
2. 典型仿真结构(Simulink)
- 电机本体模型:使用 Simscape Electrical 中的 PMSM 模块,或自定义 dq 方程
- 坐标变换模块 :Clark + Park 变换(需转子位置 θ\thetaθ)
- 控制器 :
- 速度 PI → iq∗i_q^*iq∗
- 电流 PI(id∗=0i_d^*=0id∗=0, iq∗i_q^*iq∗)→ ud,uqu_d, u_qud,uq
- SVPWM 模块生成三相电压
- 观测器模块 (可选):
- Luenberger 观测器 :估计状态 x=[id,iq,ω]Tx = [i_d, i_q, \omega]^Tx=[id,iq,ω]T
- 扩展卡尔曼滤波 (EKF)或滑模观测器(SMO):用于无位置传感器控制
3. 关键技巧
- 观测器极点应比电流环快,但不宜过快(避免噪声放大)
- 在 id=0 控制中,需确保 Park 变换角度准确(否则 id≠0i_d \ne 0id=0,产生耦合)
- 可加入负载转矩观测器(如 LESO)提升抗扰能力
✅ 完整 MATLAB 脚本:PMSM id=0 Control with Luenberger Observer
matlab
%% PMSM id=0 Control with Luenberger Observer - Complete Simulation
% Author: Assistant
% Date: 2026-04-23
% Description: Simulates PMSM speed-current double-loop control with state observer
clear; clc; close all;
%% 1. 电机参数 (SPMSM: Surface-mounted PMSM)
Rs = 1.2; % 定子电阻 [Ohm]
Ld = 8.5e-3; % d轴电感 [H]
Lq = 8.5e-3; % q轴电感 [H] (Ld = Lq for SPMSM)
psi_f = 0.175; % 永磁体磁链 [Wb]
J = 0.0008; % 转动惯量 [kg·m²]
B = 0.001; % 阻尼系数 [N·m·s/rad]
p = 4; % 极对数
%% 2. 控制器参数
% 电流环 PI 参数 (内环)
Kp_id = 10; Ki_id = 1000;
Kp_iq = 10; Ki_iq = 1000;
% 速度环 PI 参数 (外环)
Kp_w = 0.5; Ki_w = 20;
% 仿真设置
T_end = 0.5; % 仿真时间 [s]
Ts = 1e-5; % 采样时间 [s]
t = 0:Ts:T_end;
%% 3. 初始化变量
% 真实状态
i_d = zeros(size(t)); i_q = zeros(size(t));
omega = zeros(size(t)); theta = zeros(size(t));
T_e = zeros(size(t));
% 观测器状态估计
i_d_hat = zeros(size(t)); i_q_hat = zeros(size(t)); omega_hat = zeros(size(t));
% 控制器积分项
int_id = 0; int_iq = 0; int_w = 0;
% 参考值
omega_ref = zeros(size(t));
omega_ref(t >= 0.1 & t < 0.3) = 100; % 100 rad/s (≈955 rpm)
omega_ref(t >= 0.3) = 200; % 200 rad/s (≈1910 rpm)
T_L = zeros(size(t)); % 负载转矩
T_L(t >= 0.25) = 0.5; % 0.5 N·m step at 0.25s
% 初始状态
i_d(1) = 0; i_q(1) = 0; omega(1) = 0; theta(1) = 0;
i_d_hat(1) = 0; i_q_hat(1) = 0; omega_hat(1) = 0;
%% 4. 设计 Luenberger 观测器
% 线性化状态空间模型 (在工作点附近,忽略反电势耦合项用于观测器设计)
A = [-Rs/Ld, 0, 0;
0, -Rs/Lq, -psi_f/Lq;
0, (3/2)*p*psi_f/J, -B/J];
B_u = [1/Ld, 0;
0, 1/Lq;
0, 0]; % 输入为 [u_d; u_q]
B_TL = [0; 0; -1/J]; % 负载转矩扰动
C = [1 0 0;
0 1 0]; % 输出为 [i_d; i_q]
% 检查能观性
Ob = obsv(A, C);
if rank(Ob) < 3
error('系统不能观!');
end
% 配置观测器极点 (比电流环快3-5倍)
poles_obs = [-1500, -2000, -2500];
L = place(A', C', poles_obs)'; % Luenberger 增益
disp('Luenberger Observer Gain L:');
disp(L);
%% 5. 主仿真循环
for k = 1:length(t)-1
% --- 速度环 (外环) ---
e_w = omega_ref(k) - omega_hat(k); % 使用观测器估计的速度
int_w = int_w + e_w * Ts;
i_q_ref = Kp_w * e_w + Ki_w * int_w;
% 限幅 (防止过流)
i_q_ref = max(min(i_q_ref, 10), -10);
% --- 电流环 (内环) ---
% d轴 (id=0)
e_id = 0 - i_d_hat(k);
int_id = int_id + e_id * Ts;
v_d = Kp_id * e_id + Ki_id * int_id;
% q轴
e_iq = i_q_ref - i_q_hat(k);
int_iq = int_iq + e_iq * Ts;
v_q = Kp_iq * e_iq + Ki_iq * int_iq;
% 解耦补偿 (前馈)
u_d = v_d - omega_hat(k) * Lq * i_q_hat(k);
u_q = v_q + omega_hat(k) * (Ld * i_d_hat(k) + psi_f);
% --- 真实电机模型 (连续系统,用欧拉法离散) ---
di_d_dt = (-Rs * i_d(k) + u_d + omega(k) * Lq * i_q(k)) / Ld;
di_q_dt = (-Rs * i_q(k) + u_q - omega(k) * (Ld * i_d(k) + psi_f)) / Lq;
domega_dt = ((3/2)*p*(psi_f*i_q(k) + (Ld-Lq)*i_d(k)*i_q(k)) - T_L(k) - B*omega(k)) / J;
dtheta_dt = omega(k);
i_d(k+1) = i_d(k) + di_d_dt * Ts;
i_q(k+1) = i_q(k) + di_q_dt * Ts;
omega(k+1) = omega(k) + domega_dt * Ts;
theta(k+1) = theta(k) + dtheta_dt * Ts;
T_e(k+1) = (3/2)*p*(psi_f*i_q(k+1) + (Ld-Lq)*i_d(k+1)*i_q(k+1));
% --- Luenberger 观测器 (离散化) ---
x_hat = [i_d_hat(k); i_q_hat(k); omega_hat(k)];
u_vec = [u_d; u_q];
% 连续观测器动态
dx_hat = A * x_hat + B_u * u_vec + B_TL * T_L(k) + L * ([i_d(k); i_q(k)] - C * x_hat);
% 欧拉离散更新
x_hat_new = x_hat + dx_hat * Ts;
i_d_hat(k+1) = x_hat_new(1);
i_q_hat(k+1) = x_hat_new(2);
omega_hat(k+1) = x_hat_new(3);
end
%% 6. 绘图
figure('Position', [100, 100, 1200, 800]);
subplot(3,2,1);
plot(t, omega_ref, 'k--', 'LineWidth', 1.5); hold on;
plot(t, omega, 'b', 'LineWidth', 1.5);
xlabel('Time (s)'); ylabel('Speed (rad/s)');
title('Rotor Speed'); legend('Reference', 'Actual');
grid on;
subplot(3,2,2);
plot(t, T_e, 'r', 'LineWidth', 1.5);
xlabel('Time (s)'); ylabel('Torque (N·m)');
title('Electromagnetic Torque');
grid on;
subplot(3,2,3);
plot(t, i_d, 'b', 'LineWidth', 1.5); hold on;
plot(t, zeros(size(t)), 'k--');
xlabel('Time (s)'); ylabel('i_d (A)');
title('d-axis Current (should be ~0)');
grid on;
subplot(3,2,4);
plot(t, i_q, 'm', 'LineWidth', 1.5);
xlabel('Time (s)'); ylabel('i_q (A)');
title('q-axis Current');
grid on;
subplot(3,2,5);
plot(t, omega, 'b', 'LineWidth', 1.5); hold on;
plot(t, omega_hat, 'g--', 'LineWidth', 1.5);
xlabel('Time (s)'); ylabel('Speed (rad/s)');
title('Speed Estimation (Observer)');
legend('Actual', 'Estimated');
grid on;
subplot(3,2,6);
plot(t, i_d - i_d_hat, 'c', 'LineWidth', 1.5); hold on;
plot(t, i_q - i_q_hat, 'm', 'LineWidth', 1.5);
xlabel('Time (s)'); ylabel('Estimation Error (A)');
title('Current Estimation Error');
legend('i_d error', 'i_q error');
grid on;
sgtitle('PMSM id=0 Control with Luenberger Observer Simulation');
%% 7. 性能指标 (可选)
steady_state_error = abs(omega(end) - omega_ref(end));
fprintf('\n稳态速度误差: %.4f rad/s\n', steady_state_error);
fprintf('观测器最终速度误差: %.4f rad/s\n', abs(omega(end) - omega_hat(end)));
🔍 脚本说明
✅ 功能亮点:
- 真实电机模型:使用非线性 dq 方程进行仿真。
- id=0 控制 :强制 id=0i_d = 0id=0,仅通过 iqi_qiq 控制转矩。
- 双闭环 PI :
- 外环:速度 → iq∗i_q^*iq∗
- 内环:电流 → ud,uqu_d, u_qud,uq
- Luenberger 观测器 :
- 估计 id,iq,ωi_d, i_q, \omegaid,iq,ω
- 使用真实电流作为反馈校正
- 动态测试 :
- 速度阶跃(100 → 200 rad/s)
- 负载突变(0 → 0.5 N·m)
⚙️ 如何使用:
- 将代码保存为
pmsm_id0_observer.m - 在 MATLAB 中运行
- 查看 6 个子图的仿真结果
📈 预期结果:
- id≈0i_d \approx 0id≈0
- 速度快速跟踪指令
- 观测器估计值与真实值高度一致(误差 < 1%)
📘 一、整体目标与背景
✅ 控制任务
- 对象:面贴式永磁同步电机(SPMSM)
- 目标 :在仅测量定子电流 (id,iqi_d, i_qid,iq)的前提下,实现:
- 高性能速度控制(双闭环:速度 + 电流)
- 无速度传感器运行 (转速 ω\omegaω 不可测,需估计)
- 强抗负载扰动能力
✅ 技术路线
- id=0 矢量控制:解耦励磁与转矩,简化控制
- Luenberger 全维状态观测器 :估计不可测状态(ω^\hat{\omega}ω^)
- 双闭环 PI 控制器:工业标准结构
- 前馈解耦补偿:消除 dq 轴耦合干扰
这是现代伺服驱动、电动汽车电控系统的经典方案。
📗 二、代码逐段深度解析
🔹 第 1 段:清除环境与注释
matlab
clear; clc; close all;
clear:清除工作区变量,避免历史数据干扰clc:清空命令窗口close all:关闭所有图形窗口,保证绘图干净
工程习惯:每次仿真前重置环境,确保可重复性。
🔹 第 2 段:电机参数定义(物理建模基础)
matlab
Rs = 1.2; % 定子电阻 [Ohm]
Ld = 8.5e-3; % d轴电感 [H]
Lq = 8.5e-3; % q轴电感 [H] (Ld = Lq for SPMSM)
psi_f = 0.175; % 永磁体磁链 [Wb]
J = 0.0008; % 转动惯量 [kg·m²]
B = 0.001; % 阻尼系数 [N·m·s/rad]
p = 4; % 极对数
🧠 物理意义详解:
| 参数 | 物理含义 | 影响 |
|---|---|---|
| RsR_sRs | 定子绕组铜损 | 决定电流环带宽上限(f∝Rs/Lf \propto R_s/Lf∝Rs/L) |
| Ld,LqL_d, L_qLd,Lq | dq 轴同步电感 | 若 Ld=LqL_d = L_qLd=Lq → SPMSM;若 Ld<LqL_d < L_qLd<Lq → IPMSM |
| ψf\psi_fψf | 永磁体产生的主磁链 | 决定反电动势大小:eq=ψfωe_q = \psi_f \omegaeq=ψfω |
| JJJ | 转子+负载转动惯量 | 惯量越大,加速越慢,速度环响应越迟钝 |
| BBB | 机械阻尼(摩擦+风阻) | 影响稳态误差,通常较小 |
| ppp | 极对数 | 将电角速度 ωe=pωm\omega_e = p \omega_mωe=pωm |
⚠️ 关键假设 :此脚本针对 SPMSM (Ld=LqL_d = L_qLd=Lq),因此电磁转矩简化为:
Te=32pψfiq T_e = \frac{3}{2} p \psi_f i_q Te=23pψfiq------转矩仅由 iqi_qiq 决定,这是 id=0 控制成立的前提。
🔹 第 3 段:控制器参数与仿真设置
matlab
% 电流环 PI 参数 (内环)
Kp_id = 10; Ki_id = 1000;
Kp_iq = 10; Ki_iq = 1000;
% 速度环 PI 参数 (外环)
Kp_w = 0.5; Ki_w = 20;
T_end = 0.5; % 仿真时间 [s]
Ts = 1e-5; % 采样时间 [s] → 100 kHz
t = 0:Ts:T_end;
🧠 控制理论解析:
1. 双闭环结构
- 外环(速度环) :带宽较低(~10--50 Hz),输出为 iq∗i_q^*iq∗
- 内环(电流环) :带宽较高(~500--2000 Hz),快速跟踪 id∗,iq∗i_d^*, i_q^*id∗,iq∗
分离原理:内外环可独立设计,因电流环远快于速度环。
2. PI 参数整定逻辑
- 电流环 :高比例增益(KpK_pKp)提升响应速度,积分项(KiK_iKi)消除静差
- 典型关系:Ki≈Kp/τK_i \approx K_p / \tauKi≈Kp/τ,τ\tauτ 为期望时间常数
- 速度环:增益较低,避免激发机械谐振
💡 此处参数为示例值,实际需通过频域分析 (如 Bode 图)或极点配置整定。
3. 采样时间 Ts=10 μsT_s = 10\ \mu sTs=10 μs
- 对应数字控制器中断周期
- 需满足 香农采样定理 :fs>2fmaxf_s > 2 f_{\text{max}}fs>2fmax
- 电流环带宽 ~1 kHz → fs>2f_s > 2fs>2 kHz,此处 100 kHz 足够
🔹 第 4 段:参考信号与负载设定(测试场景)
matlab
omega_ref = zeros(size(t));
omega_ref(t >= 0.1 & t < 0.3) = 100; % 100 rad/s
omega_ref(t >= 0.3) = 200; % 200 rad/s
T_L = zeros(size(t));
T_L(t >= 0.25) = 0.5; % 0.5 N·m step at 0.25s
🧠 测试用例设计思想:
| 时间区间 | 操作 | 目的 |
|---|---|---|
| 0--0.1 s | 启动 | 检验启动性能(是否超调、振荡) |
| 0.1--0.25 s | 稳态运行 | 检验稳态精度(速度误差、idi_did 是否为 0) |
| 0.25 s | 突加负载 | 检验抗扰能力(速度跌落、恢复时间) |
| 0.3--0.5 s | 加速 | 检验动态响应(上升时间、超调) |
这是电机控制算法验证的标准测试流程。
🔹 第 5 段:变量初始化
matlab
% 真实状态
i_d = zeros(size(t)); i_q = zeros(size(t));
omega = zeros(size(t)); theta = zeros(size(t));
% 观测器估计状态
i_d_hat = zeros(size(t)); i_q_hat = zeros(size(t)); omega_hat = zeros(size(t));
% PI 积分项
int_id = 0; int_iq = 0; int_w = 0;
🧠 为什么需要分开"真实"与"估计"?
- 真实状态:用于模拟实际电机行为(非线性模型)
- 估计状态:用于控制器反馈(模拟"无传感器"场景)
- 对比二者:可评估观测器性能
在真实硬件中,"真实状态"不可得,只能用"估计状态"。
🔹 第 6 段:Luenberger 观测器设计(核心!)
matlab
A = [-Rs/Ld, 0, 0;
0, -Rs/Lq, -psi_f/Lq;
0, (3/2)*p*psi_f/J, -B/J];
C = [1 0 0;
0 1 0]; % 输出为 [i_d; i_q]
% 能观性检查
Ob = obsv(A, C);
if rank(Ob) < 3, error('系统不能观!'); end
% 极点配置
poles_obs = [-2000, -2000, -2000];
L = place(A', C', poles_obs)';
🧠 深度解析:
1. 状态空间模型来源
该 A 矩阵是对 PMSM 模型在 id=0 工作点附近线性化的结果:
-
电压方程 (忽略交叉耦合项):
diddt=−RsLdid+1Lduddiqdt=−RsLqiq+1Lquq−ψfLqωdωdt=1J(32pψfiq−TL−Bω) \begin{aligned} \frac{di_d}{dt} &= -\frac{R_s}{L_d} i_d + \frac{1}{L_d} u_d \\ \frac{di_q}{dt} &= -\frac{R_s}{L_q} i_q + \frac{1}{L_q} u_q - \frac{\psi_f}{L_q} \omega \\ \frac{d\omega}{dt} &= \frac{1}{J} \left( \frac{3}{2} p \psi_f i_q - T_L - B \omega \right) \end{aligned} dtdiddtdiqdtdω=−LdRsid+Ld1ud=−LqRsiq+Lq1uq−Lqψfω=J1(23pψfiq−TL−Bω) -
写成矩阵形式 x˙=Ax+Bu+Ed\dot{x} = A x + B u + E dx˙=Ax+Bu+Ed,其中:
- x=[id,iq,ω]Tx = [i_d, i_q, \omega]^Tx=[id,iq,ω]T
- u=[ud,uq]Tu = [u_d, u_q]^Tu=[ud,uq]T
- d=TLd = T_Ld=TL(扰动)
⚠️ 注意:这是一个近似线性模型,仅用于观测器设计。真实仿真仍用非线性模型。
2. 输出矩阵 C
C=[100010]⇒y=[idiq] C = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \end{bmatrix} \Rightarrow y = \begin{bmatrix} i_d \\ i_q \end{bmatrix} C=[100100]⇒y=[idiq]
- 只测量电流 ,不测量转速 → 这正是需要观测器的原因!
3. 能观性(Observability)
- 能观性矩阵:O=[CCACA2]\mathcal{O} = \begin{bmatrix} C \\ CA \\ CA^2 \end{bmatrix}O= CCACA2
- 若 rank(O)=n\text{rank}(\mathcal{O}) = nrank(O)=n(状态维数),则系统完全能观
- 物理意义 :能否从输出 y(t)y(t)y(t) 唯一确定初始状态 x(0)x(0)x(0)
若不能观,则无法设计观测器!此处检查是必须的。
4. 极点配置原理
- 观测器误差动态:e˙=(A−LC)e\dot{e} = (A - LC)ee˙=(A−LC)e
- 选择 LLL 使得 A−LCA - LCA−LC 的特征值(极点)位于左半平面
- 使用
place(A', C', poles)'是因为:place函数用于状态反馈 u=−Kxu = -Kxu=−Kx- 观测器设计等价于对偶系统的状态反馈(对偶原理)
5. 极点选择策略
- 设为
-2000(即时间常数 τ=1/2000=0.5\tau = 1/2000 = 0.5τ=1/2000=0.5 ms) - 经验法则 :观测器带宽 = 3~5 × 电流环带宽
- 电流环带宽 ~500 Hz → 观测器带宽 ~1500--2500 Hz → 极点 ~ -1000 到 -2500
若极点过快 → 放大测量噪声;过慢 → 估计滞后。
🔹 第 7 段:主仿真循环(算法核心)
matlab
for k = 1:length(t)-1
% --- 速度环 ---
e_w = omega_ref(k) - omega_hat(k);
int_w = int_w + e_w * Ts;
i_q_ref = Kp_w * e_w + Ki_w * int_w;
i_q_ref = max(min(i_q_ref, 10), -10); % 限幅
% --- 电流环 ---
e_id = 0 - i_d_hat(k);
int_id = int_id + e_id * Ts;
v_d = Kp_id * e_id + Ki_id * int_id;
e_iq = i_q_ref - i_q_hat(k);
int_iq = int_iq + e_iq * Ts;
v_q = Kp_iq * e_iq + Ki_iq * int_iq;
% --- 解耦补偿 ---
u_d = v_d - omega_hat(k) * Lq * i_q_hat(k);
u_q = v_q + omega_hat(k) * (Ld * i_d_hat(k) + psi_f);
% --- 真实电机模型(非线性)---
di_d_dt = (-Rs*i_d(k) + u_d + omega(k)*Lq*i_q(k)) / Ld;
di_q_dt = (-Rs*i_q(k) + u_q - omega(k)*(Ld*i_d(k) + psi_f)) / Lq;
domega_dt = ((3/2)*p*(psi_f*i_q(k)) - T_L(k) - B*omega(k)) / J;
i_d(k+1) = i_d(k) + di_d_dt * Ts;
i_q(k+1) = i_q(k) + di_q_dt * Ts;
omega(k+1) = omega(k) + domega_dt * Ts;
% --- Luenberger 观测器 ---
x_hat = [i_d_hat(k); i_q_hat(k); omega_hat(k)];
dx_hat = A*x_hat + B_u*[u_d; u_q] + B_TL*T_L(k) + L*([i_d(k); i_q(k)] - C*x_hat);
x_hat_new = x_hat + dx_hat * Ts;
i_d_hat(k+1) = x_hat_new(1);
i_q_hat(k+1) = x_hat_new(2);
omega_hat(k+1) = x_hat_new(3);
end
🧠 分步详解:
Step 1: 速度环(外环)
- 输入 :速度参考
omega_ref(k),反馈omega_hat(k)(观测值!) - 输出 :iq∗i_q^*iq∗(转矩指令)
- 限幅:防止电流指令过大(保护逆变器)
✅ 关键创新 :使用观测器估计的速度作为反馈 → 实现"无速度传感器控制"。
Step 2: 电流环(内环)
- d 轴 :目标 id∗=0i_d^* = 0id∗=0 → 最大化功率因数
- q 轴 :跟踪 iq∗i_q^*iq∗ → 控制转矩
- PI 控制:消除静差,提升动态响应
Step 3: 解耦补偿(前馈)
- 耦合项来源 :
- udu_dud 受 ωLqiq\omega L_q i_qωLqiq 影响
- uqu_quq 受 ω(Ldid+ψf)\omega (L_d i_d + \psi_f)ω(Ldid+ψf) 影响
- 补偿公式 :
ud=vd−ωLqiquq=vq+ω(Ldid+ψf) \begin{aligned} u_d &= v_d - \omega L_q i_q \\ u_q &= v_q + \omega (L_d i_d + \psi_f) \end{aligned} uduq=vd−ωLqiq=vq+ω(Ldid+ψf) - 效果:将 dq 轴解耦为两个独立的一阶系统
💡 补偿使用观测值 (ω^,i^d,i^q\hat{\omega}, \hat{i}_d, \hat{i}_qω^,i^d,i^q),因真实值不可测。
Step 4: 真实电机模型(非线性)
- 使用精确的 PMSM 非线性方程更新真实状态
- 包含:
- 电阻压降
- 电感储能
- 反电动势(ωψf\omega \psi_fωψf)
- 电磁转矩(Te∝iqT_e \propto i_qTe∝iq)
- 负载扰动(TLT_LTL)
这是仿真真实性的保障。观测器设计用线性模型,但验证用非线性模型。
Step 5: Luenberger 观测器更新
- 预测 :x^˙=Ax^+Bu+Ed\dot{\hat{x}} = A \hat{x} + B u + E dx^˙=Ax^+Bu+Ed
- 校正 :+L(y−Cx^)+ L (y - C \hat{x})+L(y−Cx^)
- y−Cx^y - C \hat{x}y−Cx^ 是输出误差
- LLL 决定校正强度
- 离散化 :采用前向欧拉法(简单,适用于小步长)
即使模型有误差,校正项也能驱动 x^→x\hat{x} \to xx^→x。
🔹 第 8 段:结果绘图与性能评估
matlab
% 绘制6个子图(略)
fprintf('稳态速度误差: %.4f rad/s\n', abs(omega(end) - omega_ref(end)));
📊 图形解读指南:
| 图 | 理想表现 | 问题诊断 |
|---|---|---|
| 转速跟踪 | 快速无超调,稳态误差≈0 | 超调→Ki_w过大;误差→Ki_w不足 |
| i_d 波形 | ≈0(±0.1 A) | 偏离0→解耦失败或角度不准 |
| 估计 vs 真实 ω | 重合 | 分离→观测器极点太慢或模型失配 |
| 电流误差 | 快速收敛到0 | 振荡→观测器极点过快 |
simulink建模
第一部分:初始化与物理层搭建 (Physical Plant Setup)
1. 编写并运行 MATLAB 初始化脚本 (.m 文件)
在搭建任何 Simulink 模块之前,必须先将所有的变量和现代控制理论矩阵算好并驻留在内存中,避免在 Simulink 模块里手动敲击数字导致后续修改极其繁琐。
- 新建脚本 :在 MATLAB 2022b 主界面,点击左上角的 新建脚本 (New Script)。
- 复制粘贴:将以下代码完整复制到空白脚本中:
matlab
% 1. 永磁同步电机 (PMSM) 本体参数
p_n = 4; % 极对数
Rs = 2.875; % 定子电阻 (Ohm)
Ld = 0.0085; % d轴电感 (H)
Lq = 0.0085; % q轴电感 (H)
psi_f = 0.175; % 永磁体磁链 (Wb)
J = 0.0008; % 转动惯量 (kg*m^2)
B_f = 0.001; % 粘性摩擦系数 (N*m*s)
% 2. 状态空间矩阵 (机械运动方程)
A = [0 1; 0 -B_f/J];
B = [0; 1/J];
C = [1 0];
% 3. 全维状态观测器极点配置与矩阵组装
p_obs = [-100, -120]; % 观测器期望极点
L = place(A', C', p_obs)'; % 计算观测器增益矩阵 L
A_obs = A - L*C; % 观测器系统矩阵
B_obs = [B, L]; % 观测器输入矩阵 (输入为 [Te; theta_m])
C_obs = eye(2); % 观测器输出矩阵 (输出全维状态)
D_obs = zeros(2,2); % 观测器直接馈透矩阵
% 4. 双闭环 PI 控制器限幅参数
T_limit = 10; % 速度外环输出的转矩电流限幅 (A)
I_limit = 300; % 电流内环输出的电压限幅 (V)
- 保存并运行 :按下
Ctrl + S将其保存为PMSM_Init.m,然后点击编辑器上方绿色的 运行 (Run) 按钮。 - 核对工作区 :检查 MATLAB 界面右侧的 工作区 (Workspace) 窗口,确保
A_obs,p_n,Rs等所有变量均已出现。
2. 创建 Simulink 模型与全局求解器配置
这一步决定了仿真的运行精度,避免"数字离散"与"物理连续"冲突报错。
- 新建模型 :在 MATLAB 主界面点击 Simulink 图标,选择 Blank Model (空白模型)。
- 调出 powergui :
- 在空白画布的任意位置双击鼠标左键。
- 在弹出的搜索框中输入
powergui并按回车。 - 模块出现后,双击它 ,在弹出的窗口中确认
Simulation type设置为 Continuous。将其拖到画布的左上角边缘,不参与任何连线。
- 配置全局求解器 (极其关键) :
- 按下键盘快捷键
Ctrl + E,打开Model Configuration Parameters窗口。 - 在左侧菜单栏点击 Solver。
- 右侧
Type选择:Variable-step。 - 右侧
Solver选择:ode23tb (stiff/TR-BDF2)。 - 点开紧挨着的
Solver details展开箭头,找到Max step size,将默认的auto删掉,输入1e-5。 - 点击右下角的 确定 (OK)。
- 按下键盘快捷键
3. 放置并配置物理硬件模块
模拟真实的直流电源、IGBT 逆变器桥和电机本体。
- 放置直流电源 :
- 双击画布,搜索
DC Voltage Source并回车。 - 双击该模块 ,将
Amplitude (V)填入311。点击确定。
- 双击画布,搜索
- 放置三相逆变器 :
- 双击画布,搜索
Universal Bridge并回车。 - 双击该模块 ,
Number of bridge arms选 3 ;Power Electronic device选 IGBT/Diodes。其他默认,点击确定。 - 连线动作 :将
DC Voltage Source右侧的+极和-极,分别用鼠标左键拖拽连线,连接到Universal Bridge左侧的+端口和-端口。
- 双击画布,搜索
- 放置永磁同步电机 :
- 双击画布,搜索
Permanent Magnet Synchronous Machine并回车。将它放在逆变器的右下方。 - 双击该模块进行精确配置 :
- 在 Configuration 标签页下:
Number of phases: 确认是 3。Back EMF waveform: 确认是 Sinusoidal。Rotor type: 确认是 Round。Mechanical input: 选择 Torque Tm。
- 切换到 Parameters 标签页下:
- 最上方第一项下拉菜单,选择 Specify in dialog。
Stator phase resistance Rs (Ohm): 删除里面的数字,填入字母Rs。Armature inductance (H): 删除里面的数字,填入字母Ld。Flux linkage: 删除里面的数字,填入字母psi_f。Inertia, viscous damping... [J F p Tf]: 删除框内所有长串数字,填入带中括号的数组:[J, B_f, p_n, 0]。
- 点击确定。
- 在 Configuration 标签页下:
- 双击画布,搜索
- 接入空载条件 :
- 双击画布,搜索
Constant并回车,将其放在电机的左侧。 - 双击该模块 ,将
Constant value设为0,点击确定。 - 连线动作 :将这个
Constant模块的输出连到电机左侧的Tm端口上。
- 双击画布,搜索
4. 硬件连线闭环
完成物理层强电回路的硬接线。
- 逆变器接电机 :
- 将
Universal Bridge右侧的A端口,连到PMSM左侧的A端口。 - 将
Universal Bridge右侧的B端口,连到PMSM左侧的B端口。 - 将
Universal Bridge右侧的C端口,连到PMSM左侧的C端口。
- 将
第二部分:传感器信号提取与坐标变换 (Signal Extraction & Transformation)
1. 解析电机测量端口 (Bus Selector)
PMSM 模块的 m 端口把所有内部传感器数据打包成了一根"总线",我们需要用信号选择器把我们需要的数据"挑"出来。
- 放置模块 :
- 双击画布空白处,搜索
Bus Selector并回车。将它放置在 PMSM 模块的右侧。
- 双击画布空白处,搜索
- 连接总线 :
- 将 PMSM 模块最右侧的
m端口,连到Bus Selector左侧唯一的输入端口上。
- 将 PMSM 模块最右侧的
- 精准提取信号 (关键步骤) :
- 双击
Bus Selector模块,打开设置窗口。 - 看右边的
所选元素 (Selected signals)列表,把里面默认自带的信号(比如signal1,signal2等)全部选中,点击右侧的 删除 (Remove)。 - 看左边的
总线中的元素 (Signals in the bus)列表,依次找到并点击选中以下 5 个信号,每选中一个就点一次中间的 选择>> (Select>>) 按钮:Stator current is_a (A)Stator current is_b (A)Stator current is_c (A)Rotor angle thetam (rad)(机械角度 θm\theta_mθm)Rotor speed wm (rad/s)(机械转速 ωm\omega_mωm)
- 确保右侧列表严格按照这个顺序排列了这 5 个信号,点击 确定 (OK)。
- 此时,你会看到
Bus Selector右侧长出了 5 根带有对应名称的输出线。
- 双击
2. 合并三相电流 (iabci_{abc}iabc)
为了进行坐标变换,我们需要把单独的 a、b、c 三相电流线重新打包成一根三维向量线。
- 放置模块 :
- 双击画布,搜索
Mux并回车。将它放在Bus Selector前三根线的右侧。
- 双击画布,搜索
- 设置端口数 :
- 双击
Mux模块,将Number of inputs改为3,点击确定。你会看到它变成了一个有 3 个输入端的小黑竖条。
- 双击
- 连线动作 :
- 将
Bus Selector的第 1 根线 (is_a) 连到Mux的第 1 个输入端。 - 将
Bus Selector的第 2 根线 (is_b) 连到Mux的第 2 个输入端。 - 将
Bus Selector的第 3 根线 (is_c) 连到Mux的第 3 个输入端。 - 此时,
Mux右侧输出的单根粗线,即为完整的三相电流向量 iabci_{abc}iabc。
- 将
3. 计算电角度 (θe\theta_eθe)
电机控制的坐标变换必须使用电角度,而传感器测得的是机械角度。两者相差一个极对数 pnp_npn 的倍数。
- 放置模块 :
- 双击画布,搜索
Gain(增益) 并回车。将它放在Bus Selector第 4 根线的右侧。
- 双击画布,搜索
- 设置增益值 :
- 双击
Gain模块,将Gain框内的默认数字 1 删掉,填入我们在初始化脚本里定义的极对数变量名:p_n。点击确定。
- 双击
- 连线动作 :
- 将
Bus Selector的第 4 根线 (thetam) 连到Gain的输入端。 - 此时,
Gain右侧输出的线,即为电角度 θe\theta_eθe。请把这根线向右拉长一些,后续多处都要用到它。
- 将
4. Park 坐标变换 (abc 变 dq0)
MATLAB 2022b 的 Park Transform 模块内部已经集成了 Clarke 变换,可以直接将静止的三相坐标系转化为跟随转子旋转的 d-q 直流坐标系。
- 放置模块 :
- 双击画布,搜索
Park Transform并回车。放在刚才合并的三相电流线和电角度线的右侧。
- 双击画布,搜索
- 连线动作 :
- 将
Mux输出的三相电流向量线 (iabci_{abc}iabc),连到Park Transform的abc输入端。 - 将
Gain模块输出的电角度线 (θe\theta_eθe),连到Park Transform的theta(或wt) 输入端。 - 此时,
Park Transform右侧输出的是一根包含了 id,iq,i0i_d, i_q, i_0id,iq,i0 的三维向量线 (dq0)。
- 将
5. 拆分解耦后的交直轴电流 (id,iqi_d, i_qid,iq)
我们需要把揉在一起的 dq0 信号拆开,以便分别送入双闭环控制器。
- 放置模块 :
- 双击画布,搜索
Demux并回车。放在Park Transform的右侧。
- 双击画布,搜索
- 设置端口数 :
- 双击
Demux模块,将Number of outputs改为3,点击确定。
- 双击
- 连线动作 :
- 将
Park Transform输出的dq0向量线,连到Demux的输入端。 - 此时,
Demux右侧伸出了 3 根线。从上到下分别是:- 第 1 根:直轴电流 idi_did (后续接 Id 电流环负反馈)
- 第 2 根:交轴电流 iqi_qiq (后续接 Iq 电流环负反馈,以及观测器转矩重构)
- 第 3 根:零序分量 i0i_0i0 (对于三相平衡系统此值为0,直接悬空即可)
- 将