增量式PID的matlab實現


首先,增量式PID的實現公式:

式中 Δe(k)=e(k)-e(k-1)

進一步可以改寫成

       

式中       、

 

為了便於理解,也可寫成:

式中e(k)為第k次采樣時的設定值與實際值的差,e(k-1)為上一次采樣時的設定值與實際值的差值,e(k-2)一樣類推。

所以增量式PID 輸出的是控制量的增量,無積分作用,因此該方法適用於執行機構帶積分部件的對象,如步進電機等,而位置式PID適用於執行機構不帶積分部件的對象,如電液伺服閥。

而且,由於增量式PID輸出的是控制量增量,如果計算機出現故障,誤動作影響較小,而執行機構本身有記憶功能,可仍保持原位,不會嚴重影響系統的工作,而位置式的輸出直接對應對象的輸出,

因此對系統影響較大。

下面是用Matlab 對增量式PID的仿真。

 1 %執行機構需要的是控制量的增量,例如驅動不僅電機的時候,采用增量式PID控制,
 2 %增量式PID控制算法中不需要累加,控制增量u(k)僅與最近k次的采樣有關,所以誤動作影響小。
 3 %設一被控對象G(s)=50/(0.125s^2+7s),  
 4 %用增量式PID控制算法編寫仿真程序  
 5 %(輸入分別為單位階躍、正弦信號,采樣時間為1ms,控制器輸出限幅:[-5,5],  
 6 %  仿真曲線包括系統輸出及誤差曲線,並加上注釋、圖例)。  
 7   
 8 clc;
 9 clear ;     
10 ts=0.001;                  %采樣時間  
11 %sys=tf(50,[0.125,7, 0]);  %tf是傳遞函數,用來實現G(s);  在自動控制領域經常用到,
12 sys=tf(400,[1,50,0]);   
13 dsys=c2d(sys,ts,'z');        %把控制函數離散化,轉化為拆分方程
14 [num,den]=tfdata(dsys,'v');  % 離散化后提取分子、分母 ,提取拆分方程系數   
15 u_1=0.0;  
16 u_2=0.0;  
17 y_1=0.0;  
18 y_2=0.0;  
19 x=[0,0,0]';  
20 error_1=0;  
21 error_2=0;  
22 for k=1:1:3000  
23 time(k)=k*ts;    %采樣次數  
24 
25 S=4;   %選擇需要跟蹤的函數
26 if S==1  
27    % kp=10;ki=0.1;kd=15;             %初始化PID
28     kp=8;ki=0.1;kd=10;
29     rin(k)=1;            %Step Signal ,階躍信號  
30 end
31 if S==2  
32     kp=10;ki=0.1;kd=15;               
33     rin(k)=0.5*sin(2*pi*k*ts);       %Sine Signal   正弦信號  
34 end    
35 if S==3          %三角波信號 
36      kp=10;ki=0.1;kd=15;
37      if mod(time(k),2)<1
38          rin(k)=mod(time(k),1);
39      else
40          rin(k)=1-mod(time(k),1);
41      end
42      rin(k)=rin(k)-0.5;
43 end
44 if S==4     %鋸齒波信號
45     kp=8;ki=0.05;kd=4; %測試得合適參數,如果輸出過沖,可將kd調小。
46     rin(k)=mod(time(k),1);
47 end
48  
49 du(k)=kp*x(1)+kd*x(2)+ki*x(3);      %PID Controller   控制系數    
50 u(k)=u_1+du(k); 
51 
52 if u(k)>=10         %Restricting the output of controller,輸出限幅
53    u(k)=10;  
54 end  
55 if u(k)<=-10  
56    u(k)=-10;  
57 end  
58 
59 %Linear model  
60 yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;          %實際輸出  
61 error(k)=rin(k)-yout(k);                                       %Return of parameters 誤差  
62 u_2=u_1;                                                       %保存上上次輸入   為下次計算  
63 u_1=u(k);                                                      %保存上一次控制系數   為下次計算  
64 y_2=y_1;                                                       %保存上上次次輸出   為下次計算  
65 y_1=yout(k);                                                   %保存上一次輸出   為下次計算  
66 
67 x(1)=error(k)-error_1;            %Calculating P  
68 x(2)=error(k)-2*error_1+error_2;  %Calculating D  
69 x(3)=error(k);                    %Calculating I  
70 
71 error_2=error_1;                      
72 error_1=error(k);                      
73 end  
74 
75 figure(1);  
76 plot(time,rin,'b',time,yout,'r');                        %輸入 和實際控制輸出  
77 xlabel('time(s)'),ylabel('rin,yout');   
78 % figure(2);  
79 % plot(time,error,'r')                                     %輸入與輸出誤差輸出曲線  
80 % xlabel('time(s)');ylabel('error');  

 

 對鋸齒信號的追蹤圖形:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM