使用MATLAB语言编写的模糊PID控制仿真

%PID
clear all
%采样时间
ts=1;
%K模糊控制表
dkp=[
6,6,6,5,4,4,4,3,3,2,0,0,0;
6,6,6,5,4,3,3,3,3,2,0,-1,-1;
6,6,6,5,4,3,3,3,3,2,0,-1,-2;
5,5,5,5,4,3,3,2,2,0,-1,-1,-2;
4,4,4,4,4,3,3,2,0,-1,-2,-2,-2;
4,4,4,3,3,2,2,0,-1,-1,-3,-3,-3;
4,4,4,3,3,2,0,-1,-2,-3,-3,-3,-3;
3,3,3,2,2,0,-1,-1,-2,-3,-3,-3,-3;
3,3,3,2,0,-1,-2,-2,-2,-3,-3,-3,-3;
3,2,2,0,-1,-1,-3,-3,-3,-3,-3,-4,-4;
3,2,0,-1,-2,-3,-3,-3,-3,-3,-3,-4,-6;
2,2,0,-1,-3,-3,-3,-3,-3,-4,-4,-4,-5;
0,0,0,-1,-3,-3,-3,-3,-3,-4,-6,-5,-6
];
dki=[-6,-5,-6,-4,-3,-3,-3,-3,-2,-1,0,0,0;
-5,-5,-5,-4,-3,-3,-3,-3,-2,-1,0,0,0;
-6,-5,-6,-4,-3,-3,-2,-2,-2,-1,0,0,0;
-5,-4,-4,-3,-3,-3,-2,-1,-1,0,2,2,2;
-6,-4,-3,-3,-2,-2,-2,-1,0,2,3,3,3;
-4,-4,-3,-3,-2,-1,-1,0,2,2,3,3,3;
-3,-3,-3,-3,-2,-1,0,2,3,3,4,4,4;
-3,-3,-3,-1,-1,0,2,2,3,3,4,5,5;
-3,-3,-2,-1,0,2,3,3,3,3,4,5,6;
-1,-1,-1,0,2,2,3,3,3,4,5,5,6;
0,0,0,2,3,3,3,3,4,5,6,6,6;
0,0,0,2,3,3,3,3,4,5,6,6,6;
0,0,0,2,3,3,4,4,4,5,6,6,6
];
dkd=[3,0,-2,-3,-6,-5,-6,-5,-6,-4,-3,0,3;
3,0,-2,-3,-5,-4,-4,-4,-4,-3,-3,0,2;
3,0,-2,-3,-6,-4,-3,-3,-3,-3,-2,-1,0;
2,0,-2,-3,-4,-4,-3,-3,-3,-3,-2,-1,0;
0,-1,-2,-3,-3,-3,-3,-3,-2,-2,-2,-1,0;
0,-1,-2,-3,-3,-3,-3,-3,-2,-2,-2,-1,0;
0,-1,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,0;
0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0;
0,0,0,0,0,0,0,0,0,0,0,0,0;
2,1,-1,0,2,2,2,2,2,2,2,2,2;
6,1,-2,0,3,3,3,3,3,3,3,4,6;
6,2,1,2,3,3,3,3,3,3,3,4,6;
6,5,4,4,4,4,4,3,3,3,3,4,6
];%KD查询表
sys=tf([1],[100,1],'inputdelay',10);
dsys=c2d(sys,ts,'zoh');
[num,den]=tfdata(dsys,'v');
u_1=0;u_2=0;u_3=0;u_4=0;u_5=0;u_6=0;u_7=0;u_8=0;u_9=0;u_10=0;
y_1=0;y_2=0;y_3=0;
error_1=0;error_2=0;
ei=0;te=0;tec=0;KPU=0.1;KPI=0.02;KPD=1.2;
for k=1:1:1000
    time(k)=k*ts;
    %离散化对象
    yout(k)=-den(2)*y_1+num(2)*u_10;
    rin(k)=15;
    error(k)=rin(k)-yout(k);
    ei=ei+error(k)*ts;
    derror(k)=error(k)-error_1;
    KE=1.2;KEC=6;kp=0.91035;
ki=0.026;kd=9.1;
    te=fix(KE*error(k));
tec=fix(KEC*derror(k));
if te>=7
    te=6;
end
if tec>=7
    tec=6;
end
kp=kp+KPU*dkp(te+7,tec+7);
ki=ki+KPI*dki(te+7,tec+7);
kd=kd+KPD*dkd(te+7,tec+7);
u(k)=kp*error(k)+ki*ei+kd*derror(k);
%控制器的限制输出
if u(k)>=110
    u(k)=110;
end
if u(k)<=-110
    u(k)=-110;
end
u_10=u_9;u_9=u_8;u_8=u_7;u_7=u_6;u_6=u_5;u_5=u_4;u_4=u_3;u_3=u_2;u_2=u_1;u_1=u(k);
y_3=y_2;y_2=y_1;y_1=yout(k);
error2=error_1;error_1=error(k);
end
plot(time,rin,'b',time,yout,'r');
xlabel('time(s)');ylabel('rin,yout');

如有疑问,请留言

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值