开关磁阻电机控制仿真(matlab 2016b版本仿真模型 自用) 模型包涵: 开关磁阻电机传统控制:电流斩波控制、电压PWM控制、角度位置控制。 智能控制:12/8三相开关磁阻电机有限元分析本体建模、转矩分配函数控制、模糊PID控制、模糊角度控制、神经网络在线自适应迭代控制。 部分离线迭代算法:遗传算法优化PID、粒子群算法优化PID。

最近在Matlab 2016b上折腾开关磁阻电机的控制仿真,各种传统控制和智能算法轮着试了一遍,今天随便聊聊几个有意思的实现细节。模型里最基础的电流斩波控制(CCC)看似简单,其实PWM占空比和滞环宽度的配合特别容易翻车。

先看个电压PWM控制的典型代码段:

function duty = voltagePWM(ref_speed, actual_speed, Kp)
    error = ref_speed - actual_speed;
    duty = Kp * error;
    % 限制输出在[0.1,0.9]防止完全导通/关断
    duty = max(0.1, min(duty, 0.9)); 
end

这个死区设置是血泪教训换来的——有次没加限制直接把占空比顶到1.0,IGBT模块当场表演烟花特效(仿真层面)。核心在于把速度误差映射到PWM的工作区间,但实际要配合电流环做嵌套控制才有实用价值。

智能控制里模糊角度控制挺有意思,建了个双输入单输出的模糊控制器:

fis = newfis('angleCtrl');
fis = addvar(fis,'input','位置误差',[-15 15]); % 电角度误差
fis = addvar(fis,'input','误差变化率',[-30 30]);
fis = addvar(fis,'output','角度补偿',[-5 5]);

% 自定义的非对称隶属函数
fis = addmf(fis,'input',1,'NB','trapmf',[-15 -15 -10 -5]);
fis = addmf(fis,'input',1,'ZO','trimf',[-3 0 3]);
fis = addmf(fis,'input',1,'PB','trapmf',[5 10 15 15]);

重点在于非对称的隶属函数设计,因为开关磁阻的非线性特性在正负区间的表现完全不同。调试时发现传统对称隶属度函数会导致超前角补偿总是慢半拍,改成非对称后转矩脉动明显下降。

开关磁阻电机控制仿真(matlab 2016b版本仿真模型 自用) 模型包涵: 开关磁阻电机传统控制:电流斩波控制、电压PWM控制、角度位置控制。 智能控制:12/8三相开关磁阻电机有限元分析本体建模、转矩分配函数控制、模糊PID控制、模糊角度控制、神经网络在线自适应迭代控制。 部分离线迭代算法:遗传算法优化PID、粒子群算法优化PID。

遗传算法优化PID的参数倒是整了个活:

function J = pidCostFunction(K)
    simOut = sim('SRM_GA_Model','SaveOutput','on');
    current = simOut.get('current').Data;
    J = sum(abs(current - 20)) + 0.5*range(current);
end

options = gaoptimset('PopulationSize',50,'Generations',20);
[optK, fval] = ga(@pidCostFunction,3,[],[],[],[],[0 0 0],[50 50 50],[],options);

适应度函数里除了跟踪误差还加了电流波动惩罚项,否则算法会暴力输出超大比例系数。有个坑是仿真时长设置——太短了优化不充分,太长了等得鼠标都被我砸坏两个。最后折中设了0.5秒仿真窗口,迭代20代大概要喝两杯咖啡的时间。

有限元分析建模部分用到了PDE Toolbox,导磁材料属性设置要特别注意BH曲线的分段线性化处理。有个骚操作是在非线性饱和区域插入了指数衰减项,这样在转子位置变化时磁场分布的计算误差能控制在3%以内。

神经网络自适应控制在线训练时,开始直接怼原始数据效果稀烂。后来在输入端加了转子位置的正弦余弦谐波分量,相当于手动做了个特征工程,网络收敛速度直接翻倍。不过要注意隐含层节点数超过15个之后实时性开始崩,最后用7节点结构勉强能在普通办公电脑上跑起来。

调参玄学时刻:粒子群优化PID时发现惯性权重设0.72比经典0.6效果更好,后来查文献发现跟目标函数的非线性程度有关。不过这种经验参数可能换个机型就得重新来过,现在看到粒子群就想拔网线。

更多推荐