Matlab串联pid,分享一段PID代码

本帖最后由 PPT7204 于 2016-12-11 22:16 编辑

clear all;

close all;

% 初始化神经元输入信号

x=[0,0,0]';

% 初始化学习率参数

xiteP=0.5; xiteI=0.6; xiteD=0.5;

%初始化kp,ki,kd

wkp_1=0.1; wki_1=0.1; wkd_1=0.5;

% 初始化前两个时间单元的误差信号

error_1=0; error_2=0;

% 初始化前三个时间单元的输出信号

y_1=0;y_2=0;y_3=0;

% 初始化前三个时间单元的控制信号

u_1=0.0;u_2=0.0;u_3=0.0;

% 初始化采样时间

ts=0.001;

% sys=tf(300,[1,20,0]);

% dsys=c2d(sys,ts,'z');

% [num,den]=tfdata(dsys,'v');

% x=[0,0,0]';

for k=1:1:1000

time(k)=k*ts;

rin(k)=0.5*sign(sin(2*2*pi*k*ts));

yout(k)=1.5*y_1-0.7*y_2 + u_1+ 0.5*u_2;

error(k)=rin(k)-yout(k);

% 根据M的不同,选择不同的算法

wkp(k)=wkp_1+xiteP*u_1*x(1);

wki(k)=wki_1+xiteI*u_1*x(2);

wkd(k)=wkd_1+xiteD*u_1*x(3);

K=0.06;

x(1)=error(k)-error_1;

x(2)=error(k);

x(3)=error(k)-2*error_1+error_2;

wadd(k)=abs(wkp(k))+abs(wki(k))+abs(wkd(k));

w11(k)=wkp(k)/wadd(k);

w22(k)=wki(k)/wadd(k);

w33(k)=wkd(k)/wadd(k);

w=[w11(k),w22(k),w33(k)];

u(k)=u_1+K*w*x;

if u(k)>10

u(k)=10;

end

if u(k)

u(k)=-10;

end;

error_2=error_1;

error_1=error(k);

u_3=u_2;u_2=u_1;u_1=u(k);

y_3=y_2;y_2=y_1;y_1=yout(k);

wkp_1=wkp(k);

wki_1=wki(k);

wkd_1=wkd(k);

end

figure(1);

plot(time,rin,'b',time,yout,'r');

xlabel('t/s');ylabel('rin,yout');

figure(2);

subplot(311);

plot(time,wkp,'r');

xlabel('t/s');ylabel('wkp');

subplot(312);

plot(time,wki,'r');

xlabel('t/s');ylabel('wki');

subplot(313);

plot(time,wkd,'r');

xlabel('t/s');ylabel('wkd');

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值