久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4780|回復: 1
打印 上一主題 下一主題
收起左側

MATLAB單回路控制系統參數PID整定實現及代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:667940 發表于 2020-6-19 10:26 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
參數整定要求
通過整定選擇合適的參數,首先要保證系統穩定,這時最基本的要求
在熱工生產過程中,通常要求控制系統有一定穩定裕度,即要求過程有一定的衰減比,一般為4:1~10:1
在保證穩定的前提下,要求控制過程有一定的快速性和準確性.所謂快速性就是要求控制系統的動態偏差(余差)盡量的小,而快速性就是要求控制過程的時間盡可能地短.
常用整定方法
當閉環特征方程為二階時,可以通過理論計算求出各參數與衰減比的對應關系
如上圖: 被控對象的傳遞函數為 ,采用比例控制器為,求解合適的比例帶δ值,使得系統衰減比為4:1;
解:
1.求得系統閉環傳遞函數為:
==
2. 已知衰減率φ為:
系統閉環特征方程為:
=
則         α=,將其代入上式,可得比例帶
=0.665=66.5%
工程整定方法
A  經驗法(試湊法)
試湊法的整定步驟如下所述:
1)先采用比例作用,設置積分時間T1=∞微分時間TD=0,根據經驗設置比例帶δ,將系統投入閉環運行,穩定后做階躍擾動試驗,改變比例帶δ值,使被調量的階躍響應曲線出現4:1衰減震蕩,記錄此時的比例帶δ
2)比例積分作用: 在1)的基礎上,首先將δ增大10%~20%,做階躍擾動試驗,然后將積分時間Ti 由大到小的變化,直到得到4:1衰減曲線為止.先增加比例帶的原因是加入積分后,系統穩定性,比原來單純比例調節時要降低,增加δ補償加積分作用后而引起得穩定性的降低.
3)積分時間保持不變,加入比例帶,觀察控制過程有無改善,如有改善則繼續調整,直到滿意為止.否則,將原比例帶減小一些,再調整積分時間,力求改善控制過程.如此反復試湊,直到找到滿意的比例帶和積分時間為止.
4)最后再加入微分作用,將微分時間TD 由小到大的調整.觀察每次實驗過程,直到滿意為止.
根據上述思路,寫出代碼如下:
  1. % 主函數
  2. % 初始化pid參數
  3. kp=1; ti=1e32; td=0;
  4. % 定義狀態值,方便debug
  5. status = 0;                            % 狀態: 0-未整定,1-整定好p,2-整定好i,3-整定好d,整定完成
  6. gg0=getLoop(kp, ti, td);
  7. figure
  8. step(gg0);
  9. hold on
  10. % 整定p, 調整衰減比接近4:1            
  11. while getDelta(kp, ti, td)>4
  12.               % getDelta([kp, ti, td])
  13.               kp = kp*1.01;              % kp增大,衰減比減小
  14. end
  15. status = 1
  16. gg1=getLoop(kp, ti, td);
  17. step(gg1);
  18. hold on
  19. % 整定i, 調整衰減比接近4:1            
  20. kp = kp * 0.9;              % 減小kp,補償引入積分作用造成的穩定性下降
  21. while getDelta(kp, ti, td)>4
  22.               % getDelta([kp, ti, td])
  23.               ti = ti*0.9;
  24. end
  25. status = 2
  26. gg2=getLoop(kp, ti, td);
  27. step(gg2);
  28. hold on
  29. % 整定d, 調整衰減比接近4:1
  30. kp = kp * 0.9;              % 減小kp,補償引入積分作用造成的穩定性下降
  31. td=1e-32;
  32. while getDelta(kp, ti, td)>4
  33. %               td
  34. %               getDelta(kp, ti, td)
  35.               td = td*1.1;
  36. end
  37. status = 3
  38. gg3=getLoop(kp, ti, td);
  39. step(gg3);
  40. legend('intianl respond','respond after setting p','respond after setting i','respond after setting d');
  41. hold off
  42. % 返回pid參數為[kp, ti, td]的閉環控制系統的回路方程
  43. function gg = getLoop(kp, ti, td)
  44.     % 構建方程
  45.               g = tf(25, conv([4 1], [20 1]));                            % 開環系統
  46.               gc_p = tf(kp, 1);                                          % p控制
  47.               gc_i = tf(kp, [ti 0]);                            % i控制
  48.               gc_d = tf([kp*td 0], 1);              % d控制
  49.               gc = parallel(parallel(gc_p, gc_i), gc_d);              % pid控制器
  50.               gg = feedback(series(g, gc), 1);                            % 總控制系統
  51. end
  52. % 計算pid參數為[kp, ti, td]的閉環控制系統的階躍響應衰減比
  53. function delta = getDelta(kp, ti, td)
  54.     % 得到控制系統階躍響應曲線
  55.               gg = getLoop(kp, ti, td);
  56.               Y = step(gg);
  57.               % 計算衰減比
  58.               V = findpeaks(Y);
  59.               delta = (V(1)-Y(end))/(V(2)-Y(end));
  60. end
