3. 模糊PID参数自整定在电机转速控制中的实现

任务目标

为直流电机转速控制系统设计模糊PID自整定控制器:以转速误差e和误差变化率ec为输入,在线调整PID增益(Kp、Ki、Kd),并在Simulink中建立仿真模型,对比固定PID与模糊PID在负载突变时的转速恢复性能。

系统结构与设计参数

被控对象为直流电机电枢控制模型:G(s)=10/(0.05s²+s),额定转速1000 rpm。模糊PID控制器采用二维Mamdani型模糊推理,输入输出均归一化到[-1,1]区间。PID初始增益:Kp0=2.0,Ki0=0.5,Kd0=0.1,模糊输出为增益修正系数ΔKp、ΔKi、ΔKd,实际增益为:

Kp = Kp0 + ΔKp·kp_scale,Ki = Ki0 + ΔKi·ki_scale,Kd = Kd0 + ΔKd·kd_scale,其中比例因子kp_scale=1.0,ki_scale=0.3,kd_scale=0.05。

模糊规则表

ΔKp/ΔKi/ΔKdNBNMZOPMPB
e\ecNBNMZOPMPB
NBPB/NB/PSPB/NB/NSPM/NM/NBPM/NM/NBPS/NS/NB
NMPB/NB/PSPM/NM/NSPM/NS/NMPS/NS/NMZO/ZO/PS
ZOPM/NM/ZOPM/NS/NSZO/ZO/NSNS/PS/NSNM/PM/ZO
PMPS/NS/ZOZO/ZO/PSNS/PS/PSNM/PM/PMNM/PB/PB
PBZO/ZO/PBNS/PS/PMNM/PM/PMNM/PB/PBNB/PB/PB

表中三元组依次为ΔKp/ΔKi/ΔKd的模糊子集。隶属度函数采用三角形,输入输出均覆盖[-1,1],解模糊采用重心法。

关键完整代码(MATLAB + Simulink)

以下代码创建模糊推理系统(FIS)并保存为.fis文件,供Simulink的Fuzzy Logic Controller模块调用。仿真模型结构:阶跃转速指令 → 误差计算 → 模糊PID控制器 → 电机模型 → 转速输出,负载转矩在t=2s时阶跃增加50%。

% 创建模糊PID自整定FIS
fis = newfis('fuzzyPID', 'Mamdani', 'min', 'max', 'min', 'max', 'centroid');

% 输入:误差e(归一化)
fis = addvar(fis, 'input', 'e', [-1 1]);
fis = addmf(fis, 'input', 1, 'NB', 'trimf', [-1.5 -1 -0.5]);
fis = addmf(fis, 'input', 1, 'NM', 'trimf', [-1 -0.5 0]);
fis = addmf(fis, 'input', 1, 'ZO', 'trimf', [-0.5 0 0.5]);
fis = addmf(fis, 'input', 1, 'PM', 'trimf', [0 0.5 1]);
fis = addmf(fis, 'input', 1, 'PB', 'trimf', [0.5 1 1.5]);

% 输入:误差变化率ec(归一化)
fis = addvar(fis, 'input', 'ec', [-1 1]);
fis = addmf(fis, 'input', 2, 'NB', 'trimf', [-1.5 -1 -0.5]);
fis = addmf(fis, 'input', 2, 'NM', 'trimf', [-1 -0.5 0]);
fis = addmf(fis, 'input', 2, 'ZO', 'trimf', [-0.5 0 0.5]);
fis = addmf(fis, 'input', 2, 'PM', 'trimf', [0 0.5 1]);
fis = addmf(fis, 'input', 2, 'PB', 'trimf', [0.5 1 1.5]);

% 输出:ΔKp, ΔKi, ΔKd(归一化)
fis = addvar(fis, 'output', 'dKp', [-1 1]);
fis = addvar(fis, 'output', 'dKi', [-1 1]);
fis = addvar(fis, 'output', 'dKd', [-1 1]);
for outVar = 1:3
    fis = addmf(fis, 'output', outVar, 'NB', 'trimf', [-1.5 -1 -0.5]);
    fis = addmf(fis, 'output', outVar, 'NM', 'trimf', [-1 -0.5 0]);
    fis = addmf(fis, 'output', outVar, 'ZO', 'trimf', [-0.5 0 0.5]);
    fis = addmf(fis, 'output', outVar, 'PM', 'trimf', [0 0.5 1]);
    fis = addmf(fis, 'output', outVar, 'PB', 'trimf', [0.5 1 1.5]);
