資源簡介
關于串級控制的matlab實現(xiàn),一般書本上都是利用simulink搭建相應的控制回路,本程序則是通過m語言實現(xiàn)的,并且實現(xiàn)了手自動無擾切換,還加上了前饋控制。

代碼片段和文件信息
clear
clc
pidBlock(1)=struct(‘blockName‘‘LIC1002‘‘direct‘1‘AMC‘‘AUT‘‘SP‘0‘PV‘0‘MV‘0‘Kc‘58‘Ti‘0.3‘Td‘0.075‘spanHigh‘2.52‘spanLow‘0‘E0‘0‘E1‘0‘E2‘0);
pidBlock(2)=struct(‘blockName‘‘LIC1001‘‘direct‘1‘AMC‘‘AUT‘‘SP‘70‘PV‘0‘MV‘0‘Kc‘8‘Ti‘2‘Td‘0.1‘spanHigh‘2.52‘spanLow‘0‘E0‘0‘E1‘0‘E2‘0);
%部分參數(shù)的值
H1=1.5;H2=1.4;
ku=0.2;A=2;
R12=2*sqrt(1.5)/0.20412;
R2=2*sqrt(1.4)/0.21129;
ts=0.1;
Qd1=0.15;Qd2=0.05;
%第一個水箱離散化
sys1=tf(R12*ku[R12*A1]);
dsys1=c2d(sys1ts‘z‘);
[num1den1]=tfdata(dsys1‘v‘);
%第二個水箱離散化
sys2=tf(R2[R12*R2*AR12]);
dsys2=c2d(sys2ts‘z‘);
[num2den2]=tfdata(dsys2‘v‘);
%擾動Qd1
sys3=tf(R12[R12*A1]);
dsys3=c2d(sys3ts‘z‘);
[num3den3]=tfdata(dsys3‘v‘);
%擾動Qd2
sys4=tf(R2[R2*A1]);
dsys4=c2d(sys4ts‘z‘);
[num4den4]=tfdata(dsys4‘v‘);
%前饋控制器
sys5=-sys4;
dsys5=c2d(sys5ts‘z‘);
[num5den5]=tfdata(dsys5‘v‘);
%初值
w=0;u1_1=0.5;u2_1=0;h1_1=0;h2_1=0;dh1_1=0;dh2_1=0;dh2f_1=0;
pidBlock(1).SP=pidBlock(1).SP/100*(pidBlock(1).spanHigh-pidBlock(1).spanLow)+pidBlock(1).spanLow-H1;%H1的實際偏差輸入值
pidBlock(2).SP=pidBlock(2).SP/100*(pidBlock(2).spanHigh-pidBlock(2).spanLow)+pidBlock(2).spanLow-H2;%H2的實際偏差輸入值
%程序
for?k=1:1:1000
????rin(k)=1;
????time(k)=k*ts;
????du1(k)=pidBlock(2).Kc*[(pidBlock(2).E0-pidBlock(2).E1)+ts/pidBlock(2).Ti*pidBlock(2).E0+pidBlock(2).Td*(pidBlock(2).E0-2*pidBlock(2).E1+pidBlock(2).E2)/ts];
????u1(k)=u1_1+du1(k);
????du2(k)=pidBlock(1).Kc*[(pidBlock(1).E0-pidBlock(1).E1)+ts/pidBlock(1).Ti*pidBlock(1).E0+pidBlock(1).Td*(pidBlock(1).E0-2*pidBlock(1).E1+pidBlock(1).E2)/ts];
????u2(k)=u2_1+du2(k);
????
????dh1(k)=-den3(2)*dh1_1+num3(2)*Qd1;%擾動Qd1的輸出
????dh2(k)=-den4(2)*dh2_1+num4(2)*Qd2;%擾動Qd2的輸出
????dh2f(k)=-den5(2)*dh2f_1+num5(2)*Qd2;%前饋控制器輸出
????
????h1(k)=-den1(2)*h1_1+num1(2)*pidBlock(1).MV*pidBlock(1).direct+dh1(k);?
????%h2(k)=-den2(2)*h2_1+num2(2)*h1(k)*pidBlock(2).direct+dh2(k);%無前饋控制器
????h2(k)=-den2(2)*h2_1+num2(2)*h1(k)*pidBlock(2).direct+dh2(k)+dh2f(k);%有前饋控制器
????
????pidBlock(2).PV=h2(k);
????pidBlock(2)=pid_function(pidBlock(2)u1(k));
???
????pidBlock(1).SP=u1(k);
????pidBlock(1).PV=h1(k);
????pidBlock(1)=pid_function(pidBlock(1)u2(k));
????dh1_1=dh1(1);
????dh2_1=dh2(k);
????dh2f_1=dh2f(k);
????u1_1=u1(k);
????u2_1=u2(k);
????h1_1=h1(k);
????h2_1=h2(k);
????
????%將求出的h1(k)h2(k)化為百分數(shù)
????y1(k)=(h1(k)+H1-pidBlock(2).spanLow)/(pidBlock(2).spanHigh-pidBlock(2).spanLow)*100;
????y2(k)=(h2(k)+H2-pidBlock(1).spanLow)/(pidBlock(1).spanHigh-pidBlock(1).spanLow)*100;
end
plot(timey2);
xlabel(‘時間/s‘);
ylabel(‘第二個水箱液位H2‘);
title(‘擾動Qd2變化前的階躍響應曲線‘);
grid
????
????
????
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2013-06-12?12:39??串級控制的Matlab實現(xiàn)\
?????文件????????2796??2013-01-30?14:59??串級控制的Matlab實現(xiàn)\main.m
?????文件?????????320??2013-01-27?16:16??串級控制的Matlab實現(xiàn)\pid_function.m
- 上一篇:三相逆變器并聯(lián)仿真
- 下一篇:B樣條小波的實現(xiàn)
評論
共有 條評論