復制代碼


下圖是四步整定之后,閉環控制系統的階躍響應曲線:
由圖中曲線可知,每一步整定完成之后,閉環控制系統的準確性和快速性都略有上升.
B 臨界比例帶法(邊界穩定法)
臨界比例帶法的應用較為廣泛,將控制器設置為純比例作用,將系統自動投入運行并將比例帶由大到小進行改變,直到產生等幅振蕩為止,此時控制系統處于邊界穩定狀態,記錄下此刻的比例帶 和振蕩周期Tcr ,然后根據下表中的經驗公式進行計算,算出控制器的各個參數.
控制規律
Ti
Td
P
2
-
-
PI
2.2
0.85Tcr
-
PID
0.5Tcr
0.125Tcr

具體步驟如下所述:
1) 將控制器的積分時間置于最大,即T1=∞,微分時間TD=0,比例帶δ置于一個較大的數值
2) 將控制系統投入閉環運行,待系統穩定之后,逐步減小比例帶,直到系統出現等幅振蕩,記錄此時的比例帶δcr 和振蕩周期Tcr ,
3) 將比例帶δcr 和振蕩周期Tcr 代入上表,計算控制系統各個參數.
根據上述步驟寫出代碼如下:
  1. % 初始pid參數
  2. kp=1; ti=1e32; td=1e-32;
  3. % getDelta(kp, ti, td)
  4. % figure
  5. % step(getLoop(kp, ti, td))
  6. history(1, :) = [kp, ti, td];
  7. % 整定p, 調整衰減比接近1:1            
  8. if getDelta(kp, ti, td) > 1
  9.               while getDelta(kp, ti, td) > 1
  10. %                             getDelta([kp, ti, td])
  11.                             kp = kp*1.01;              % kp增大,衰減比減小
  12.               end
  13. elseif getDelta(kp, ti, td) < 1
  14.               while getDelta(kp, ti, td) < 1
  15.                             % getDelta([kp, ti, td])
  16.                             kp = kp*0.99;              % kp增大,衰減比減小
  17.               end
  18. end
  19. % 計算臨界比例帶
  20. [Y, T] = step(getLoop(kp, ti, td));
  21. [pks, locs] = findpeaks(Y);
  22. tcr = T(locs(2))-T(locs(1));
  23. % 計算對應的三種控制參數
  24. % history(1, :) = [kp, ti, td];
  25. % history(2, :) = [kp/2, 1e32, 1e-32];
  26. % history(3, :) = [kp/2.2, 0.85*tcr, 1e-32];
  27. history(4, :) = [kp/1.7, 0.5*tcr, 0.125*tcr];
  28. % 繪制圖片
  29. % step(getLoop(history(2, :))); hold on;
  30. % step(getLoop(history(3, :))); hold on;
  31. figure
  32. step(getLoop(history(1, 1),history(1, 2),history(1, 3))); hold on;
  33. step(getLoop(history(4, 1),history(4, 2),history(4, 3))); hold on;
  34. legend('initial respond','respond after setting pid')
  35. function gg = getLoop(kp, ti, td)
  36.     % 構建方程
  37.               g = tf(25, conv([4 1], [20 1]));                            % 開環系統
  38.               gc_p = tf(kp, 1);                                          % p控制
  39.               gc_i = tf(kp, [ti 0]);                            % i控制
  40.               gc_d = tf([kp*td 0], 1);              % d控制
  41.               gc = parallel(parallel(gc_p, gc_i), gc_d);              % pid控制器
  42.               gg = feedback(series(g, gc), 1);                            % 總控制系統
  43. end
  44. % 計算pid參數為[kp, ti, td]的閉環控制系統的階躍響應衰減比
  45. function delta = getDelta(kp, ti, td)
  46.     % 得到控制系統階躍響應曲線
  47.               gg = getLoop(kp, ti, td);
  48.               Y = step(gg);
  49.               % 計算衰減比
  50.               V = findpeaks(Y);
  51.               delta = (V(1)-Y(end))/(V(2)-Y(end));
  52. end
