首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MATLAB大作业选登-现代控制理论中的阶跃响应、PID控制、nyquist及bode图的绘制

[编者注:]“本程序为学习现代控制理论中阶跃响应、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)

七、原设计说明文档

八、文件目录结构

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OO-z2ooQAPfNqR2nua-dkVjg0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券