该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我照着网上的程序自己改出来的程序是这样的
clc;
clear ;
ts=0.001; %采样时间
sys=tf(-53,[19926,100],’ioDelay’,540); %tf是传递函数,用来实现G(s); 在自动控制领域经常用到,
dsys=c2d(sys,ts,’z’); %把控制函数离散化,转化为拆分方程
[num,den]=tfdata(dsys,’v’); % 离散化后提取分子、分母 ,提取拆分方程系数
u_0=0.0;
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:1000000
time(k)=k*ts; %采样次数
S=1; %选择需要跟踪的函数
if S==1
kp=-2.5237;ki=-025316;kd=18.2627; %初始化PID
rin(k)=1; %Step Signal ,阶跃信号
end
if S==2
kp=x;ki=x;kd=x;
rin(k)=0.5*sin(2*pi*k*ts); %Sine Signal 正弦信号
end
if S==3 %三角波信号
kp=x;ki=x;kd=x;
if mod(time(k),2)<1
rin(k)=mod(time(k),1);
else
rin(k)=1-mod(time(k),1);
end
rin(k)=rin(k)-0.5;
end
if S==4 %锯齿波信号
kp=x;ki=x;kd=x; %测试得合适参数,如果输出过冲,可将kd调小。
rin(k)=mod(time(k),1);
end
du(k)=kp*x(1)+kd*x(2)+ki*x(3); %PID Controller 控制系数
u(k)=u_1+du(k);
%Linear model
yout(k)=-den(2)*y_1+num(1)*u_0+num(2)*u_1; %实际输出
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’);
axis([0,1000,0,1.2]);
% figure(2);
% plot(time,error,’r’) %输入与输出误差输出曲线
% xlabel(‘time(s)’);ylabel(‘error’);
得到的图形是这样的
我用Simulink得到的图是这样的
有大佬告诉我一下我的程序哪里出错了吗
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/185896.html原文链接:https://javaforall.cn
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有