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仿真搭建
仿真模型结构如下:
- 电机模型:使用Simulink自带“Asynchronous Machine SI Units”模块,参数设置为上述电机参数一致。
- 坐标变换:将三相电流/电压经Clarke变换得到α-β轴分量。
- EKF模块:MATLAB Function模块调用上述EKF函数,输入为电压、电流和上一时刻状态。
- 转速闭环:给定转速与EKF估计转速比较,经PI调节器输出转矩电流指令
i_sq*。 - 磁链闭环:给定磁链幅值与EKF估计磁链幅值比较,经PI调节器输出励磁电流指令
i_sd*。 - 电流内环:在旋转坐标系下对
i_sd、i_sq进行PI控制,输出电压指令经逆Park变换和SVPWM调制后驱动逆变器。
运行与验证方法
运行步骤:
- 在MATLAB中设置仿真参数:采样时间
Ts = 1e-4s,仿真时长2s。 - 初始化EKF状态:
x_prev = [0;0;0;0;0],P_prev = eye(5)*0.1。 - 给定转速指令:0~1s为
100 rad/s,1s后阶跃至150 rad/s。 - 运行仿真。
通过条件:
- 估计转速在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闭环。