復制代碼


對上邊的系統進行整定,我們先將系統比例帶設置由大到小,直到系統等幅振蕩.此時閉環系統階躍響應如下:
(num=100;i=0;
for sigma=0:1:0
    den=[0.00227 100*sigma*0.1 100];
    damp(den);
    sys=tf(num,den);
    i=i+2;
    step(sys,0.1)
    hold on
end
grid
hold off
lab1='|?=0';
text(2,8,lab1);
)
因為我們是模擬實際情況查找比例帶,而不是由公式對臨界比例帶進行計算,因此此時系統的衰減比實際上為0.9992,而非1. 代入上邊表格數據時,我發現了一個bug,按照上面表格進行計算,閉環系統采用p控制,pi控制都會導致系統閉環不穩定,而采用pid控制能使系統閉環穩定.整定后的系統的快速性大為改善,然而其準確性略有下降.
臨界比例帶法(邊界穩定法)
如果在生產過程中不允許出現等幅振蕩,則只能退而求其次,采用衰減曲線法.我們只能退而求其次,選擇衰減曲線法,將上邊方法中的等幅振蕩過程改為4:1震蕩過程.其具體步驟與上邊臨界比例帶法類似如下:
1)  設置控制器的積分時間Ti=∞,微分時間TD=0,比例帶δ置于較大的數值
2)  將系統投入閉環運行,待數值穩定之后,做階躍擾動試驗,觀察控制過程,若過渡時間衰減率φ大于要求的數值,則應逐步減小比例帶值,直到系統過度曲線出現φ=0.75或φ=0.9為止.記錄此時的比例帶δs ,在φ=0.75時的衰減曲線上求取衰減周期Ts ,或在φ=0.9的衰減曲線上求取上升時間tr
3)  將比例帶δ\deltaδ和振蕩周期TTT代入上表,計算控制系統各個參數
控制
Ti
Td
控制
Ti
Td
0.75
P
-
-
0.9
P
-
-
0.75
PI
1.2
0.5Ts
-
0.9
PI
1.2
2
-
0.75
PID
0.8
0.3 Ts
0.1 Ts
0.9
PID
0.8
1.2
0.4
對于衰減率φ=0.75\varphi=0.75φ=0.75的情況,其實現代碼如下:
  1. % 初始pid參數
  2. % 初始pid參數
  3. kp=1; ti=1e32; td=1e-32;
  4. history(1, :) = [kp, ti, td];              % 記錄初始值
  5. % 整定p, 調整衰減比接近4:1            
  6. if getDelta(kp, ti, td)>4
  7.               while getDelta(kp, ti, td)>4
  8.                             % getDelta([kp, ti, td])
  9.                             kp = kp*1.01;              % kp增大,衰減比減小
  10.               end
  11. elseif getDelta(kp, ti, td)<4
  12.               while getDelta(kp, ti, td)<4
  13.                             % getDelta([kp, ti, td])
  14.                             kp = kp*0.99;              % kp增大,衰減比減小
  15.               end
  16. end
  17. % 計算臨界比例帶
  18. [Y, T] = step(getLoop(kp, ti, td));
  19. [pks, locs] = findpeaks(Y);
  20. ts = T(locs(2))-T(locs(1));
  21. % 記錄不同比值
  22. history(2, :) = [kp, 1e32, 1e-32];                                          % p控制
  23. history(3, :) = [kp/1.2, 0.5*ts, 1e-32];                            % pi控制
  24. history(4, :) = [kp/0.8, 0.3*ts, 0.1*ts];              % pid控制
  25. % 繪圖
  26. figure
  27. step(getLoop(history(1, 1),history(1, 2),history(1, 3))); hold on;
  28. step(getLoop(history(2, 1),history(2, 2),history(2, 3))); hold on;
  29. step(getLoop(history(3, 1),history(3, 2),history(3, 3))); hold on;
  30. step(getLoop(history(4, 1),history(4, 2),history(4, 3))); hold on;
  31. legend('initial respond','respond after setting p','respond after setting pi','respond after setting pid')
  32. function gg = getLoop(kp, ti, td)
  33.     % 構建方程
  34.               g = tf(25, conv([4 1], [20 1]));                            % 開環系統
  35.               gc_p = tf(kp, 1);                                          % p控制
  36.               gc_i = tf(kp, [ti 0]);                            % i控制
  37.               gc_d = tf([kp*td 0], 1);              % d控制
  38.               gc = parallel(parallel(gc_p, gc_i), gc_d);              % pid控制器
  39.               gg = feedback(series(g, gc), 1);                            % 總控制系統
  40. end
  41. % 計算pid參數為[kp, ti, td]的閉環控制系統的階躍響應衰減比
  42. function delta = getDelta(kp, ti, td)
  43.     % 得到控制系統階躍響應曲線
  44.               gg = getLoop(kp, ti, td);
  45.               Y = step(gg);
  46.               % 計算衰減比
  47.               V = findpeaks(Y);
  48.               delta = (V(1)-Y(end))/(V(2)-Y(end));
  49. end
