永磁同步电机PMSM模糊PID和传统PID控制对比仿真模型
[1]转速外环分别采用模糊PiD和普通PID控制,电流内环pi控制 svpwm
[2]设计资料调参过程等包含,pmsm原理分析等
在这里插入图片描述
MATLAB 代码以及 S-Function 或 MATLAB Function 模块代码,

方案一:模糊推理系统 (.fis) 的代码
你需要先在 MATLAB 命令行运行这段代码,一个模糊控制表,然后在 Simulink 中使用 “Fuzzy Logic Controller” 模块加载它。

% 创建一个模糊推理系统
a = newfis(‘fuzzypid’);

% 1. 添加输入变量:误差 (e)
a = addvar(a, ‘input’, ‘e’, [-10 10]);
a = addmf(a, ‘input’, 1, ‘NB’, ‘zmf’, [-10 -5]);
a = addmf(a, ‘input’, 1, ‘NS’, ‘trimf’, [-10 -5 0]);
a = addmf(a, ‘input’, 1, ‘Z’, ‘trimf’, [-5 0 5]);
a = addmf(a, ‘input’, 1, ‘PS’, ‘trimf’, [0 5 10]);
a = addmf(a, ‘input’, 1, ‘PB’, ‘smf’, [5 10]);

% 2. 添加输入变量:误差变化率 (ec)
a = addvar(a, ‘input’, ‘ec’, [-10 10]);
a = addmf(a, ‘input’, 2, ‘NB’, ‘zmf’, [-10 -5]);
a = addmf(a, ‘input’, 2, ‘NS’, ‘trimf’, [-10 -5 0]);
a = addmf(a, ‘input’, 2, ‘Z’, ‘trimf’, [-5 0 5]);
a = addmf(a, ‘input’, 2, ‘PS’, ‘trimf’, [0 5 10]);
a = addmf(a, ‘input’, 2, ‘PB’, ‘smf’, [5 10]);

% 3. 添加输出变量:Kp修正量
a = addvar(a, ‘output’, ‘delta_Kp’, [-3 3]);
a = addmf(a, ‘output’, 1, ‘NB’, ‘constant’, -3);
a = addmf(a, ‘output’, 1, ‘NS’, ‘constant’, -1.5);
a = addmf(a, ‘output’, 1, ‘Z’, ‘constant’, 0);
a = addmf(a, ‘output’, 1, ‘PS’, ‘constant’, 1.5);
a = addmf(a, ‘output’, 1, ‘PB’, ‘constant’, 3);

% 4. 添加规则 (这里只列举几条示例,实际需要根据控制策略补全)
% 规则格式: [输入1索引, 输入2索引, 输出1索引, 权重, 运算符(1=AND, 2=OR)]
ruleList = [
1 1 1 1 1; % If e is NB and ec is NB, then Kp is NB
1 2 1 1 1; % If e is NB and ec is NS, then Kp is NB
3 3 3 1 1; % If e is Z and ec is Z, then Kp is Z
5 5 5 1 1; % If e is PB and ec is PB, then Kp is PB
% … 需要补全 25 条规则
];
a = addrule(a, ruleList);

% 保存文件
writefis(a, ‘my_fuzzy_pid’);

方案二:Simulink 中 “MATLAB Function” 模块代码
如果你不想用上面的 FIS 文件,而是想直接写逻辑(模拟图中的 Switch 切换),可以在 Simulink 中拖入一个 MATLAB Function 模块,并复制以下代码。这段代码模拟了图中“模式选择”开关的逻辑。

function out = fcn(double mode, double pid_out, double fuzzy_out)
% mode: 模式选择 (0为传统PID, 1为模糊PID)
% pid_out: 传统PID控制器的输出
% fuzzy_out: 模糊PID控制器的输出

if mode < 0.5
% 模式0:选择传统PID输出
out = pid_out;
else
% 模式1:选择模糊PID输出
out = fuzzy_out;
end

方案三:如何搭建图中的模型(步骤指南)
Simulink 中连线:

输入端:
放一个 Step 模块作为“转速给定”。
放一个 Sum 模块计算误差(给定 - 实际转速)。
控制器分支:
分支1(传统PID):拖入一个 PID Controller 模块。
分支2(模糊PID):
拖入两个 Gain 模块分别乘以 K_p, K_i 因子。
拖入一个 Fuzzy Logic Controller 模块,参数设置为上面生成的 my_fuzzy_pid。
通常模糊PID的结构是:利用模糊逻辑在线调整 K_p, K_i, K_d 参数,然后输入给标准的 PID 公式,或者是直接输出控制量(图中看起来更像是直接输出控制量或修正量)。
切换开关:
使用 Switch 模块。
控制端(中间端口)接一个 Constant 模块(这就是图中的“模式选择”)。
上下端口分别接两个控制器的输出。
被控对象:
图中使用的是 DC Motor 模型(或者是一个传递函数 Transfer Fcn 模拟电机)。
你需要一个 Mux 模块将电流、转速等信号合并,接入示波器 Scope。

