永磁同步电机电机MARS(模型参考自适应)Matlab仿真模型。 永磁同步电机的控制算法仿真模型Matlab,simulink: 永磁同步电机的MRAS无传感器矢量控制
永磁同步电机的无传感器控制里,MRAS(模型参考自适应)算是个挺有意思的方案。这玩意儿核心思想就是搞两个模型互相较劲——参考模型和可调模型。参考模型用电机方程直接怼出转子位置,可调模型靠实际电流和电压来估算,然后让它们互相PK,通过误差不断调整参数。下面这个Simulink模型截图(图1)展示了典型的MRAS结构,电流环和转速环中间夹着自适应率模块,就是整个系统的灵魂。
!MRAS结构示意图
图1:MRAS控制结构示意
重点说说自适应率模块的实现。在Simulink里可以自己撸个S函数,核心代码长这样:
function sys = mras_update(u) persistent theta_hat; if isempty(theta_hat) theta_hat = 0; end i_alpha = u(1); % 实际α轴电流 i_beta_hat = u(2); % 估算β轴电流 error = i_alpha - i_beta_hat; % 自适应率参数 Kp = 0.5; Ki = 100; % 积分分离处理 if abs(error) > 0.1 theta_hat = theta_hat + Kp * error; else theta_hat = theta_hat + (Kp + Ki) * error; end sys = theta_hat; end这段代码实现了误差的PI调节,注意这里有个骚操作——当误差超过0.1时只用比例项,防止积分饱和。实际调试时发现,Ki参数对低速时的稳定性影响巨大,有个经验公式:Ki ≈ (3~5)*R/L,R是定子电阻,L是电感参数。
转速估算模块用了个锁相环结构,关键部分代码如下:
function omega_e = pll_update(theta_err) persistent integrator; if isempty(integrator) integrator = 0; end Kp_pll = 15; Ki_pll = 800; integrator = integrator + Ki_pll * theta_err * 0.0001; % 假设步长0.1ms omega_e = Kp_pll * theta_err + integrator; % 抗积分饱和 if abs(integrator) > 1000 integrator = sign(integrator)*1000; end end这里有个坑:当转速突变时,锁相环容易产生相位滞后。解决办法是把转速前馈量直接叠加到输出,相当于给锁相环装了个加速踏板。仿真时看到转速阶跃响应从原来的50ms缩短到20ms左右,效果立竿见影。
参数整定方面,建议先调电流环再搞转速环。用这个配置脚本快速切换参数:
% 快速切换参数组 params_set = struct(... 'Kp_speed', [0.8, 1.2, 2.0],... 'Ki_speed', [50, 100, 200],... 'current_bandwidth', [100, 200, 300]... ); current_config = 2; % 直接改这个数字切换参数 disp(['当前配置:', num2str(current_config)]);记得每次改完参数要清除工作区的持久变量,否则上次仿真的数据会污染新结果。遇到估算位置抖动的情况,八成是模型中的电机参数和实际设置不匹配,特别是Lq和Ld这两个参数,偏差超过15%就会明显影响性能。
最后说个实战技巧:在电压前馈环节加个低通滤波,截止频率设为基波频率的3倍左右,能有效抑制高频噪声。但要注意相位补偿,否则会引起转矩脉动。仿真时用这个命令抓取关键波形:
simOut = sim('PMSM_MRAS'); scopeData = get(simOut,'ScopeData'); plot(scopeData(:,1), scopeData(:,2)); % 转速跟踪曲线 hold on; plot(scopeData(:,1), scopeData(:,3), '--'); % 估算转速当实际转速和估算转速的波形基本重合,说明模型调得差不多了。要是出现周期性波动,检查下PWM频率和采样周期是否匹配,通常采样频率得比PWM频率高10倍以上才稳得住。