当前位置:首页 > 先进PID控制及MATLAB仿真第3章专家PID学习心得及疑问
先进PID控制及MATLAB仿真第3章专家PID学习心得及疑问
因为课题需要,刚开始学习专家控制器matlab仿真,用的是刘金锟 先进PID控制及MATLAB仿真。有一些问题想和大家交流,向大家请教。
1、第三章 专家PID中,第一条规则应按最大输出。在p96例3-1中输出分别为0.45、0.40、0.12、0.01。如果我的输入信号不是阶跃信号,而是从0到1缓慢变化的s形曲线,如v=[1-cos(pi/50*t)]*735。输出还可以设定为0.45、0.40、0.12、0.01吗?
2、专家PID控制中第二条规则当误差处在增大阶段,前面讲的输出为 , 而例3-1中rule2输出u(k)=u_1+1.5*kp*x(1)。这与上式为什么不同?我觉得kp*x(2)+ki*x(1)+kd*[x(2)-x2_1]等于u(k)的导数,对不对?它与kp*x(1)相等吗?为什么在例3-1中不用 ?
3、假设某时刻误差处在变大阶段,且x(1)=0.25。程序执行时首先执行rule1,因为误差大于0.2,则u(k)= 0.12。然后再判断rule2,因为条件也满足,误差值在变大,也大于0.05所以u(k)又变为u_1+1.5*kp*x(1)。这样程序是不是存在二义性?而且在我应用此算法仿真一五阶系统时(详见附件),rule5误差值小于0.001,则输出震荡,而改为0.1,则输出正常。这样,很多时候,只要误差小于0.1,则执行rule1,u(k)先等于0.1,再执行rule2,等于u_1+1.5*kp*x(1),再执行rule5,等于0.4*x(1)+0.475*x(3)。这样,使得rule2、rule4根本就不起作用。我觉得各误差段应既无遗漏又不重叠。不知我的理解对否?
4、本来我对采样时间的理解是采样时间越短,仿真精度越高。但我发现只改变采样时间,其它不变,则输出大不相同,甚至震荡。一开始我以为我的控制器没设计好,后来我找了书上不少例子试了试,例3-1、1-9、1-12都有此现象。这怎么解释?那这样仿真,和其他控制方法比较时还有可信度吗?也必须在相同采样时间下吗?
5、在simulink模型仿真时,怎样设置采样时间?在configuration parameter中,有sample time,但都不能设定具体值。在solver中,当采用固定步长时,不能设置采样时间。当采用变步长ode45时, max step time和min step time又不能设置为相等。难道只有采用默认采样时间?而默认的又是多少呢?
6、input delay和transport delay 、iodelay到底有什么区别啊?带延迟环节的传递函数应该用哪个来表示,还是都可以?
7、在例3-1加入滞后,sys=tf(5.235e005,[1,87.35,1.047e004,0],'inputdelay',76000000);结果输出和不加滞后完全一样,不管滞后有多大。我自己的控制器也是如此。是专家PID抵抗滞后能力强,还是滞后加的不对?
8、例3-2.s.m中最后一句sys=[sys; x(3)];是什么意思?输出为什么是加上x(3)的增广矩阵?
这些问题困扰我好长时间了,百思不得其解,书上也找不到相关的资料。如能解惑,不胜感激。谢谢
我的专家控制器
附:我的专家控制器 %Expert PID Controller clear all; close all; ts=0.001;
sys=tf(158.91e6,[0.7596 133.728 1.405e4 6.237e5 1.015e7 9.015e6]); dsys=c2d(sys,ts,'z');
[num,den]=tfdata(dsys,'v');
u_1=0.0;u_2=0.0;u_3=0.0;u_4=0.0;u_5=0.0; y_1=0;y_2=0;y_3=0;y_4=0;y_5=0; x=[0,0,0]'; x2_1=0; kp=1.44;
ki=1.28; kd=0.008; error_1=0;
for k=1:1:5000 time(k)=k*ts;
rin(k)=1; %Tracing Jieyue Signal u(k)=kp*x(1)+kd*x(2)+ki*x(3); %PID Controller %Expert control rule
if abs(x(1))>0.8 %Rule1:Unclosed control firstly u(k)=0.45;
elseif abs(x(1))>0.40 u(k)=0.30;
elseif abs(x(1))>0.20 u(k)=0.2;
elseif abs(x(1))>0.10 u(k)=0.03;
elseif abs(x(1))<=0.05 %Rule5:Integration separation PI control u(k)=0.25*x(1)+1.75*x(3);
elseif x(1)*x(2)>0|(x(2)==0) %Rule2 if abs(x(1))>=0.1
u(k)=u_1+1.5*[kp*x(2)+ki*x(1)]; else
u(k)=u_1+0.6*[kp*x(2)+ki*x(1)]; end
elseif x(1)*x(2)<0&x(2)*x2_1<0 %Rule4 if abs(x(1))>=0.1
u(k)=u_1+2*kp*error_1; else
u(k)=u_1+0.4*kp*error_1; end end
if (x(1)*x(2)<0&x(2)*x2_1>0)|(x(1)==0) %Rule3 u(k)=u(k); end
%Restricting the output of controller if u(k)>=2 u(k)=2; end
if u(k)<=0 u(k)=0; end
%Linear model
yout(k)=-den(2)*y_1-den(3)*y_2-den(4)*y_3-den(5)*y_4-den(6)*y_5+num(2)*u_1+num(3)*u_2+num(4)*u_3+num(5)*u_4+num(6)*u_5; error(k)=rin(k)-yout(k);
%----------Return of PID parameters------------% u_5=u_4;u_4=u_3;u_3=u_2;u_2=u_1;u_1=u(k); y_5=y_4;y_4=y_3;y_3=y_2;y_2=y_1;y_1=yout(k);
x(1)=error(k); % Calculating P x2_1=x(2);
x(2)=(error(k)-error_1)/ts; % Calculating D x(3)=x(3)+error(k)*ts; % Calculating I error_1=error(k); end
figure(1);
plot(time,rin,'b',time,yout,'r'); xlabel('time(s)');ylabel('rin,yout'); grid on;
刚学PID的一点想法 PID
这几天稍微看了一点点的PID,今天有了小小头绪,于是,就想把自己的想法写出来,欢迎拍砖。
最开始的时候,是先了解什么是PID。PID实指“比例proportional”、“积分integral”、“微分derivative”,如果我们要求被控制的对象最终趋于一个稳定的结果,一般就可以使用PID算法。假设说,有一辆速度为1m/s的小车,我们要求他的速度改变为5m/s,要完成这样的一件事,我们必须要有,1.小车驱动装置(用程序控制它输出多大的电压,电压决定驱动的马力),2.被驱动器控制的部分(即小车),3.检测当前速度的装置(当前速度与目标速度的差称为误差)。本来,我们可以给小车一个驱动力让小车加速,直到检测到小车速度达到5m/s,撤去驱动力。然而,这样做会带来几个问题。1,当小车速度达到5m/s时,从装置检测到这个速度,通知控制器,让控制器改变输出的电压,这一个过程需要耗费一定时间,在这个时间里面,小车速度可能增加了不少。2,撤去驱动力后,外界条件如摩擦会让小车速度进一步改变。PID算法可以在一定误差内解决这些问题。
使用PID算法时,大致是这样的。每一个采样周期,通过速度检测装置获得当前速度,传入程序,通过程序计算得到电压控制小车得到新速度。下一个采样周期又把新速度传入,获得新电压,再传入速度,再获得电压,如此反复。
PID算法的关键,是如何根据当前得到的速度值,输出一个“恰当”的电压,以致小车最终能够趋于稳定。
PID算法采用比例,积分,微分三种方法进行控制。三种方法都有自己对应的一个常量(pconst,iconst,dconst)。这三个变量都需要在实验中多次尝试得出。
一般地,先把与算法相关的量放入一个结构体,方便调用。 srtuct PID {
double pconst, //比例控制常量 iconst, //积分控制常量 dconst; //微分控制常量 double ErrorSum; //误差累计 double iMax,iMin; //积分上下限 double Vnew; //当前速度 }; 比例:
Vnew = GetV(); //获得当前速度
error = aim - Vnew; //误差=目标速度 - 当前速度 pTerm = error*pconst; //比例项的值就是误差乘上比例常量 Motor(pTerm); //让电机根据得出的值工作
有时候,我们增大比例常数可以让小车更快的到达目标速度,但是过大的比例常数又容易产生过冲,即速度超过目标速度5m/s,然后再减速,再加速,在减速。这样,系统产生振荡,然而,振荡的结果不一定能趋于稳定。
积分:
Vnew = GetV(); //获得当前速度
共分享92篇相关文档