前言
只是一个自己用来理解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运行就能用