使用matlab直观展示PID三个参数对系统响应的影响(matlab,GUI,可调PID参数)

前言

只是一个自己用来理解PID的小工具(也可当教学工具)
输入为单位阶跃响应

效果GIF

在这里插入图片描述

代码

close all
%P=11,I=1.36,D=11.2
global GUI
GUI.G = tf(2,[6 5 1]); 
GUI.KD=0;GUI.KP=1;GUI.KI=0;

GUI.h = figure('Name','PID调参','Position',[500 300 550 250],'NumberTitle','off', ...
               'MenuBar','none','Resize','off','Units','pixels');

GUI.button_kp1 = uicontrol('Parent',GUI.h,'Style','pushbutton','String','+','Position',[480 165 30 30],'Visible','on' ,...
                       'callback',@AddKp,'FontSize',16,'HorizontalAlignment','center');
GUI.button_kp2 = uicontrol('Parent',GUI.h,'Style','pushbutton','String','-','Position',[510 165 30 30],'Visible','on' ,...
                       'callback',@SubKp,'FontSize',16,'HorizontalAlignment','center');

GUI.button_ki1 = uicontrol('Parent',GUI.h,'Style','pushbutton','String','+','Position',[480 125 30 30],'Visible','on' ,...
                       'callback',@AddKi,'FontSize',16,'HorizontalAlignment','center');
GUI.button_ki2 = uicontrol('Parent',GUI.h,'Style','pushbutton','String','-','Position',[510 125 30 30],'Visible','on' ,...
                       'callback',@SubKi,'FontSize',16,'HorizontalAlignment','center');

GUI.button_kd1 = uicontrol('Parent',GUI.h,'Style','pushbutton','String','+','Position',[480 85 30 30],'Visible','on' ,...
                       'callback',@AddKd,'FontSize',16,'HorizontalAlignment','center');
GUI.button_kd2 = uicontrol('Parent',GUI.h,'Style','pushbutton','String','-','Position',[510 85 30 30],'Visible','on' ,...
                       'callback',@SubKd,'FontSize',16,'HorizontalAlignment','center');

GUI.text_kp = uicontrol('Parent',GUI.h,'Style','text','String','Kp:', 'Position',[400 160 30 30], ...
                 'FontSize',12,'FontWeight','bold','HorizontalAlignment','left');

GUI.edit_kp = uicontrol('Parent',GUI.h,'Style','edit','String','1', 'Position',[430 165 50 30], ...
                 'FontSize',12,'FontWeight','bold','Visible','on');

GUI.text_ki = uicontrol('Parent',GUI.h,'Style','text','String','Ki:', 'Position',[400 120 30 30], ...
                 'FontSize',12,'FontWeight','bold','HorizontalAlignment','left');

GUI.edit_ki = uicontrol('Parent',GUI.h,'Style','edit','String','0', 'Position',[430 125 50 30], ...
                 'FontSize',12,'FontWeight','bold','Visible','on');

GUI.text_kd = uicontrol('Parent',GUI.h,'Style','text','String','Kd:', 'Position',[400 80 30 30], ...
                 'FontSize',12,'FontWeight','bold','HorizontalAlignment','left');

GUI.edit_kd = uicontrol('Parent',GUI.h,'Style','edit','String','0', 'Position',[430 85 50 30], ...
                 'FontSize',12,'FontWeight','bold','Visible','on');

G1 = tf([GUI.KD, GUI.KP, GUI.KI], [1,0]);     % PID控制 (kd*s^2 + Kp*s + Ki) / s
sys = feedback(G1 * GUI.G, 1);        % 单位负反馈系统
step(sys);                        % 阶跃响应
axis([0 14 0 1.6]);
set(gca,'Position',[0.1 0.1 0.6 0.8]);
pos=axis;%取得当前坐标轴的范围,即[xmin xmax ymin ymax]
xlabel('time','FontSize',12, 'Position',[pos(2), pos(3)]);

function AddKp(~,~)
global GUI
kp0 = get(GUI.edit_kp,'string');
kp0 = str2double(kp0)+0.1;
kp0 = num2str(kp0);
set(GUI.edit_kp,'string',kp0)
kp0 = get(GUI.edit_kp,'string');
kp0 = str2double(kp0);
GUI.KP = kp0;
    
    G1 = tf([GUI.KD, GUI.KP, GUI.KI], [1,0]);     % PID控制 (kd*s^2 + Kp*s + Ki) / s
    sys = feedback(G1 * GUI.G, 1);        % 单位负反馈系统
    step(sys);                        % 阶跃响应
    axis([0 14 0 1.6]);

    set(gca,'Position',[0.1 0.1 0.6 0.8]);
    pos=axis;%取得当前坐标轴的范围,即[xmin xmax ymin ymax]
    xlabel('time','FontSize',12, 'Position',[pos(2), pos(3)]);

