📄 optipid.m
字号:
function [Gm Pm mp tr ts ess]=optipid(x1,x2,x3)
%G(S)=kp+ki/s+kd*s
kp=x1;ki=x2;kd=x3;
%%%%%%%%%%%%%%%%%%%%%%%%% 需要更改 %%%%%%%%%%%%%%%%%%%%%%%%%
T=0.2;
[numz,denz]=pade(T,5);
numd=[0,0,0,0.1,10];dend=[0.0004,0.0454,0.555,1.51,11];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
numpid=[kd,kp,ki];denpid=[0,1,0];
num=conv(conv(numpid,numd),numz);
den1=conv(conv(dend,denpid),denz);
den2=conv(conv(numpid,numd),numz);
den=den1+den2;
G=tf(num,den); %高阶系统
Gk=tf(num,den1);
%%求在单位阶跃输入下,系统的性能指标.
%调用格式:[tr,ts,tp,overshoot]=stats(G,err_tol,ref)
%输入为系统对象: G
%输出: 上升时间(tr),调整时间(ts),峰值时间(tp),超调量(overshoot)
%ref 为期望输出,若未给定则默认为系统的稳态值。
%err_tol为误差限,默认为 2%
[Gm,Pm,Wg,Wp] = margin(Gk);
%[y,t]=step(G);
t=0:0.005:20;
y=step(G,t); %系统单位阶跃响应
ref = y(end);
ess=abs(ref-1);
[maxy,itp] = max(y); %寻找最大值点及其下标
%tp = t(itp); %根据最大值点下标求除峰值时间
mp = (maxy - ref)/ref; %求超调量
if mp < 0
mp = 0;
end
%********计算上升时间*************************
erorts=0.02;
i10 = min(find(y>=erorts*ref)); %上升到 10%时的下标
i90 = min(find(y>=(1-erorts)*ref)); %上升到 90%时的下标
if i10 > 1 & i90 < length(y)
t10 = t(i10) -(t(i10)-t(i10-1))*(y(i10)-erorts*ref)/(y(i10)-y(i10-1)); %10%时的时间
t90 = t(i90) - (t(i90)-t(i90-1))*(y(i90)-(1-erorts)*ref)/(y(i90)-y(i90-1)); %90%时的时间
tr = t90 - t10; %从 10%上升到 90%的时间,即上升时间
else
tr = 0;
end
%***************计算调整时间***********************
err_tol=0.02;
is = max(find(abs(y - ref*ones(size(y)))/ref>err_tol));
if is < length(y)
ts = t(is + 1);
else
ts = 0;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -