丫phetS 2020-08-18 15:07 采纳率: 0%
浏览 801

matlab中tfdata对有纯时延系统如何使用

%设一被控对象G(s)=50/(0.125s^2+7s),
%用增量式PID控制算法编写仿真程序
%(输入分别为单位阶跃、正弦信号,采样时间为1ms,控制器输出限幅:[-5,5],
% 仿真曲线包括系统输出及误差曲线,并加上注释、图例)。

clear all;
close all;
ts=0.001; %采样时间
sys=tf(50,[0.125,7, 0]); %tf是传递函数 即被控对象函数G();
dsys=c2d(sys,ts,'z'); %把控制函数离散化
[num,den,~]=tfdata(dsys,'v');% 离散化后提取分子、分母

u_1=0.0;
u_2=0.0;
y_1=0.0;
y_2=0.0;
x=[0,0,0]';
error_1=0;
error_2=0;
for k=1:1:1000
time(k)=k*ts; %采样次数
S=2;
if S==1
kp=10;ki=0.1;kd=15; %初始化PID

rin(k)=1; %Step Signal
elseif S==2
kp=10;ki=0.1;kd=15;

rin(k)=0.5*sin(2*pi*k*ts); %Sine Signal 即实际输入

end
du(k)=kp*x(1)+kd*x(2)+ki*x(3); %PID Controller 控制系数

u(k)=u_1+du(k); %Restricting the output of controller
if u(k)>=5

u(k)=5;
end
if u(k)<=-5
u(k)=-5;
end
%Linear model
yout(k)=(-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2); %实际输出
error(k)=rin(k)-yout(k); %Return of parameters 误差
u_2=u_1; %保存上上次输入 为下次计算
u_1=u(k); %保存上一次控制系数 为下次计算
y_2=y_1; %保存上上次次输出 为下次计算
y_1=yout(k); %保存上一次输出 为下次计算
x(1)=error(k)-error_1; %Calculating P
x(2)=error(k)-2*error_1+error_2; %Calculating D
x(3)=error(k); %Calculating I
error_2=error_1;

error_1=error(k);

end
figure(1);
plot(time,rin,'b',time,yout,'r'); %输入 和实际控制输出
xlabel('time(s)'),ylabel('rin,yout');
figure(2);
plot(time,error,'r') %输入与输出误差输出曲线
xlabel('time(s)');ylabel('error');

上述代码的transfer function中不含有time delay,如果对于sys=tf(50,[0.125,7, 0],'inputdelay',15); 该如何使用tfdata并修改公式计算yout?

  • 写回答

1条回答 默认 最新

  • zqbnqsdsmd 2020-08-20 21:53
    关注
    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!