復制代碼
將所得到的結果繪制在坐標軸上,得到圖像如下. 由此可見,在引入積分控制后,控制系統的準確度有所下降.但加入pid控制之后,總體的控制效果比初始情況大為改善.
對于衰減率φ=0.9\varphi=0.9φ=0.9的情況下,其實現代碼如下:
  1. % 初始pid參數
  2. kp=1; ti=1e32; td=1e-32;
  3. history(1, :) = [kp, ti, td];              % 記錄初始值
  4. % 整定p, 調整衰減比接近4:1            
  5. if getDelta(kp, ti, td)>10
  6.               while getDelta(kp, ti, td)>10
  7.                             % getDelta([kp, ti, td])
  8.                             kp = kp*1.01;              % kp增大,衰減比減小
  9.               end
  10. elseif getDelta(kp, ti, td)<10
  11.               while getDelta(kp, ti, td)<10
  12.                             % getDelta([kp, ti, td])
  13.                             kp = kp*0.99;              % kp增大,衰減比減小
  14.               end
  15. end
  16. % 計算臨界比例帶
  17. [Y, T] = step(getLoop(kp, ti, td));
  18. [pks, locs] = findpeaks(Y);
  19. ts = T(locs(2))-T(locs(1));
  20. % 記錄不同比值
  21. history(2, :) = [kp, 1e32, 1e-32];                                          % p控制
  22. history(3, :) = [kp/1.2, 0.5*ts, 1e-32];                            % pi控制
  23. history(4, :) = [kp/0.8, 0.3*ts, 0.1*ts];              % pid控制
  24. % 繪圖
  25. figure
  26. step(getLoop(history(1, 1),history(1, 2),history(1, 3))); hold on;
  27. step(getLoop(history(2, 1),history(2, 2),history(2, 3))); hold on;
  28. step(getLoop(history(3, 1),history(3, 2),history(3, 3))); hold on;
  29. step(getLoop(history(4, 1),history(4, 2),history(4, 3))); hold on;
  30. legend('initial respond','respond after setting p','respond after setting pi','respond after setting pid')
  31. function gg = getLoop(kp, ti, td)
  32.     % 構建方程
  33.               g = tf(25, conv([4 1], [20 1]));                            % 開環系統
  34.               gc_p = tf(kp, 1);                                          % p控制
  35.               gc_i = tf(kp, [ti 0]);                            % i控制
  36.               gc_d = tf([kp*td 0], 1);              % d控制
  37.               gc = parallel(parallel(gc_p, gc_i), gc_d);              % pid控制器
  38.               gg = feedback(series(g, gc), 1);                            % 總控制系統
  39. end
  40. % 計算pid參數為[kp, ti, td]的閉環控制系統的階躍響應衰減比
  41. function delta = getDelta(kp, ti, td)
  42.     % 得到控制系統階躍響應曲線
  43.               gg = getLoop(kp, ti, td);
  44.               Y = step(gg);
  45.               % 計算衰減比
  46.               V = findpeaks(Y);
  47.               delta = (V(1)-Y(end))/(V(2)-Y(end));
  48. end
