标题: MATLAB单回路控制系统参数PID整定实现及代码 [打印本页]
作者: 详细信息显示 时间: 2020-6-19 10:26
标题: MATLAB单回路控制系统参数PID整定实现及代码
参数整定要求
通过整定选择合适的参数,首先要保证系统稳定,这时最基本的要求
在热工生产过程中,通常要求控制系统有一定稳定裕度,即要求过程有一定的衰减比,一般为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 由小到大的调整.观察每次实验过程,直到满意为止.
根据上述思路,写出代码如下:
- % 主函数
- % 初始化pid参数
- kp=1; ti=1e32; td=0;
- % 定义状态值,方便debug
- status = 0; % 状态: 0-未整定,1-整定好p,2-整定好i,3-整定好d,整定完成
- gg0=getLoop(kp, ti, td);
- figure
- step(gg0);
- hold on
- % 整定p, 调整衰减比接近4:1
- while getDelta(kp, ti, td)>4
- % getDelta([kp, ti, td])
- kp = kp*1.01; % kp增大,衰减比减小
- end
- status = 1
- gg1=getLoop(kp, ti, td);
- step(gg1);
- hold on
- % 整定i, 调整衰减比接近4:1
- kp = kp * 0.9; % 减小kp,补偿引入积分作用造成的稳定性下降
- while getDelta(kp, ti, td)>4
- % getDelta([kp, ti, td])
- ti = ti*0.9;
- end
- status = 2
- gg2=getLoop(kp, ti, td);
- step(gg2);
- hold on
- % 整定d, 调整衰减比接近4:1
- kp = kp * 0.9; % 减小kp,补偿引入积分作用造成的稳定性下降
- td=1e-32;
- while getDelta(kp, ti, td)>4
- % td
- % getDelta(kp, ti, td)
- td = td*1.1;
- end
- status = 3
- gg3=getLoop(kp, ti, td);
- step(gg3);
- legend('intianl respond','respond after setting p','respond after setting i','respond after setting d');
- hold off
- % 返回pid参数为[kp, ti, td]的闭环控制系统的回路方程
- 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
复制代码
下图是四步整定之后,闭环控制系统的阶跃响应曲线:
由图中曲线可知,每一步整定完成之后,闭环控制系统的准确性和快速性都略有上升.
B 临界比例带法(边界稳定法)
临界比例带法的应用较为广泛,将控制器设置为纯比例作用,将系统自动投入运行并将比例带由大到小进行改变,直到产生等幅振荡为止,此时控制系统处于边界稳定状态,记录下此刻的比例带
和振荡周期Tcr ,然后根据下表中的经验公式进行计算,算出控制器的各个参数.
| | | |
| 2  | | |
| 2.2  | | |
| | | |
具体步骤如下所述:
1) 将控制器的积分时间置于最大,即T1=∞,微分时间TD=0,比例带δ置于一个较大的数值
2) 将控制系统投入闭环运行,待系统稳定之后,逐步减小比例带,直到系统出现等幅振荡,记录此时的比例带δcr 和振荡周期Tcr ,
3) 将比例带δcr 和振荡周期Tcr 代入上表,计算控制系统各个参数.
根据上述步骤写出代码如下:
- % 初始pid参数
- kp=1; ti=1e32; td=1e-32;
- % getDelta(kp, ti, td)
- % figure
- % step(getLoop(kp, ti, td))
- history(1, :) = [kp, ti, td];
- % 整定p, 调整衰减比接近1:1
- if getDelta(kp, ti, td) > 1
- while getDelta(kp, ti, td) > 1
- % getDelta([kp, ti, td])
- kp = kp*1.01; % kp增大,衰减比减小
- end
- elseif getDelta(kp, ti, td) < 1
- while getDelta(kp, ti, td) < 1
- % getDelta([kp, ti, td])
- kp = kp*0.99; % kp增大,衰减比减小
- end
- end
- % 计算临界比例带
- [Y, T] = step(getLoop(kp, ti, td));
- [pks, locs] = findpeaks(Y);
- tcr = T(locs(2))-T(locs(1));
- % 计算对应的三种控制参数
- % history(1, :) = [kp, ti, td];
- % history(2, :) = [kp/2, 1e32, 1e-32];
- % history(3, :) = [kp/2.2, 0.85*tcr, 1e-32];
- history(4, :) = [kp/1.7, 0.5*tcr, 0.125*tcr];
- % 绘制图片
- % step(getLoop(history(2, :))); hold on;
- % step(getLoop(history(3, :))); hold on;
- figure
- step(getLoop(history(1, 1),history(1, 2),history(1, 3))); hold on;
- step(getLoop(history(4, 1),history(4, 2),history(4, 3))); hold on;
- legend('initial respond','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
复制代码
对上边的系统进行整定,我们先将系统比例带设置由大到小,直到系统等幅振荡.此时闭环系统阶跃响应如下:
(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代入上表,计算控制系统各个参数
对于衰减率φ=0.75\varphi=0.75φ=0.75的情况,其实现代码如下:
- % 初始pid参数
- % 初始pid参数
- kp=1; ti=1e32; td=1e-32;
- history(1, :) = [kp, ti, td]; % 记录初始值
- % 整定p, 调整衰减比接近4:1
- if getDelta(kp, ti, td)>4
- while getDelta(kp, ti, td)>4
- % getDelta([kp, ti, td])
- kp = kp*1.01; % kp增大,衰减比减小
- end
- elseif getDelta(kp, ti, td)<4
- while getDelta(kp, ti, td)<4
- % getDelta([kp, ti, td])
- kp = kp*0.99; % kp增大,衰减比减小
- end
- end
- % 计算临界比例带
- [Y, T] = step(getLoop(kp, ti, td));
- [pks, locs] = findpeaks(Y);
- ts = T(locs(2))-T(locs(1));
- % 记录不同比值
- history(2, :) = [kp, 1e32, 1e-32]; % p控制
- history(3, :) = [kp/1.2, 0.5*ts, 1e-32]; % pi控制
- history(4, :) = [kp/0.8, 0.3*ts, 0.1*ts]; % 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
复制代码
将所得到的结果绘制在坐标轴上,得到图像如下. 由此可见,在引入积分控制后,控制系统的准确度有所下降.但加入pid控制之后,总体的控制效果比初始情况大为改善.
对于衰减率φ=0.9\varphi=0.9φ=0.9的情况下,其实现代码如下:
- % 初始pid参数
- kp=1; ti=1e32; td=1e-32;
- history(1, :) = [kp, ti, td]; % 记录初始值
- % 整定p, 调整衰减比接近4:1
- if getDelta(kp, ti, td)>10
- while getDelta(kp, ti, td)>10
- % getDelta([kp, ti, td])
- kp = kp*1.01; % kp增大,衰减比减小
- end
- elseif getDelta(kp, ti, td)<10
- while getDelta(kp, ti, td)<10
- % getDelta([kp, ti, td])
- kp = kp*0.99; % kp增大,衰减比减小
- end
- end
- % 计算临界比例带
- [Y, T] = step(getLoop(kp, ti, td));
- [pks, locs] = findpeaks(Y);
- ts = T(locs(2))-T(locs(1));
- % 记录不同比值
- history(2, :) = [kp, 1e32, 1e-32]; % p控制
- history(3, :) = [kp/1.2, 0.5*ts, 1e-32]; % pi控制
- history(4, :) = [kp/0.8, 0.3*ts, 0.1*ts]; % 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
复制代码
将所得到的结果绘制在坐标轴上,得到图像如下. 我们得到的结果与衰减率φ=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) 查下表,确定控制器的整定参数
代码如下:
% 初始化开环系统
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黑下载地址:
作者: sxx121384 时间: 2022-6-20 16:41
这getloop函数是干什么 用的
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |