找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4105|回复: 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 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1035960 发表于 2022-6-20 16:41 | 显示全部楼层
这getloop函数是干什么 用的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表