位置PID與增量PID控制原理(附帶matlab源碼)

一、位置式PID

  按照模擬PID控制算法,以一系列採樣時刻點KT代替連續時間t,用矩形法數值積分代替積分,以一階向後差分代替微分。

1、一系列採樣時刻點KT代替連續時間t

t=KT,(k=1、2、3.... 

2、用矩形法數值積分代替積分

\int_{0}^{t}error(t)d(t)\approx T\sum_{j=0}^{k}error(jT)=T\sum_{j=0}^{k}error(j)   

3、以一階向後差分代替微分

d(error)/d(t)=[error(k)-error(k-1)]/T

最後可得離散化的PID表達式

u(k)=kp*error(k)+ki\sum_{j=0}^{k}error(j)T+kd\frac{error(k)-error(k-1)}{T}

式中T爲採樣時間(採樣週期)

%設一被控對象G(s)=523500/(s^3+87.35s^2+10470S)
    %採樣時間爲1ms,採用z變換進行離散化
    clc
    clear
    ts=0.001;                 %採樣時間  
    sys=tf(523500,[1 87.35 10470 0]); %tf是傳遞函數  即被控對象函數G();  
    dsys=c2d(sys,ts,'z');    %把控制函數離散化取Z變換n階定常離散系統差分方程
                                %在零初始條件下取Z變換:
                                %dsys即Y(z)/U(z)
    [num,den]=tfdata(dsys,'v');% 離散化後提取分子、分母    
    
    u_1=0.0; u_2=0.0; u_3=0.0;   %z變換之後的係數
    y_1=0.0; y_2=0.0; y_3=0.0;  
    x=[0,0,0]';  %分別誤差e,誤差e的差分,誤差e的積分
    error_1=0;   %上一時刻誤差
 
    time=zeros(1,1000); %預分配內存
    yd=zeros(1,1000);
    u=zeros(1,1000);
    y=zeros(1,1000);
    error=zeros(1,1000);
    
    for k=1:1:1000  
    time(k)=k*ts;%離散化的時間代表連續時間
    yd(k)=1.0;%目標量
    kp=0.5;  
    ki=0.001;
    kd=0.001;
    
    u(k)=kp*x(1)+kd*x(2)+ki*x(3);%PID輸出

    if u(k)>=10
        u(k)=10;
    end
     if u(k)<=-10
        u(k)=-10;
     end

    %Linear model 難點就是把傳遞函數轉化爲差分方程,以實現PID控制。 
    y(k)=-den(2)*y_1-den(3)*y_2-den(4)*y_3+num(2)*u_1+num(3)*u_2+num(4)*u_3;          
 %實際輸出 num爲dsys分子多項式係數,den爲dsys分母多項式係數,從n階定常離散系統差分方程變化來的。
    error(k)=yd(k)-y(k);        % 誤差=輸入-輸出 
    u_3=u_2;
    u_2=u_1;  %保存上上次輸入   爲下次計算  
    u_1=u(k); %保存上一次控制係數   爲下次計算 
    y_3=y_2;                                         
    y_2=y_1;        %保存上上次次輸出   爲下次計算  
    y_1=y(k);    %保存上一次輸出   爲下次計算  

    x(1)=error(k);                  %KP的係數  
    x(2)=(error(k)-error_1)/ts;     %KD的係數  
    x(3)=x(3)+error(k)*ts;          %KI的係數
    error_1=error(k);                 
    end 

    figure(1);  
    plot(time,yd,'b',time,y,'r');               %輸入和實際控制輸出  
    xlabel('time(s)'),ylabel('y,yd');   
    title('輸入/輸出圖像對比')
    figure(2);  
    plot(time,error,'r')                            %時間誤差輸出曲線  
    xlabel('time(s)');ylabel('error'); 
    title('誤差變化')

二、增量式P

\bigtriangleup u(k)=u(k)-u(k-1)=

error(k)-error(k-1))+ki*error(k)+kd(error(k)-error(k-1)+error(k-2))

u(k+1)=u(k)+🔺u(k)

%設一被控對象G(s)=400/(s^2+50s)
%採樣時間爲1ms,採用z變換進行離散化

clc
clear

ts=0.001;%採樣時間
sys=tf(400,[1 50 0]);
dsys=c2d(sys,ts,'z');%採用z變換進行離散化
 %把控制函數離散化取Z變換n階定常離散系統差分方程
 %在零初始條件下取Z變換:
 %dsys即Y(z)/U(z)
[num,den]=tfdata(dsys,'v');%強制tfdata直接將分子和分母作爲行向量而不是單元格數組返回

u1=0;u2=0;u3=0;%z變換之後的係數
y1=0;y2=0;y3=0;
x=[0 0 0]';%分別誤差e,誤差e的差分,誤差e的積分
error1=0;
error2=0;

time=zeros(3000,1);%與分配內存
yd=zeros(3000,1);
u=zeros(3000,1);
y=zeros(3000,1);

for k=1:1:3000
    time(k)=k*ts;%離散化的時間代表連續時間
    yd(k)=1.0;%目標量
    kp=8;  
    ki=0.10;
    kd=10;
    
    u(k)=kp*x(1)+kd*x(2)+ki*x(3);%PID輸出
    u(k)=u1+u(k);
    
    if u(k)>=10
        u(k)=10;
    end
     if u(k)<=-10
        u(k)=-10;
     end
    %難點就是把傳遞函數轉化爲差分方程,以實現PID控制
    y(k)=-den(2)*y1-den(3)*y2+num(2)*u1+num(3)*u2; %離散表達式輸出
    %如果傳感器發生故障,u(k)發生大幅度變化,引起輸出的變化
    error=yd(k)-y(k);%誤差=輸入-輸出
    u1=u(k);u2=u1;u3=u2;
    y1=y(k);y2=y1;y3=y2;
    
    x(1)=error-error1;
    x(2)=error-2*error1+error2;
    x(3)=error;
    
    error2=error1;
    error1=error;
end
figure(1);
plot(time,yd,'r',time,y,'k','linewidth',2);
xlabel('time(s)');
ylabel('yd,y');
legend('Ideal Position value','tracking position value');

 

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