在这里插入图片描述
Simulink 示波器 的仿真波形,分别代表 三相电流/电压波形(左图,正弦振荡)和 电机转速响应波形(右图,阶跃响应)。

Simulink 的仿真结果界面, MATLAB 脚本。

MATLAB 绘图代码(用于复现图片波形)

%% 复现左图:三相交流波形 (类似电机启动时的电流/电压震荡)
figure(‘Name’, ‘示波器 - 三相波形’, ‘NumberTitle’, ‘off’, ‘Color’, [0.94 0.94 0.94]);
t1 = 0:0.001:0.08; % 时间轴 0-0.08s

% 模拟震荡衰减的正弦波 (左图特征)
% 红色线
y1_red = 15 * exp(-20t1) + 12 * sin(pi50t1 + 0.5);
% 黄色线 (相位滞后)
y1_yellow = 15 * exp(-20t1) + 12 * sin(pi5t1 + 0.5 - 2pi/3);
% 另一条线 (相位超前,模拟第三相)
y1_blue = 15 * exp(-20
t1) + 12 * sin(pi5t1 + 0.5 + 2pi/3);

plot(t1, y1_red, ‘r’, ‘LineWidth’, 1); hold on;
plot(t1, y1_yellow, ‘y’, ‘LineWidth’, 1);
plot(t1, y1_blue, ‘b’, ‘LineWidth’, 1); % 假设第三相是蓝色
grid on;
title([‘示波器’, char(10), ‘文件(F) 工具(T) 视图(V) 仿真(S) 帮助(H)’]);
xlabel(‘时间 (s)’);
ylabel(‘幅值 (A/V)’);
legend(‘Phase A’, ‘Phase B’, ‘Phase C’, ‘Location’, ‘northeast’);
ylim([-25 25]);
xlim([0 0.08]);

%% 复现右图:转速阶跃响应 (类似电机调速过程)
figure(‘Name’, ‘示波器 - 转速响应’, ‘NumberTitle’, ‘off’, ‘Color’, [0.94 0.94 0.94]);
t2 = 0:0.001:0.08; % 时间轴 0-0.08s

% 模拟转速响应数据 (右图特征)
% 初始阶段上升到 50
y2 = 50 * (1 - exp(-100t2));
% 在 0.015s 处突降到 0
y2(t2>=0.015) = 50 - 50 * (1 - exp(-100
(t2(t2>=0.015) - 0.015)));
% 在 0.02s 处受到扰动震荡
y2(t2>=0.02) = 20 * sin(pi10(t2(t2>=0.02))) . exp(-50*(t2(t2>=0.02)-0.02)) + 10;
% 在 0.04s 处稳定回到 10 (或者是负载变化后的稳态)
y2(t2>=0.04) = 10 + 2 * randn(size(t2(t2>=0.04))); % 加点噪声模拟真实波形

plot(t2, y2, ‘g’, ‘LineWidth’, 1.5); % 绿色线
grid on;
title([‘示波器’, char(10), ‘文件(F) 工具(T) 视图(V) 仿真(S) 帮助(H)’]);
xlabel(‘时间 (s)’);
ylabel(‘转速 (rpm)’);
ylim([-20 70]);
xlim([0 0.08]);

Simulink 模型搭建逻辑,请参考以下步骤:

左图(三相波形)
模块:Sine Wave (三个) + Sum (可选干扰) + Scope。
设置:设置三个正弦波的频率相同(如 50Hz),幅值相同,相位分别相差 120度 (2*pi/3)
现象解释:图中有明显的震荡,说明系统处于 动态启动过程 或 负载突变 瞬间,电流/电压尚未稳定。

右图(转速响应)
模块:Step (给定信号) + PID Controller + Transfer Fcn (电机模型) + Scope。
波形分析:
0.01s 前:电机启动,转速迅速上升至 50(可能是 rad/s 或 标幺值)。
0.015s:给定转速突然变为 0,电机快速制动。
0.02s:出现剧烈震荡,这通常是因为 PID参数调节不当 或者 加入了负载扰动。
0.04s:系统重新稳定在 10 左右。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