[编者注:]“本程序为学习现代控制理论中阶跃响应、PID 控制、nyquist 及 bode 图的绘制而设计, 帮助同学们可以更好更直观的学习控制理论相关知识,让 PID 参数调节也更方便简洁。”这是尚同学在《设计说明》中提到的,确实,为社会提供应用程序,为他人着想,程序再复杂,再辛苦,也幸福和快乐。程序比较复杂,代码较多,今天给出了“代码”形式显示m文件。遗憾的是这么多参数要输入,没有给出缺省值,老师批改作业还要逐个输入,有时太专业的问题,老师还不知道应该输入啥,好在尚同学的大作业给出了设计说明文档,有实例。本程序控件太多,给出了对象浏览器视图。
一、设计说明
1、前言
本程序为学习现代控制理论中阶跃响应、PID控制、nyquist及bode图的绘制而设计,帮助同学们可以更好更直观的学习控制理论相关知识,让PID参数调节也更方便简洁。程序以matlab guide为框架设计,由于时间有限且技术不足,ui界面及功能略显简陋,后续有时间会将其完善。
在这里要感谢张老师的悉心教导,带领我们走进matlab的世界。他授课有趣幽默不致人烦闷,鼓励我们勇于创新不拘旧习。在他的感召下,我才鼓起勇气,将专业课所学与这门课结合,创造出不一样的风采。
下面是程序的简单介绍:
运行界面如图
[1]传递函数特性分析部分
在“分子系数”项输入传递函数分子部分多项式阶次由高到低系数矩阵,“分母系数”同理,选择开环或闭环,单击“计算”,可得到相关图像和系统参数。
例:分子系数1,分母系数[1 2 3],闭环,所得界面如下:
可得系统的阶跃响应图、超调量和各种时间参数。
上例由于是闭环系统,无伯德图和奈奎斯特图。设置开环,则可出现图像:
[2]PID参数遍历查找符合条件的值
对于一个特定的系统,合适的PID值可能需要试值法,或口诀推导。但如果我们有一个大致范围,就可通过软件遍历来实现合适值的寻找。通过设置起始值、步长(即公差或公比)、终止值,并确定等差或等比数列,点击“运行”,就可以获得符合条件的所有参数,并写入到一个Excel文件,保存在软件的安装目录中。“数量”中显示获得参数的数量。通过右侧KI=0,KD=0按钮,可以遍历PD系统、PI系统和P系统的参数。本软件针对课程项目,预先设置了合适条件为调节时间小于0.05s。如果进行更普遍的运用,可以增加一个条件选择窗口。
例:起始值0.001,步长10,终止值1000,等比数列。点击“生成”。
可以看到生成了203个符合条件的值。我们在当前目录中可以找到Excel文件,文件名以“Data-起始值-步长-终止值-等差/等比”命名,由于小数点会使文件的类型出现错误,故以“_”代替。
工作表里所有的值都符合条件。
[3]PID单一参数系统特性生成
为了验证某一组PID的性能,我们可以在此区域输入PID三组参数和针对课程项目的反馈回路的K参数,来观察右侧区域的性能展示。
例.输入KP=KI=KD=K=1。
[4]运行状态显示
在此区域内,会显示当前软件的运行状态,每一个状态都有相应提示音。在进行相关操作时或代码运行时,提示符为“Waiting”;在点击按钮运行结束之后,如果运行成功提示符为“Over”,如果运行失败(未按规则填写数据或漏选属性),则提示符为“Error”。
[5]控制系统特征参数显示
显示控制系统的超调量和各种时间参数。
[6]绘图区
绘制相关系统的阶跃响应图、伯德图、极坐标图。
二、程序设计界面(untitled1.fig)
三、程序运行界面
四、对象浏览器
五、程序代码(untitled1.m)
function varargout = untitled1(varargin)
% UNTITLED1 MATLAB code for untitled1.fig
% Last Modified by GUIDE v2.5 13-Nov-2021 18:13:59
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @untitled1_OpeningFcn, ...
'gui_OutputFcn', @untitled1_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
function[pos,tp,tr,ts2]=stepchar(y,t)
[mp,ind]=max(y);
dimt=length(t);
yss=y(dimt);
pos=100*(mp-yss)/yss;
tp=t(ind);
i=1;j=1;
while y(i)
i=i+1;
end
t1=t(i);
while y(j)
j=j+1;
end
t2=t(j);
tr=t2-t1;
i=dimt+1;
n=0;
while n==0
i=i-1;
if i==1
n=1;
elseif y(i)>=1.02*yss
n=1;
end
end
t1=t(i);i=dimt+1;n=0;
while n==0
i=i-1;
if y(i)
n=1;
end
t2=t(i);
if t1>t2
ts2=t1;
else
ts2=t2;
end
end
function untitled1_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
function varargout = untitled1_OutputFcn(hObject, eventdata, handles)
function Work_Callback(hObject, eventdata, handles)
set(handles.Show,'string',"Waiting");
[y,Fs]=audioread('sound.mp3');
player=audioplayer(y,Fs);
playblocking(player);
global begin_value step_length end_value
if((isempty(begin_value)||isempty(step_length)||isempty(end_value))==1)||((~get(handles.radiobutton1,'value'))&&(~get(handles.radiobutton2,'value')))
set(handles.Show,'string',"Error");
[y1,Fs1]=audioread('sound3.mp3');
player1=audioplayer(y1,Fs1);
playblocking(player1);
end
if(get(handles.radiobutton1,'value'))
type='Ar';
end
if(get(handles.radiobutton2,'value'))
type='Pr';
end
bv=get(handles.BeginValue,'string');
sl=get(handles.StepLength,'string');
ev=get(handles.EndValue,'string');
bv(bv=='.')='_';
sl(sl=='.')='_';
ev(ev=='.')='_';
DATA=['Data-',bv,'-',sl,'-',ev,'-',type];
numb=1;
xlswrite(DATA,["ts","KP","KI","KD","K"],['A',num2str(1),':E',num2str(1)]);
if(get(handles.radiobutton1,'value'))
for a=begin_value:step_length:end_value
KP=a;
for b=begin_value:step_length:end_value
if (get(handles.KIeqZero,'value'))
KI=0;
else
KI=b;
end
for c=begin_value:step_length:end_value
if (get(handles.KDeqZero,'value'))
KD=0;
else
KD=c;
end
for d=begin_value:step_length:end_value
if (get(handles.SetZero,'value'))
K=0;
else
K=d;
end
num=[5000*KD,5000*KP,5000*KI];
den=[1,(1020+5000*K*KD),(20000+5000*KD+5000*K*KP),(5000*KP+5000*K*KI),5000*KI];
G=tf(num,den);
[Y1,T1]=step(G);
[pos1,tp1,tr1,ts1] = stepchar(Y1,T1);
if(ts1
numb=numb+1;
xlswrite(DATA,[ts1,KP,KI,KD,K],['A',num2str(numb),':E',num2str(numb)]);
end
end
end
end
end
end
if(get(handles.radiobutton2,'value'))
for a=0:(log10(end_value/begin_value)/log10(step_length))
KP=begin_value*(step_length.^(a));
for b=0:(log10(end_value/begin_value)/log10(step_length))
if (get(handles.KIeqZero,'value'))
KI=0;
else
KI=begin_value*(step_length.^(b));
end
for c=0:(log10(end_value/begin_value)/log10(step_length))
if (get(handles.KDeqZero,'value'))
KD=0;
else
KD=begin_value*(step_length.^(c));
end
for d=0:(log10(end_value/begin_value)/log10(step_length))
if (get(handles.SetZero,'value'))
K=0;
else
K=begin_value*(step_length.^(d));
end
num=[5000*KD,5000*KP,5000*KI];
den=[1,(1020+5000*K*KD),(20000+5000*KD+5000*K*KP),(5000*KP+5000*K*KI),5000*KI];
G=tf(num,den);
[Y1,T1]=step(G);
[pos1,tp1,tr1,ts1] = stepchar(Y1,T1);
if(ts1
numb=numb+1;
xlswrite(DATA ,[ts1,KP,KI,KD,K],['A',num2str(numb),':E',num2str(numb)]);
end
end
end
end
end
end
set(handles.Show,'string',"Over");
set(handles.NumBer,'string',num2str(numb-1));
[y,Fs]=audioread('sound2.mp3');
player=audioplayer(y,Fs);
playblocking(player);
clearvars begin_value step_length end_value bv sl ev DATA numb num den G y Fs player
function NUM_Callback(hObject, eventdata, handles)
set(handles.Show,'string',"Waiting");
function NUM_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function DEN_Callback(hObject, eventdata, handles)
set(handles.Show,'string',"Waiting");
function DEN_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function BeginValue_Callback(hObject, eventdata, handles)
set(handles.Show,'string',"Waiting");
global begin_value
begin_value=str2double(get(handles.BeginValue,'string'));
function BeginValue_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function StepLength_Callback(hObject, eventdata, handles)
set(handles.Show,'string',"Waiting");
global step_length
step_length=str2double(get(handles.StepLength,'string'));
function StepLength_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function EndValue_Callback(hObject, eventdata, handles)
set(handles.Show,'string',"Waiting");
global end_value
end_value=str2double(get(handles.EndValue,'string'));
function EndValue_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function radiobutton1_Callback(hObject, eventdata, handles)
set(handles.radiobutton1,'value',1);
set(handles.radiobutton2,'value',0);
set(handles.Show,'string',"Waiting");
function radiobutton2_Callback(hObject, eventdata, handles)
set(handles.radiobutton1,'value',0);
set(handles.radiobutton2,'value',1);
set(handles.Show,'string',"Waiting");
function KP_Callback(hObject, eventdata, handles)
set(handles.Show,'string',"Waiting");
global kp
kp=str2double(get(handles.KP,'string'));
function KP_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function KI_Callback(hObject, eventdata, handles)
set(handles.Show,'string',"Waiting");
global ki
ki=str2double(get(handles.KI,'string'));
function KI_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function KD_Callback(hObject, eventdata, handles)
set(handles.Show,'string',"Waiting");
global kd
kd=str2double(get(handles.KD,'string'));
function KD_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function KK_Callback(hObject, eventdata, handles)
set(handles.Show,'string',"Waiting");
global kk
kk=str2double(get(handles.KK,'string'));
function KK_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function NumBer_Callback(hObject, eventdata, handles)
function NumBer_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function Show_Callback(hObject, eventdata, handles)
function Show_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function Calculate_Callback(hObject, eventdata, handles)
set(handles.Show,'string','Waiting');
[y,Fs]=audioread('sound.mp3');
player=audioplayer(y,Fs);
playblocking(player);
global G
num=str2num(get(handles.NUM,'string'));
den=str2num(get(handles.DEN,'string'));
if ((isempty(num)||isempty(den))==1)||((~get(handles.OpenLoop,'value'))&&(~get(handles.ClosedLoop,'value')))
set(handles.Show,'string',"Error");
[y1,Fs1]=audioread('sound3.mp3');
player1=audioplayer(y1,Fs1);
playblocking(player1);
end
w=logspace(-1,3,200);
if(get(handles.OpenLoop,'value'))
[num1,den1]=cloop(num,den,-1);
G1=tf(num,den);
G=tf(num1,den1);
axes(handles.axes1);
step(G);
axes(handles.axes2);
nyquist(G1);
axes(handles.axes3);
bode(G1,w);
end
if(get(handles.ClosedLoop,'value'))
G=tf(num,den);
axes(handles.axes1);
step(G);
G1=tf([1,0],[1,0]);
axes(handles.axes2)
nyquist(G1);
axes(handles.axes3)
bode(G1);
end
[Y,T]=step(G);
[pos,tp,tr,ts]=stepchar(Y,T);
Pos=num2str(pos);
Tp=num2str(tp);
Tr=num2str(tr);
Ts=num2str(ts);
set(handles.OS,'string',Pos);
set(handles.TP,'string',Tp);
set(handles.TR,'string',Tr);
set(handles.TS,'string',Ts);
set(handles.Show,'string','Over');
[y,Fs]=audioread('sound2.mp3');
player=audioplayer(y,Fs);
playblocking(player);
clearvars G y Fs player
function OpenLoop_Callback(hObject, eventdata, handles)
set(handles.OpenLoop,'value',1);
set(handles.ClosedLoop,'value',0);
function ClosedLoop_Callback(hObject, eventdata, handles)
set(handles.OpenLoop,'value',0);
set(handles.ClosedLoop,'value',1);
function TS_Callback(hObject, eventdata, handles)
function TS_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function TP_Callback(hObject, eventdata, handles)
function TP_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function TR_Callback(hObject, eventdata, handles)
function TR_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function OS_Callback(hObject, eventdata, handles)
function OS_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function MAKE_Callback(hObject, eventdata, handles)
set(handles.Show,'string',"Waiting");
[y,Fs]=audioread('sound.mp3');
player=audioplayer(y,Fs);
playblocking(player);
global kp ki kd kk
if (isempty(kp)||isempty(ki)||isempty(kd)||isempty(kk))==1
set(handles.Show,'string',"Error");
[y1,Fs1]=audioread('sound3.mp3');
player1=audioplayer(y1,Fs1);
playblocking(player1);
end
num=[5000*kd,5000*kp,5000*ki];
den=[1,(1020+5000*kk*kd),(20000+5000*kd+5000*kk*kp),(5000*kp+5000*kk*ki),5000*ki];
G=tf(num,den);
axes(handles.axes1);
step(G);
num2=conv([5000*kd,5000*kp,5000*ki],[kk,1]);
den2=conv([1,20,0,0],[1,1000]);
G2=tf(num2,den2);
axes(handles.axes2);
nyquist(G2);
axes(handles.axes3);
w=logspace(-1,3,200);
bode(G2,w);
[Y1,T1]=step(G);
[pos,tp,tr,ts] = stepchar(Y1,T1);
Pos=num2str(pos);
Tp=num2str(tp);
Tr=num2str(tr);
Ts=num2str(ts);
set(handles.OS,'string',Pos);
set(handles.TP,'string',Tp);
set(handles.TR,'string',Tr);
set(handles.TS,'string',Ts);
set(handles.Show,'string',"Over");
[y,Fs]=audioread('sound2.mp3');
player=audioplayer(y,Fs);
playblocking(player);
clearvars kp ki kd kk num den G G2 y Fs player
function figure1_CreateFcn(hObject, eventdata, handles)
ha=axes('units','normalized','pos',[0 0 1 1]);
uistack(ha,'down');
ii=imread('background.jpg');
image(ii);
colormap gray
set(ha,'handlevisibility','off','visible','on');
function figure1_ButtonDownFcn(hObject, eventdata, handles)
function SetZero_Callback(hObject, eventdata, handles)
function KIeqZero_Callback(hObject, eventdata, handles)
function KDeqZero_Callback(hObject, eventdata, handles)
六、以代码的形式查看m文件(untitled1.m)
说明:因关键字显示与matlab编辑器不同,一般不采用代码形式。
function varargout = untitled1(varargin)
% UNTITLED1 MATLAB code for untitled1.fig
% Last Modified by GUIDE v2.5 13-Nov-2021 18:13:59
% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @untitled1_OpeningFcn, ...
'gui_OutputFcn', @untitled1_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT
function[pos,tp,tr,ts2]=stepchar(y,t)
[mp,ind]=max(y);
dimt=length(t);
yss=y(dimt);
pos=100*(mp-yss)/yss;
tp=t(ind);
i=1;j=1;
while y(i)
i=i+1;
end
t1=t(i);
while y(j)
j=j+1;
end
t2=t(j);
tr=t2-t1;
i=dimt+1;
n=0;
while n==0
i=i-1;
if i==1
n=1;
elseif y(i)>=1.02*yss
n=1;
end
end
t1=t(i);i=dimt+1;n=0;
while n==0
i=i-1;
if y(i)
n=1;
end
t2=t(i);
if t1>t2
ts2=t1;
else
ts2=t2;
end
end
function untitled1_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
function varargout = untitled1_OutputFcn(hObject, eventdata, handles)
function Work_Callback(hObject, eventdata, handles)
set(handles.Show,'string',"Waiting");
[y,Fs]=audioread('sound.mp3');
player=audioplayer(y,Fs);
playblocking(player);
global begin_value step_length end_value
if((isempty(begin_value)||isempty(step_length)||isempty(end_value))==1)||((~get(handles.radiobutton1,'value'))&&(~get(handles.radiobutton2,'value')))
set(handles.Show,'string',"Error");
[y1,Fs1]=audioread('sound3.mp3');
player1=audioplayer(y1,Fs1);
playblocking(player1);
end
if(get(handles.radiobutton1,'value'))
type='Ar';
end
if(get(handles.radiobutton2,'value'))
type='Pr';
end
bv=get(handles.BeginValue,'string');
sl=get(handles.StepLength,'string');
ev=get(handles.EndValue,'string');
bv(bv=='.')='_';
sl(sl=='.')='_';
ev(ev=='.')='_';
DATA=['Data-',bv,'-',sl,'-',ev,'-',type];
numb=1;
xlswrite(DATA,["ts","KP","KI","KD","K"],['A',num2str(1),':E',num2str(1)]);
if(get(handles.radiobutton1,'value'))
for a=begin_value:step_length:end_value
KP=a;
for b=begin_value:step_length:end_value
if (get(handles.KIeqZero,'value'))
KI=0;
else
KI=b;
end
for c=begin_value:step_length:end_value
if (get(handles.KDeqZero,'value'))
KD=0;
else
KD=c;
end
for d=begin_value:step_length:end_value
if (get(handles.SetZero,'value'))
K=0;
else
K=d;
end
num=[5000*KD,5000*KP,5000*KI];
den=[1,(1020+5000*K*KD),(20000+5000*KD+5000*K*KP),(5000*KP+5000*K*KI),5000*KI];
G=tf(num,den);
[Y1,T1]=step(G);
[pos1,tp1,tr1,ts1] = stepchar(Y1,T1);
if(ts1
numb=numb+1;
xlswrite(DATA,[ts1,KP,KI,KD,K],['A',num2str(numb),':E',num2str(numb)]);
end
end
end
end
end
end
if(get(handles.radiobutton2,'value'))
for a=0:(log10(end_value/begin_value)/log10(step_length))
KP=begin_value*(step_length.^(a));
for b=0:(log10(end_value/begin_value)/log10(step_length))
if (get(handles.KIeqZero,'value'))
KI=0;
else
KI=begin_value*(step_length.^(b));
end
for c=0:(log10(end_value/begin_value)/log10(step_length))
if (get(handles.KDeqZero,'value'))
KD=0;
else
KD=begin_value*(step_length.^(c));
end
for d=0:(log10(end_value/begin_value)/log10(step_length))
if (get(handles.SetZero,'value'))
K=0;
else
K=begin_value*(step_length.^(d));
end
num=[5000*KD,5000*KP,5000*KI];
den=[1,(1020+5000*K*KD),(20000+5000*KD+5000*K*KP),(5000*KP+5000*K*KI),5000*KI];
G=tf(num,den);
[Y1,T1]=step(G);
[pos1,tp1,tr1,ts1] = stepchar(Y1,T1);
if(ts1
numb=numb+1;
xlswrite(DATA ,[ts1,KP,KI,KD,K],['A',num2str(numb),':E',num2str(numb)]);
end
end
end
end
end
end
set(handles.Show,'string',"Over");
set(handles.NumBer,'string',num2str(numb-1));
[y,Fs]=audioread('sound2.mp3');
player=audioplayer(y,Fs);
playblocking(player);
clearvars begin_value step_length end_value bv sl ev DATA numb num den G y Fs player
function NUM_Callback(hObject, eventdata, handles)
set(handles.Show,'string',"Waiting");
function NUM_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function DEN_Callback(hObject, eventdata, handles)
set(handles.Show,'string',"Waiting");
function DEN_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function BeginValue_Callback(hObject, eventdata, handles)
set(handles.Show,'string',"Waiting");
global begin_value
begin_value=str2double(get(handles.BeginValue,'string'));
function BeginValue_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function StepLength_Callback(hObject, eventdata, handles)
set(handles.Show,'string',"Waiting");
global step_length
step_length=str2double(get(handles.StepLength,'string'));
function StepLength_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function EndValue_Callback(hObject, eventdata, handles)
set(handles.Show,'string',"Waiting");
global end_value
end_value=str2double(get(handles.EndValue,'string'));
function EndValue_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function radiobutton1_Callback(hObject, eventdata, handles)
set(handles.radiobutton1,'value',1);
set(handles.radiobutton2,'value',0);
set(handles.Show,'string',"Waiting");
function radiobutton2_Callback(hObject, eventdata, handles)
set(handles.radiobutton1,'value',0);
set(handles.radiobutton2,'value',1);
set(handles.Show,'string',"Waiting");
function KP_Callback(hObject, eventdata, handles)
set(handles.Show,'string',"Waiting");
global kp
kp=str2double(get(handles.KP,'string'));
function KP_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function KI_Callback(hObject, eventdata, handles)
set(handles.Show,'string',"Waiting");
global ki
ki=str2double(get(handles.KI,'string'));
function KI_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function KD_Callback(hObject, eventdata, handles)
set(handles.Show,'string',"Waiting");
global kd
kd=str2double(get(handles.KD,'string'));
function KD_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function KK_Callback(hObject, eventdata, handles)
set(handles.Show,'string',"Waiting");
global kk
kk=str2double(get(handles.KK,'string'));
function KK_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function NumBer_Callback(hObject, eventdata, handles)
function NumBer_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function Show_Callback(hObject, eventdata, handles)
function Show_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function Calculate_Callback(hObject, eventdata, handles)
set(handles.Show,'string','Waiting');
[y,Fs]=audioread('sound.mp3');
player=audioplayer(y,Fs);
playblocking(player);
global G
num=str2num(get(handles.NUM,'string'));
den=str2num(get(handles.DEN,'string'));
if ((isempty(num)||isempty(den))==1)||((~get(handles.OpenLoop,'value'))&&(~get(handles.ClosedLoop,'value')))
set(handles.Show,'string',"Error");
[y1,Fs1]=audioread('sound3.mp3');
player1=audioplayer(y1,Fs1);
playblocking(player1);
end
w=logspace(-1,3,200);
if(get(handles.OpenLoop,'value'))
[num1,den1]=cloop(num,den,-1);
G1=tf(num,den);
G=tf(num1,den1);
axes(handles.axes1);
step(G);
axes(handles.axes2);
nyquist(G1);
axes(handles.axes3);
bode(G1,w);
end
if(get(handles.ClosedLoop,'value'))
G=tf(num,den);
axes(handles.axes1);
step(G);
G1=tf([1,0],[1,0]);
axes(handles.axes2)
nyquist(G1);
axes(handles.axes3)
bode(G1);
end
[Y,T]=step(G);
[pos,tp,tr,ts]=stepchar(Y,T);
Pos=num2str(pos);
Tp=num2str(tp);
Tr=num2str(tr);
Ts=num2str(ts);
set(handles.OS,'string',Pos);
set(handles.TP,'string',Tp);
set(handles.TR,'string',Tr);
set(handles.TS,'string',Ts);
set(handles.Show,'string','Over');
[y,Fs]=audioread('sound2.mp3');
player=audioplayer(y,Fs);
playblocking(player);
clearvars G y Fs player
function OpenLoop_Callback(hObject, eventdata, handles)
set(handles.OpenLoop,'value',1);
set(handles.ClosedLoop,'value',0);
function ClosedLoop_Callback(hObject, eventdata, handles)
set(handles.OpenLoop,'value',0);
set(handles.ClosedLoop,'value',1);
function TS_Callback(hObject, eventdata, handles)
function TS_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function TP_Callback(hObject, eventdata, handles)
function TP_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function TR_Callback(hObject, eventdata, handles)
function TR_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function OS_Callback(hObject, eventdata, handles)
function OS_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function MAKE_Callback(hObject, eventdata, handles)
set(handles.Show,'string',"Waiting");
[y,Fs]=audioread('sound.mp3');
player=audioplayer(y,Fs);
playblocking(player);
global kp ki kd kk
if (isempty(kp)||isempty(ki)||isempty(kd)||isempty(kk))==1
set(handles.Show,'string',"Error");
[y1,Fs1]=audioread('sound3.mp3');
player1=audioplayer(y1,Fs1);
playblocking(player1);
end
num=[5000*kd,5000*kp,5000*ki];
den=[1,(1020+5000*kk*kd),(20000+5000*kd+5000*kk*kp),(5000*kp+5000*kk*ki),5000*ki];
G=tf(num,den);
axes(handles.axes1);
step(G);
num2=conv([5000*kd,5000*kp,5000*ki],[kk,1]);
den2=conv([1,20,0,0],[1,1000]);
G2=tf(num2,den2);
axes(handles.axes2);
nyquist(G2);
axes(handles.axes3);
w=logspace(-1,3,200);
bode(G2,w);
[Y1,T1]=step(G);
[pos,tp,tr,ts] = stepchar(Y1,T1);
Pos=num2str(pos);
Tp=num2str(tp);
Tr=num2str(tr);
Ts=num2str(ts);
set(handles.OS,'string',Pos);
set(handles.TP,'string',Tp);
set(handles.TR,'string',Tr);
set(handles.TS,'string',Ts);
set(handles.Show,'string',"Over");
[y,Fs]=audioread('sound2.mp3');
player=audioplayer(y,Fs);
playblocking(player);
clearvars kp ki kd kk num den G G2 y Fs player
function figure1_CreateFcn(hObject, eventdata, handles)
ha=axes('units','normalized','pos',[0 0 1 1]);
uistack(ha,'down');
ii=imread('background.jpg');
image(ii);
colormap gray
set(ha,'handlevisibility','off','visible','on');
function figure1_ButtonDownFcn(hObject, eventdata, handles)
function SetZero_Callback(hObject, eventdata, handles)
function KIeqZero_Callback(hObject, eventdata, handles)
function KDeqZero_Callback(hObject, eventdata, handles)
七、原设计说明文档
八、文件目录结构
领取专属 10元无门槛券
私享最新 技术干货