一看就懂,關於PID控制中yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;的理解

% clear ;
% clc ;
function [time,rin,yout]=PID_position(S)
%設一被控對象G(s)=5/(0.5*s^2+1*s),
% r ====> e ====>(Kp,Ki/s,Kd*s)====> u ====> y
%用位置式PID
%init
ts=0.001;                 %採樣時間
sys=tf(5,[0.5,1, 0]) %tf是傳遞函數  即被控對象函數G();
dsys=c2d(sys,ts,'z')   %把控制函數離散化取Z變換n階定常離散系統差分方程
%dsys即Y(z)/U(z)
[num,den]=tfdata(dsys,'v');% 離散化後提取分子、分母

u_1=0.0;u_2=0.0;u_3=0.0;
y_1=0.0;y_2=0.0;y_3=0.0;
x=[0,0,0]';
error_1=0;
% S=input('輸入信號選擇\n1:階躍信號, 2:方波信號 3:正弦信號 4.斜坡信號 5.拋物線信號\n');    %輸入信號選擇
% S=1;
%時間序列循環
for k=1:1:15000    %時間離散1500ms
time(k)=k*ts;
   
if S==1
    %    kp=0.02;    Ki=Kp/Ti; kd=Kp*Td
    kp=0.33*0.6;ki=kp/(1000*1.5);kd=kp*0.2*0.4;
%     kp=0.20;ki=0.001;kd=0.018;          
    rin(k)=1;                            %階躍信號
elseif S==2
    kp=1;ki=1;kd=15;          
    rin(k)=sign(sin(2*2*pi*k*ts));       %方波信號
elseif S==3
    kp=0.5;ki=0.01;kd=30;               %正弦信號 T=2*pi/4*pi=500ms
    rin(k)=0.5*sin(2*2*pi*k*ts); 
elseif S==4
    kp=1;ki=10;kd=5;          
    rin(k)=k;       %斜坡信號
elseif S==5
    kp=0.50;ki=8;kd=1;          
    rin(k)=0.5*k*k;       %拋物線信號
else 
    disp("input error!!!!!!")
    return;
end

u(k)=kp*x(1)+kd*x(2)+ki*x(3);   %PID Controller

%Restricting the output of controller 限制輸出
% if u(k)>=10       
%    u(k)=10;
% end
% if u(k)<=-10
%    u(k)=-10;
% end

%Linear model
yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;
% yout(k)=-den(1)*y_1-den(2)*y_2-den(3)*y_3+num(1)*u_1+num(2)*u_2+num(3)*u_3;

error(k)=rin(k)-yout(k); %輸入輸出差值,第k本輪誤差

%Return of parameters
u_3=u_2;u_2=u_1;u_1=u(k);
y_3=y_2;y_2=y_1;y_1=yout(k);  %更新輸出y
   
% u(k)=Kp*(e(k)-e(k-1))+Kd*[e(k)-e(k-1)-e(k-1)+e(k-2)]+Ki*e(k)
x(1)=error(k);                 %Calculating P  取Kp=1 ()
x(2)=(error(k)-error_1)/ts;  %Calculating D    ()
x(3)=x(3)+error(k)*ts;        %Calculating I   ()

error_1=error(k);
end

end
% figure(1);
% plot(time,rin,'b',time,yout,'r');
% legend('rin','yout')
% xlabel('time(s)'),ylabel('rin,yout');
% title('增量型pid(控制對象1)')%設置圖標題
% grid on%開啓網格
%     axis([0 5 0 2])

% figure(2);
% plot(time,error,'r')                            %時間誤差輸出曲線
% xlabel('time(s)');ylabel('error');

關於代碼yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;如下圖:在這裏插入圖片描述
因爲網上的大林算法
有個很🐕的錯誤,好氣就是這個:

% Plant  控制對象傳函:G(z)
sys1=tf([5],[0.1,0.7,1],'inputdelay',1);
dsys1=c2d(sys1,ts,'zoh')
[num1,den1]=tfdata(dsys1,'v');
[z,p,k]=zpkdata(dsys1);
% Z=[0;0.4346];
% P=[];
Gz=zpk(z,p,k,ts,'variable','z^-1')
%Ideal closed loop  理想脈衝傳函:fi(z)
sys2=tf([1],[0.15,1],'inputdelay',1);
dsys2=c2d(sys2,ts,'zoh');
%Design Dalin controller控制器函數:D(z)
dsys=1/Gz*dsys2/(1-dsys2);
% dsys=1/dsys1*dsys2/(1-dsys2);%!!!!!!!!!!!!!!!!!!!!!!就是這裏尷尬的報錯,就是網上相互抄的大林算法版本,據說是matlab版本新了導致的
[num,den]=tfdata(dsys,'v');


手賤放下效果:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章