end

% 规则表(按上表逐行添加,共25条)
% 规则权重均为1,AND连接
ruleList = [
1 1 5 1 4 1 1;   % e=NB,ec=NB → dKp=PB(5),dKi=NB(1),dKd=PS(4)
1 2 5 1 3 1 1;   % e=NB,ec=NM → dKp=PB,dKi=NB,dKd=NS(3)
1 3 4 2 1 1 1;   % e=NB,ec=ZO → dKp=PM(4),dKi=NM(2),dKd=NB(1)
1 4 4 2 1 1 1;
1 5 3 3 1 1 1;   % e=NB,ec=PB → dKp=PS(3),dKi=NS(3),dKd=NB
2 1 5 1 3 1 1;
2 2 4 2 3 1 1;
2 3 4 3 2 1 1;
2 4 3 3 2 1 1;
2 5 2 2 4 1 1;   % ZO(2)
3 1 4 2 2 1 1;
3 2 4 3 3 1 1;
3 3 2 2 3 1 1;
3 4 3 4 3 1 1;   % NS(3),PS(4)
3 5 2 5 2 1 1;   % NM(2),PM(5)
4 1 3 3 2 1 1;
4 2 2 2 4 1 1;
4 3 3 4 4 1 1;
4 4 2 5 5 1 1;
4 5 2 5 5 1 1;
5 1 2 2 5 1 1;
5 2 3 4 4 1 1;
5 3 2 5 5 1 1;
5 4 2 5 5 1 1;
5 5 1 5 5 1 1;   % NB(1),PB(5)
];

% 添加规则:前4列为输入索引,5-7列为输出索引,第8列为权重,第9列为AND(1)
fis = addrule(fis, ruleList);

% 保存FIS文件供Simulink使用
writefis(fis, 'fuzzy_pid_motor');
disp('FIS文件已生成: fuzzy_pid_motor.fis');

Simulink模型搭建步骤

  1. 新建Simulink模型,添加以下模块:Step(转速指令1000)、Sum(误差计算)、Fuzzy Logic Controller(读取fuzzy_pid_motor.fis)、Gain模块(比例因子kp_scale=1.0、ki_scale=0.3、kd_scale=0.05)、积分器、求和模块、饱和模块(限幅0~12V)、电机传递函数10/(0.05s²+s)、Scope。
  2. 模糊PID内部结构:将e和ec分别经Gain归一化(1/1000和1/500)后输入Fuzzy模块,输出ΔKp、ΔKi、ΔKd分别乘以对应比例因子,再与Kp0、Ki0、Kd0相加得到实际PID增益,驱动PID控制器(使用Simulink的PID Controller模块,设为外部增益输入模式)。
  3. 负载扰动:在t=2s时通过Step模块(从0阶跃到5)叠加到电机输入端(等效负载转矩),模拟突加负载。
  4. 仿真时间设为4s,求解器用ode45,最大步长0.001s。

验证方法与通过条件

运行仿真后,观察Scope中的转速响应曲线。通过条件:

  • 启动阶段:转速超调量≤5%,调节时间(进入±2%误差带)≤0.8s;
  • t=2s负载突变后:转速跌落≤80rpm,恢复时间(回到±2%误差带)≤0.5s;
  • 对比固定PID(Kp=2.0,Ki=0.5,Kd=0.1)在相同负载扰动下的响应,模糊PID的转速跌落应更小、恢复更快。

若转速跌落过大或恢复过慢,可调整比例因子kp_scale、ki_scale、kd_scale或修改规则表灵敏度。

预期输出(基于代码逻辑的确定性结果)

由于模糊规则与PID参数调整方向一致,在负载突变瞬间误差增大,模糊规则输出正ΔKp和正ΔKi,使控制器快速增大输出以抑制转速跌落。与固定PID相比,模糊PID的转速跌落幅度预计减小约30%~50%,恢复时间缩短约40%~60%。具体数值需通过实际仿真读取,此处仅给出逻辑预期方向。

模糊PID自整定控制系统框图 r(t) Σ − e(t) e ec=de/dt 模糊推理 ΔKp, ΔKi, ΔKd ΔK PID Kp0+ΔKp 电机 G(s) 反馈 y(t) 负载扰动 转速 n(t)