end

function AddKi(~,~)
global GUI
ki0 = get(GUI.edit_ki,'string');
ki0 = str2double(ki0)+0.02;
ki0 = num2str(ki0);
set(GUI.edit_ki,'string',ki0)
ki0 = get(GUI.edit_ki,'string');
ki0 = str2double(ki0);
GUI.KI = ki0;

G1 = tf([GUI.KD, GUI.KP, GUI.KI], [1,0]);     % PID控制 (kd*s^2 + Kp*s + Ki) / s
    sys = feedback(G1 * GUI.G, 1);        % 单位负反馈系统
    step(sys);                        % 阶跃响应
    axis([0 14 0 1.6]);

    set(gca,'Position',[0.1 0.1 0.6 0.8]);
    pos=axis;%取得当前坐标轴的范围,即[xmin xmax ymin ymax]
    xlabel('time','FontSize',12, 'Position',[pos(2), pos(3)]);

end

function AddKd(~,~)
global GUI
kd0 = get(GUI.edit_kd,'string');
kd0 = str2double(kd0)+0.1;
kd0 = num2str(kd0);
set(GUI.edit_kd,'string',kd0)
kd0 = get(GUI.edit_kd,'string');
kd0 = str2double(kd0);
GUI.KD = kd0;

G1 = tf([GUI.KD, GUI.KP, GUI.KI], [1,0]);     % PID控制 (kd*s^2 + Kp*s + Ki) / s
    sys = feedback(G1 * GUI.G, 1);        % 单位负反馈系统
    step(sys);                        % 阶跃响应
    axis([0 14 0 1.6]);

    set(gca,'Position',[0.1 0.1 0.6 0.8]);
    pos=axis;%取得当前坐标轴的范围,即[xmin xmax ymin ymax]
    xlabel('time','FontSize',12, 'Position',[pos(2), pos(3)]);

end

function SubKp(~,~)
global GUI
kp0 = get(GUI.edit_kp,'string');
kp0 = str2double(kp0)-0.1;
kp0 = num2str(kp0);
set(GUI.edit_kp,'string',kp0)
kp0 = get(GUI.edit_kp,'string');
kp0 = str2double(kp0);
GUI.KP = kp0;

G1 = tf([GUI.KD, GUI.KP, GUI.KI], [1,0]);     % PID控制 (kd*s^2 + Kp*s + Ki) / s
    sys = feedback(G1 * GUI.G, 1);        % 单位负反馈系统
    step(sys);                        % 阶跃响应
    axis([0 14 0 1.6]);

    set(gca,'Position',[0.1 0.1 0.6 0.8]);
    pos=axis;%取得当前坐标轴的范围,即[xmin xmax ymin ymax]
    xlabel('time','FontSize',12, 'Position',[pos(2), pos(3)]);

end

function SubKi(~,~)
global GUI
ki0 = get(GUI.edit_ki,'string');
ki0 = str2double(ki0)-0.02;
ki0 = num2str(ki0);
set(GUI.edit_ki,'string',ki0)
ki0 = get(GUI.edit_ki,'string');
ki0 = str2double(ki0);
GUI.KI = ki0;

G1 = tf([GUI.KD, GUI.KP, GUI.KI], [1,0]);     % PID控制 (kd*s^2 + Kp*s + Ki) / s
    sys = feedback(G1 * GUI.G, 1);        % 单位负反馈系统
    step(sys);                        % 阶跃响应
    axis([0 14 0 1.6]);

    set(gca,'Position',[0.1 0.1 0.6 0.8]);
    pos=axis;%取得当前坐标轴的范围,即[xmin xmax ymin ymax]
    xlabel('time','FontSize',12, 'Position',[pos(2), pos(3)]);

end

function SubKd(~,~)
global GUI
kd0 = get(GUI.edit_kd,'string');
kd0 = str2double(kd0)-0.1;
kd0 = num2str(kd0);
set(GUI.edit_kd,'string',kd0)
kd0 = get(GUI.edit_kd,'string');
kd0 = str2double(kd0);
GUI.KD = kd0;

G1 = tf([GUI.KD, GUI.KP, GUI.KI], [1,0]);     % PID控制 (kd*s^2 + Kp*s + Ki) / s
    sys = feedback(G1 * GUI.G, 1);        % 单位负反馈系统
    step(sys);                        % 阶跃响应
    axis([0 14 0 1.6]);

    set(gca,'Position',[0.1 0.1 0.6 0.8]);
    pos=axis;%取得当前坐标轴的范围,即[xmin xmax ymin ymax]
    xlabel('time','FontSize',12, 'Position',[pos(2), pos(3)]);

end

总结

复制代码到matlab运行就能用

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值