復制代碼
將所得到的結果繪制在坐標軸上,得到圖像如下. 我們得到的結果與衰減率φ=0.75\varphi=0.75φ=0.75的情況類似,得到結論: 在引入積分控制后,控制系統的準確度有所下降.但加入pid控制之后,總體的控制效果比初始情況大為改善.
D響應曲線法(動態特性參數法)
前面三種方法都是針對系統的閉環特性進行整定,而響應曲線法是根據系統的開環狀態下,通過階躍擾動試驗得到pid控制的各種參數.
下面是響應曲線法的執行步驟:
1) 給對象一個階躍輸入,記錄其輸出.
2) 判斷對象是否有自平衡能力:
  2.1)若對象由自平衡能力,過響應曲線拐點P作切線交穩態值漸近線y(∞)A點,交時間軸于C點,過直線段上任意一點A作時間垂線并交于B點,則?            
2.2) 若對象無自平衡能力,做響應曲線漸近線交時間軸于C,過直線段上任一點A做時間垂線并交于B,則 ?
3) 查下表,確定控制器的整定參數
控制
Ti
Td
P
-
-
PI
1.2
3.3
-
PID
0.8
2
0.5
代碼如下:
% 初始化開環系統
g = tf(25, [80 24 1]);
[Y, T] = step(g);
% 尋找拐點P及其斜率
[val, minindex] = min(diff(Y, 2));
PX = T(minindex);
PY = val;
k = (Y(minindex+1) - Y(minindex))/(T(minindex+1) - T(minindex));
% 找到點C
CX = PX - PY/k;
CY = 0;
AY = Y(end);
AX = PX + (AY - PY) / k;
% 計算 tau,epsilon
tau = CX;
epsilon = AY / (AX - CX);
% 記錄pid參數
history(1, :) = [1, 1e32, 1e-32];                                                                      % 不加pid控制
history(2, :) = [epsilon*tau, 1e32, 1e-32];                                          % p控制
history(3, :) = [epsilon*tau, 3.3*tau, 1e-32];                            % pi控制
history(4, :) = [epsilon*tau, 2*tau, 0.5*tau];                            % pid控制
figure
step(getLoop(history(1, 1),history(1, 2),history(1, 3))); hold on;
step(getLoop(history(2, 1),history(2, 2),history(2, 3))); hold on;
step(getLoop(history(3, 1),history(3, 2),history(3, 3))); hold on;
step(getLoop(history(4, 1),history(4, 2),history(4, 3))); hold on;
legend('initial respond','respond after setting p','respond after setting pi','respond after setting pid');
function gg = getLoop(kp, ti, td)
    % 構建方程
              g = tf(25, conv([4 1], [20 1]));                            % 開環系統
              gc_p = tf(kp, 1);                                          % p控制
              gc_i = tf(kp, [ti 0]);                            % i控制
              gc_d = tf([kp*td 0], 1);              % d控制
              gc = parallel(parallel(gc_p, gc_i), gc_d);              % pid控制器
              gg = feedback(series(g, gc), 1);                            % 總控制系統
