基于 Luenberger 观测器的 PMSM 无速度传感器 id=0 矢量控制系统 Simulink 建模与实现(一)

一、全维状态观测器(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。


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)));

🔍 脚本说明

✅ 功能亮点:

  1. 真实电机模型:使用非线性 dq 方程进行仿真。
  2. id=0 控制 :强制 id=0i_d = 0id=0,仅通过 iqi_qiq 控制转矩。
  3. 双闭环 PI
    • 外环:速度 → iq∗i_q^*iq∗
    • 内环:电流 → ud,uqu_d, u_qud,uq
  4. Luenberger 观测器
    • 估计 id,iq,ωi_d, i_q, \omegaid,iq,ω
    • 使用真实电流作为反馈校正
  5. 动态测试
    • 速度阶跃(100 → 200 rad/s)
    • 负载突变(0 → 0.5 N·m)

⚙️ 如何使用:

  1. 将代码保存为 pmsm_id0_observer.m
  2. 在 MATLAB 中运行
  3. 查看 6 个子图的仿真结果

📈 预期结果:

  • id≈0i_d \approx 0id≈0
  • 速度快速跟踪指令
  • 观测器估计值与真实值高度一致(误差 < 1%)

📘 一、整体目标与背景

✅ 控制任务

  • 对象:面贴式永磁同步电机(SPMSM)
  • 目标 :在仅测量定子电流 (id,iqi_d, i_qid,iq)的前提下,实现:
    1. 高性能速度控制(双闭环:速度 + 电流)
    2. 无速度传感器运行 (转速 ω\omegaω 不可测,需估计)
    3. 强抗负载扰动能力

✅ 技术路线

  • 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 模块里手动敲击数字导致后续修改极其繁琐。

  1. 新建脚本 :在 MATLAB 2022b 主界面,点击左上角的 新建脚本 (New Script)
  2. 复制粘贴:将以下代码完整复制到空白脚本中:
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)
  1. 保存并运行 :按下 Ctrl + S 将其保存为 PMSM_Init.m,然后点击编辑器上方绿色的 运行 (Run) 按钮。
  2. 核对工作区 :检查 MATLAB 界面右侧的 工作区 (Workspace) 窗口,确保 A_obs, p_n, Rs 等所有变量均已出现。

这一步决定了仿真的运行精度,避免"数字离散"与"物理连续"冲突报错。

  1. 新建模型 :在 MATLAB 主界面点击 Simulink 图标,选择 Blank Model (空白模型)
  2. 调出 powergui
    • 在空白画布的任意位置双击鼠标左键
    • 在弹出的搜索框中输入 powergui 并按回车。
    • 模块出现后,双击它 ,在弹出的窗口中确认 Simulation type 设置为 Continuous。将其拖到画布的左上角边缘,不参与任何连线。
  3. 配置全局求解器 (极其关键)
    • 按下键盘快捷键 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 逆变器桥和电机本体。

  1. 放置直流电源
    • 双击画布,搜索 DC Voltage Source 并回车。
    • 双击该模块 ,将 Amplitude (V) 填入 311。点击确定。
  2. 放置三相逆变器
    • 双击画布,搜索 Universal Bridge 并回车。
    • 双击该模块Number of bridge arms3Power Electronic deviceIGBT/Diodes。其他默认,点击确定。
    • 连线动作 :将 DC Voltage Source 右侧的 + 极和 - 极,分别用鼠标左键拖拽连线,连接到 Universal Bridge 左侧的 + 端口和 - 端口。
  3. 放置永磁同步电机
    • 双击画布,搜索 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]
      • 点击确定。
  4. 接入空载条件
    • 双击画布,搜索 Constant 并回车,将其放在电机的左侧。
    • 双击该模块 ,将 Constant value 设为 0,点击确定。
    • 连线动作 :将这个 Constant 模块的输出连到电机左侧的 Tm 端口上。
4. 硬件连线闭环

完成物理层强电回路的硬接线。

  1. 逆变器接电机
    • Universal Bridge 右侧的 A 端口,连到 PMSM 左侧的 A 端口。
    • Universal Bridge 右侧的 B 端口,连到 PMSM 左侧的 B 端口。
    • Universal Bridge 右侧的 C 端口,连到 PMSM 左侧的 C 端口。

第二部分:传感器信号提取与坐标变换 (Signal Extraction & Transformation)

1. 解析电机测量端口 (Bus Selector)

