2. 基于扩展卡尔曼滤波的感应电机无传感器矢量控制

任务目标

本案例实现基于扩展卡尔曼滤波(EKF)的感应电机无速度传感器矢量控制仿真。EKF利用定子电流和电压测量值,在线估计转子磁链分量和转子电角速度,替代速度传感器完成闭环矢量控制。仿真在MATLAB/Simulink环境中搭建,核心EKF算法以MATLAB Function模块实现。

系统模型与EKF设计

感应电机在两相静止坐标系(α-β轴)下的状态方程为:

dx/dt = f(x,u) + w
y = h(x) + v

状态向量 x = [i_sα, i_sβ, ψ_rα, ψ_rβ, ω_r],输入 u = [u_sα, u_sβ],测量输出 y = [i_sα, i_sβ]。其中w为过程噪声,v为测量噪声。EKF在每个采样周期执行预测与校正两步,雅可比矩阵F和H由状态方程线性化获得。

EKF核心算法实现

以下MATLAB Function代码为EKF完整实现,可直接嵌入Simulink的MATLAB Function模块。电机参数通过外部常量定义,噪声协方差矩阵Q、R为可调参数。

function [x_est, theta_est, omega_est] = EKF_IM(u, y, Ts, x_prev, P_prev)
% u: [u_sα; u_sβ] 定子电压
% y: [i_sα; i_sβ] 定子电流测量
% Ts: 采样时间
% x_prev: 上一时刻状态 [i_sα; i_sβ; ψ_rα; ψ_rβ; ω_r]
% P_prev: 上一时刻误差协方差矩阵 5x5

% 电机参数(需与Simulink模型中一致)
Rs = 0.435; Rr = 0.816; Ls = 0.0713; Lr = 0.0713; Lm = 0.0693;
sigma = 1 - Lm^2/(Ls*Lr);
Tr = Lr/Rr;
a = 1/(sigma*Ls);
b = Lm/(sigma*Ls*Lr);

% 状态提取
is_alpha = x_prev(1); is_beta = x_prev(2);
psi_alpha = x_prev(3); psi_beta = x_prev(4);
omega = x_prev(5);

% 非线性状态方程 f(x,u)
f = [a*(-Rs*is_alpha + b*psi_alpha + omega*psi_beta) + a*u(1);
     a*(-Rs*is_beta - omega*psi_alpha + b*psi_beta) + a*u(2);
     (-psi_alpha/Tr - omega*psi_beta) + Lm*is_alpha/Tr;
     (omega*psi_alpha - psi_beta/Tr) + Lm*is_beta/Tr;
     0];

% 离散化(一阶欧拉)
x_pred = x_prev + Ts*f;

% 雅可比矩阵 F = ∂f/∂x
F = [ -a*Rs,       0,      a*b,      a*omega,    a*psi_beta;
      0,          -a*Rs,  -a*omega,  a*b,       -a*psi_alpha;
      Lm/Tr,       0,     -1/Tr,    -omega,     -psi_beta;
      0,           Lm/Tr,  omega,    -1/Tr,      psi_alpha;
      0,           0,      0,        0,          0];

% 离散化状态转移矩阵
Phi = eye(5) + Ts*F;

% 过程噪声协方差(对角阵,可调)
Q = diag([1e-4, 1e-4, 1e-6, 1e-6, 1e-2]);

% 预测协方差
P_pred = Phi * P_prev * Phi' + Q;

% 测量矩阵 H = ∂h/∂x
H = [1 0 0 0 0;
     0 1 0 0 0];

% 测量噪声协方差
R = diag([1e-3, 1e-3]);

% 卡尔曼增益
K = P_pred * H' / (H * P_pred * H' + R);

% 状态校正
y_pred = [x_pred(1); x_pred(2)];
x_est = x_pred + K * (y - y_pred);

% 协方差校正
P_est = (eye(5) - K*H) * P_pred;

% 输出估计值
theta_est = atan2(x_est(4), x_est(3));  % 转子磁链角度
omega_est = x_est(5);                    % 转子电角速度

% 更新全局状态(用于下一周期)
P_prev = P_est;
end

Simulink仿真搭建

仿真模型结构如下:

  1. 电机模型:使用Simulink自带“Asynchronous Machine SI Units”模块,参数设置为上述电机参数一致。
  2. 坐标变换:将三相电流/电压经Clarke变换得到α-β轴分量。
  3. EKF模块:MATLAB Function模块调用上述EKF函数,输入为电压、电流和上一时刻状态。
  4. 转速闭环:给定转速与EKF估计转速比较,经PI调节器输出转矩电流指令i_sq*。
  5. 磁链闭环:给定磁链幅值与EKF估计磁链幅值比较,经PI调节器输出励磁电流指令i_sd*。
  6. 电流内环:在旋转坐标系下对i_sd、i_sq进行PI控制,输出电压指令经逆Park变换和SVPWM调制后驱动逆变器。

运行与验证方法

运行步骤:

  1. 在MATLAB中设置仿真参数:采样时间Ts = 1e-4s,仿真时长2s。
  2. 初始化EKF状态:x_prev = [0;0;0;0;0],P_prev = eye(5)*0.1。
  3. 给定转速指令:0~1s为100 rad/s,1s后阶跃至150 rad/s。
  4. 运行仿真。

通过条件:

  • 估计转速在0.5s内跟踪给定转速,稳态误差小于2 rad/s。
  • 估计磁链幅值收敛至给定值0.8 Wb附近,波动小于5%。
  • 转速阶跃后,估计值在0.3s内重新跟踪,无持续振荡。

预期输出(基于代码逻辑的确定性结果):在给定上述参数和输入条件下,EKF估计的转子磁链角度为连续递增的斜坡信号(对应恒速旋转),估计转速收敛至给定值附近。具体波形需通过仿真观察确认。

关键参数调节建议

  • 若估计转速噪声过大,适当减小Q(5,5)(转速过程噪声)或增大R。
  • 若动态响应过慢,增大Q(5,5)或减小R。
  • 初始协方差P_prev影响收敛速度,建议初始值设为0.1~1倍单位阵。

常见问题

  • EKF发散:检查电机参数是否与模型一致,特别是Lm和Tr;确认采样时间足够小(Ts ≤ 1e-4)。
  • 估计转速振荡:降低转速PI控制器增益,或增大Q(5,5)提高滤波器对转速变化的跟踪能力。
  • 启动失败:零速时转子磁链不可观测,需在启动阶段施加直流偏置或采用开环启动策略,待转速超过5 rad/s后再切换至EKF闭环。