一、PID框图:
模拟的PID公式
u(t)=Kp[e(t)+1Ti∫0te(t)dt+Tdde(t)dt]u(t) = Kp [e(t) + \frac{1}{Ti} \int ^t_0 e(t) dt + Td \frac {de(t)}{dt} ]u(t)=Kp[e(t)+Ti1∫0te(t)dt+Tddtde(t)]
将PID公式离散化,推导出位置式PID公式
u(k)=Kp[ek+1Ti∑j=0kej+Tdek−ek−1T]u(k) = Kp [e_k + \frac{1}{Ti} \sum ^k_{j=0} e_j + Td \frac {e_k - e_{k-1}}{T} ]u(k)=Kp[ek+Ti1j=0∑kej+TdTek−ek−1]
=Kp∗ek+KpTi∑j=0kej+Kp∗Tdek−ek−1T= Kp *e_k + \frac{Kp}{Ti} \sum ^k_{j=0} e_j + Kp*Td \frac {e_k - e_{k-1}}{T} =Kp∗ek+TiKpj=0∑kej+Kp∗TdTek−ek−1
=Aek+B(∑j=0k−1ej+ek)+C(ek−ek−1)= Ae_k + B(\sum ^{k-1}_{j=0} e_j +e_{k})+C(e_{k}-e_{k-1}) =Aek+B(j=0∑k−1ej+ek)+C(ek−ek−1)
推导出增量式PID公式
Δuk=uk−uk−1=Kp[ek−ek−1+TTiek+Tdek−2ek−1+ek−2T]\Delta u_k= u_k- u_{k-1}= Kp [e_k - e_{k - 1}+ \frac{T}{Ti} e_k + Td \frac {e_k -2 e_{k-1} + e_{k-2}}{T} ]Δuk=uk−uk−1=Kp[ek−ek−1+TiTek+TdTek−2ek−1+ek−2]
=Kp(1+TTi+TdT)ek−Kp(1+2TdT)ek−1+KpTdTek−2= Kp(1+ \frac{T}{Ti} + \frac{Td}{T} )e_k - Kp(1+ \frac{2Td}{T} )e_{k-1}+Kp\frac{Td}{T} e_{k-2}=Kp(1+TiT+TTd)ek−Kp(1+T2Td)ek−1+KpTTdek−2
=Aek+Bek−1+Cek−2= Ae_k + Be_{k-1}+Ce_{k-2}=Aek+Bek−1+Cek−2
其中,偏差=目标值-反馈值 ek=r(t)−y(t)e_{k}=r(t)-y(t)ek=r(t)−y(t)
实现代码:
//定义PID结构体
typedef struct
{
__IO int SetPoint; //设定目标 Desired Value
__IO long SumError; //误差累计
__IO double Proportion; //比例常数 Proportional Const
__IO double Integral; //积分常数 Integral Const
__IO double Derivative; //微分常数 Derivative Const
__IO int LastError; //Error[-1]
__IO int PrevError; //Error[-2]
}PID;
#define P_DATA 3.2 //P参数
#define I_DATA 1.1 //I参数
#define D_DATA -0.15 //D参数
//位置式 PID 控制设计
unsigned int LocPIDCalc(int NextPoint)
{
int iError,dError;
iError = sptr->SetPoint - NextPoint; //偏差
sptr->SumError += iError; //积分
dError = iError - sptr->LastError; //微分
sptr->LastError = iError;
return(sptr->Proportion * iError //比例项
+ sptr->Integral * sptr->SumError //积分项
+ sptr->Derivative * dError); //微分项
}
//增量式PID控制设计
int IncPIDCalc(int NextPoint)
{
int iError,iIncpid; //当前误差
iError=sptr->SetPoint-NextPoint; //增量计算
iIncpid=(sptr->Proportion * iError) //E[k]项
-(sptr->Integral * sptr->LastError) //E[k-1]项
+(sptr->Derivative * sptr->PrevError); //E[k-2]项
sptr->PrevError=sptr->LastError; //存储误差,用于下次计算
sptr->LastError=iError;
return(iIncpid); //返回增量值
}
PID控制算法的特点:
PID控制是一个二阶线性控制器 定义:通过调整比例、积分和微分三项参数,使得大多数的工业控制系统获得良好的闭环控制性能。
优点:
a. 技术成熟
b. 易被人们熟悉和掌握
c. 不需要建立数学模型
d. 控制效果好
e. 鲁棒性
通常依据控制器输出与执行机构的对应关系,将基本数字PID算法分为位置式PID和增量式PID两种。其实两者没有本质区别,就是数字pid的两种不同 表示形式而已
从运算角度讲:
(1)位置型需要历次的偏差信号,而增量型只需一个增量信号即可。位置型计算繁琐,保存E占用很多内存,控制不方便。
从误差积累角度讲:
(2)位置式PID控制的输出与整个过去的状态有关,用到了误差的累加值;而增量式PID的输出只与当前拍和前两拍的误差有关,因此位置式PID控制的累积误差相对更大;
(3)增量设计只与本次的偏差值有关,与阀门原来的位置无关,因而增量算法易于实现手动/自动无扰动切换。不产生积分失控,但是缺点在于积分截断效应大,溢出影响大。
从安全性角度讲:
(4)由于增量式PID输出的是控制量增量,如果计算机出现故障,误动作影响较小,而执行机构本身有记忆功能,可仍保持原位,不会严重影响系统的工作,而位置式的输出直接对应对象的输出,因此对系统影响较大。
从适用性角度讲:
(5)增量式PID控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等,而位置式PID适用于执行机构不带积分部件的对象,如电液伺服阀。
PID调试口诀:
参数整定找最佳, 从小到大顺序查。
先是比例后积分, 最后再把微分加。
曲线振荡很频繁, 比例度盘要放大。
曲线漂浮绕大弯, 比例度盘往小扳。
曲线偏离回复慢, 积分时间往下降。
曲线波动周期长, 积分时间再加长。
曲线振荡频率快, 先把微分降下来。
动差大来波动慢, 微分时间应加长。
理想曲线两个波, 前高后低四比一。
一看二调多分析, 调节质量不会低。