PMSM控制无感算法:定位+电流闭环强拖+ 角度渐变切换+ 速度电流双闭环+ 无传感器角度估算SMO+ PLL 控制方式 Simulink 仿真模型

最近在搞PMSM无感控制方案验证,发现启动阶段的平滑过渡和观测器稳定性是真要命。直接上干货,咱们聊聊怎么用Simulink搭一个包含强拖启动和滑模观测器(SMO)的完整控制模型,重点看几个关键代码实现。

启动阶段的核心是电流闭环强拖,这时候还没角度反馈呢。在Simulink里搞了个强制旋转的电压矢量发生器,核心参数是设定好的初始拖动频率。代码里这个循环设定特别要注意斜坡时间:

% 强拖阶段角度生成
if t < 0.1
    theta_forced = 0;  % 初始定位
elseif t < 0.3
    theta_forced = 2*pi*5*(t-0.1);  % 5Hz斜坡
else
    theta_forced = 2*pi*20*(t-0.3) + 2*pi*5*0.2;  % 20Hz加速
end

这里0.3秒的渐变时间参数直接关系到电机能否顺利起转,时间太短容易导致失步。实测发现当拖动电流设定在额定电流30%时,机械特性最硬,适合大多数中惯量负载。

PMSM控制无感算法:定位+电流闭环强拖+ 角度渐变切换+ 速度电流双闭环+ 无传感器角度估算SMO+ PLL 控制方式 Simulink 仿真模型

切到无感模式时最怕角度跳变,这里用了αβ轴电流差值作为切换条件。模型里搞了个状态机控制切换逻辑,关键代码段长这样:

function switch_flag = fcn(I_alpha_obs, I_beta_obs, I_alpha_ref, I_beta_ref)
    error = sqrt((I_alpha_obs - I_alpha_ref)^2 + (I_beta_obs - I_beta_ref)^2);
    persistent count;
    if isempty(count)
        count = 0;
    end
    if error < 0.05  % 电流偏差阈值
        count = count + 1;
    else
        count = 0;
    end
    switch_flag = (count > 50);  % 连续50个周期达标才切换

这种滞后比较设计能有效避免高频扰动导致的误切换。注意阈值0.05对应的是标幺值,实际调试时要换算成实际电流值。

滑模观测器的实现最有趣,直接在Simulink里用MATLAB Function写了个带符号函数的版本:

function [e_alpha, e_beta] = SMO(v_alpha, v_beta, i_alpha, i_beta, Ld, Rs)
    persistent i_alpha_hat i_beta_hat;
    if isempty(i_alpha_hat)
        i_alpha_hat = 0; i_beta_hat = 0;
    end
    
    k = 50;  % 滑模增益
    h = 0.0001;  % 积分步长
    
    e_alpha = i_alpha_hat - i_alpha;
    e_beta = i_beta_hat - i_beta;
    
    % 滑模面计算
    s_alpha = sign(e_alpha);
    s_beta = sign(e_beta);
    
    % 观测器更新
    di_alpha_hat = (v_alpha - Rs*i_alpha_hat + k*s_alpha)/Ld;
    di_beta_hat = (v_beta - Rs*i_beta_hat + k*s_beta)/Ld;
    
    i_alpha_hat = i_alpha_hat + di_alpha_hat * h;
    i_beta_hat = i_beta_hat + di_beta_hat * h;

这个实现里有个坑——符号函数引起的抖振会污染反电动势估计值。后来在PLL环节加了二阶锁相环,用了个双积分结构:

function [theta_est, omega_est] = PLL(e_alpha, e_beta, Kp, Ki)
    persistent integ_angle integ_error;
    if isempty(integ_angle)
        integ_angle = 0; integ_error = 0;
    end
    
    theta_delta = atan2(e_beta, e_alpha);
    error = theta_delta - integ_angle;
    
    integ_error = integ_error + Ki * error;
    omega_est = Kp * error + integ_error;
    integ_angle = integ_angle + omega_est * 0.0001;  % 对应仿真步长
    
    theta_est = integ_angle;

锁相环的带宽设置特别讲究,通常取电机额定转速的3-5倍。调试时发现当Kp=200,Ki=5000时,在2000rpm突变工况下相位滞后控制在15度以内。

整套模型跑下来最爽的时刻是切模式时的波形——速度环给定从强拖的20Hz跳变到15Hz,实际转速经过约0.1秒完成跟踪,切换瞬间的转矩波动控制在5%以内。不过也翻过车,有一次SMO增益调太大导致高频振荡,电机直接啸叫着抖成筛子。所以说,无感控制这玩意,仿真成功只是开始,真上硬件还得跟示波器死磕好几天。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