end
% 計算pid參數為[kp, ti, td]的閉環控制系統的階躍響應衰減比
function delta = getDelta(kp, ti, td)
    % 得到控制系統階躍響應曲線
              gg = getLoop(kp, ti, td);
              Y = step(gg);
              % 計算衰減比
              V = findpeaks(Y);
              delta = (V(1)-Y(end))/(V(2)-Y(end));
end
執行上述代碼,我們得到結果如下:
由上圖可見,p控制,pi控制的效果并不是很好,但是引入pid控制之后,系統的動態特性大為改善,這時因為我們所選的被控對象的慣性較大.
各種整定方法的總結與比較
下面對四種工程整定方法做出總結并加以比較,在本次實驗中,我們共使用了四種整定方法:
1) 經驗法: 花費時間長,難以總結出一般規律
2) 臨界比例帶法: 方法簡單且易用,但是實際情況下難以實現,且整定后的系統容易發生不穩定振蕩;
3) 衰減曲線法: 衰減曲線法作為臨界比例帶法的改進,方法較簡單,且在實際情況下有條件實現,但是在實際整定過程中難以實現完美的4:1衰減模型;
4) 響應曲線法: 簡單省時,可以直接通過開環特性整定閉環系統,但是計算誤差較大.
在實際的編程中,我們發現各種程序的運行效率由高到低如下: 響應曲線法>臨界比例帶法>衰減曲線法>經驗法.經驗法中因為需要大量試湊,所以程序的運行時間實在太長,且我這個小破電腦還動不動死機;
在臨界比例帶正定方法的實現過程中,出現了系統不穩定,因此我們在這里對pid控制方法的穩定想加以總結:
5) P控制: 比例控制的放大系數Kp大小應適當.
   5.1) 若Kp 過小,則控制通道難以屏蔽干擾通道的效果,使得總體上的控制效果較差.
   5.2) 若Kp 過大,則系統容易出現不穩定震蕩;
6) PI控制: 引入積分控制,控制系統的穩定性會下降.因此我們在試湊法中整定Ti 之前要適當增加比例帶δ;
7) PID控制: 引入微分控制后,系統的穩定性增加,因此可以適當降低比例帶δ。

以上的Word格式文檔51黑下載地址:
單回路參數pid整定.docx (357.69 KB, 下載次數: 28)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1035960 發表于 2022-6-20 16:41 | 只看該作者
這getloop函數是干什么 用的
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品九九九 | 成人一区av| 精品视频一区二区 | 成人午夜在线观看 | 亚洲一区精品在线 | 夜夜摸夜夜操 | 亚洲视频免费观看 | 美女激情av | 国产精品一区在线观看 | 国产精品毛片一区二区三区 | 国产精品美女久久久久久免费 | 黄色片免费在线观看 | 欧美一区日韩一区 | 在线国产一区二区 | 韩日精品在线观看 | 91精品国产91久久久久久吃药 | 成人午夜影院 | 玖玖玖在线 | 午夜日韩精品 | 欧美一区二区免费 | 国产色 | 黑人久久久 | 伊人狠狠干 | 美女天天操 | 欧美久久免费观看 | 91精品国产一区二区在线观看 | 国产最新精品视频 | 欧美区在线观看 | 欧美一级久久 | 欧美一级免费 | 久久精品国内 | 一区二区av | 亚洲欧美国产毛片在线 | 欧美在线a| 日韩不卡一区二区三区 | 久久91精品国产 | 欧美日一区二区 | 欧美福利久久 | 久久黄网 | 精品一级| 北条麻妃国产九九九精品小说 |