PMSM 模块的 m 端口把所有内部传感器数据打包成了一根"总线",我们需要用信号选择器把我们需要的数据"挑"出来。

  1. 放置模块
    • 双击画布空白处,搜索 Bus Selector 并回车。将它放置在 PMSM 模块的右侧。
  2. 连接总线
    • 将 PMSM 模块最右侧的 m 端口,连到 Bus Selector 左侧唯一的输入端口上。
  3. 精准提取信号 (关键步骤)
    • 双击 Bus Selector 模块,打开设置窗口。
    • 看右边的 所选元素 (Selected signals) 列表,把里面默认自带的信号(比如 signal1, signal2 等)全部选中,点击右侧的 删除 (Remove)
    • 看左边的 总线中的元素 (Signals in the bus) 列表,依次找到并点击选中以下 5 个信号,每选中一个就点一次中间的 选择>> (Select>>) 按钮:
      1. Stator current is_a (A)
      2. Stator current is_b (A)
      3. Stator current is_c (A)
      4. Rotor angle thetam (rad) (机械角度 θm\theta_mθm)
      5. Rotor speed wm (rad/s) (机械转速 ωm\omega_mωm)
    • 确保右侧列表严格按照这个顺序排列了这 5 个信号,点击 确定 (OK)
    • 此时,你会看到 Bus Selector 右侧长出了 5 根带有对应名称的输出线。
2. 合并三相电流 (iabci_{abc}iabc)

为了进行坐标变换,我们需要把单独的 a、b、c 三相电流线重新打包成一根三维向量线。

  1. 放置模块
    • 双击画布,搜索 Mux 并回车。将它放在 Bus Selector 前三根线的右侧。
  2. 设置端口数
    • 双击 Mux 模块,将 Number of inputs 改为 3,点击确定。你会看到它变成了一个有 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 的倍数。

  1. 放置模块
    • 双击画布,搜索 Gain (增益) 并回车。将它放在 Bus Selector 第 4 根线的右侧。
  2. 设置增益值
    • 双击 Gain 模块,将 Gain 框内的默认数字 1 删掉,填入我们在初始化脚本里定义的极对数变量名:p_n。点击确定。
  3. 连线动作
    • Bus Selector 的第 4 根线 (thetam) 连到 Gain 的输入端。
    • 此时,Gain 右侧输出的线,即为电角度 θe\theta_eθe。请把这根线向右拉长一些,后续多处都要用到它。
4. Park 坐标变换 (abc 变 dq0)

MATLAB 2022b 的 Park Transform 模块内部已经集成了 Clarke 变换,可以直接将静止的三相坐标系转化为跟随转子旋转的 d-q 直流坐标系。

  1. 放置模块
    • 双击画布,搜索 Park Transform 并回车。放在刚才合并的三相电流线和电角度线的右侧。
  2. 连线动作
    • Mux 输出的三相电流向量线 (iabci_{abc}iabc),连到 Park Transformabc 输入端。
    • Gain 模块输出的电角度线 (θe\theta_eθe),连到 Park Transformtheta (或 wt) 输入端。
    • 此时,Park Transform 右侧输出的是一根包含了 id,iq,i0i_d, i_q, i_0id,iq,i0 的三维向量线 (dq0)。
5. 拆分解耦后的交直轴电流 (id,iqi_d, i_qid,iq)

我们需要把揉在一起的 dq0 信号拆开,以便分别送入双闭环控制器。

  1. 放置模块
    • 双击画布,搜索 Demux 并回车。放在 Park Transform 的右侧。
  2. 设置端口数
    • 双击 Demux 模块,将 Number of outputs 改为 3,点击确定。
  3. 连线动作
    • Park Transform 输出的 dq0 向量线,连到 Demux 的输入端。
    • 此时,Demux 右侧伸出了 3 根线。从上到下分别是:
      • 第 1 根:直轴电流 idi_did (后续接 Id 电流环负反馈)
      • 第 2 根:交轴电流 iqi_qiq (后续接 Iq 电流环负反馈,以及观测器转矩重构)
      • 第 3 根:零序分量 i0i_0i0 (对于三相平衡系统此值为0,直接悬空即可)
相关推荐
斯维赤4 小时前
每天学习一个小算法:选择排序
java·学习·算法
超级码力6664 小时前
【Latex第三方文档类standalone】standalone类介绍及应用
算法·数学建模·信息可视化
明朝百晓生4 小时前
强化学习 [chapter10] [page3 ]Actor-Critic Methods
算法
peterfei5 小时前
一个 Tauri + Rust AI 编辑器是怎么同时适配 5 家 AI 大厂的?IfAI v0.4.3 架构拆解
人工智能·算法·架构
Via_Neo5 小时前
桶排序算法
算法·排序算法
KIHU快狐5 小时前
快狐KIHU|110寸壁挂触控一体机G+G电容屏安卓系统汽车展厅查询展示
android·python·汽车
斯维赤5 小时前
每天学习一个小算法:快速排序
java·python·学习·算法·排序算法
我爱C编程5 小时前
移动边缘网络中基于双深度QLearning强化学习(DDQL)的高能效资源分配方法
matlab·强化学习·移动边缘网络·双深度qlearning·ddql·高能效资源分配
王老师青少年编程5 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【区间贪心】:雷达安装
c++·算法·贪心·csp·信奥赛·区间贪心·雷达安装