PID控制

模拟PID控制原理

   常规的模拟PID控制系统原理图如下,该系统由模拟PID控制器和被控对象组成。图中r(t)是给定值,y(t)是系统实际输出值,两者构成偏差e(t) = r(t) - y(t)。e(t)作为PID控制器的输入,U(t)为PID输出。
PID控制_第1张图片
U ( t ) = K p [ e ( t ) + 1 T i ⋅ ∫ 0 t e ( t ) d t + T d ⋅ d e ( t ) d t ] U_{(t)}=Kp[e_{(t)}+\frac{1}{T_{i}}\cdot \int_{0}^{t}e_{(t)}dt+T_{d}\cdot \frac{de_{(t)}}{dt}] U(t)=Kp[e(t)+Ti10te(t)dt+Tddtde(t)]
K p Kp Kp----比例系数
K p ⋅ 1 T i Kp\cdot\frac{1}{T_{i}} KpTi1----积分系数,即Ki,Ti为积分时间常数
K p ⋅ T d Kp\cdot Td KpTd----微分系数,即Kd,Td为微分时间常数

离散PID控制原理

   由于计算机控制是采样控制,他只能进行数字离散运算,故而必须对模拟PID计算式进行离散化处理。以T作为采样周期,K作为采样序号,则离散采样时间K*T对应模拟时间t,用矩形法数值积分近似代替积分,用一阶后向差分近似代替微分,有:
   1) t ≈ K ⋅ T t\approx K\cdot T tKT
   2) ∫ 0 t e ( t ) d t ≈ T ⋅ ∑ j = 0 k e j \int_{0}^{t}e_{\left ( t \right )}dt\approx T\cdot \sum_{j=0}^{k}e_{j} 0te(t)dtTj=0kej
   3) d e ( t ) d t ≈ e k − e k − 1 T \frac{de_{(t)}}{dt}\approx \frac{e_{k}-e_{k-1}}{T} dtde(t)Tekek1
由1) 2) 3)得
U ( k ) = K p [ e k + T T i ∑ j = 0 k e j + T d ⋅ e k − e ( k − 1 ) T ] U_{(k)}= K_{p}[e_{k}+\frac{T}{T_{i}}\sum_{j=0}^{k}e_{j}+Td\cdot \frac{e_{k}-e_{(k-1)}}{T}] U(k)=Kp[ek+TiTj=0kej+TdTeke(k1)]

位置式PID

   计算式:
U k = K p ⋅ e k + K i ⋅ ∑ j = 0 k e k + K d ( e k − e k − 1 ) U_{k}= K_{p}\cdot e_{k}+K_{i}\cdot \sum_{j=0}^{k}e_{k}+K_{d}(e_{k}-e_{k-1}) Uk=Kpek+Kij=0kek+Kd(ekek1)
   位置式PID给出了全部控制量的大小,但它有一个缺点,由于全量输出所以每次输出均与过去状态有关,计算时要对 e k e_{k} ek累加,工作量大;并且,若计算机出故障 U k U_{k} Uk将大幅改变,造成生产事故。

增量式PID

   计算式:
U ( k − 1 ) = K p [ e ( k − 1 ) + T T i ⋅ ∑ j = 0 k − 1 e j + T d e ( k − 1 ) − e ( k − 2 ) T ] U_{\left ( k-1 \right )}=Kp[e_{(k-1)}+\frac{T}{T_{i}}\cdot \sum_{j=0}^{k-1}e_{j}+Td\frac{e_{(k-1)}-e_{(k-2)}}{T}] U(k1)=Kp[e(k1)+TiTj=0k1ej+TdTe(k1)e(k2)]
Δ U k = U k − U k − 1 = K p ( 1 + T T i + T d T ) e k − K p ( 1 + 2 T d T ) e ( k − 1 ) + K p T d T e ( k − 2 ) \Delta U_{k}=U_{k}-U_{k-1}=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)} ΔUk=UkUk1=Kp(1+TiT+TTd)ekKp(1+T2Td)e(k1)+KpTTde(k2)
Δ U k = A e k + B e ( k − 1 ) + C e ( k − 2 ) \Delta U_{k}=Ae_{k}+Be_{(k-1)}+Ce_{(k-2)} ΔUk=Aek+Be(k1)+Ce(k2)
   采用增量式PID可以客服上述问题,所谓增量式指控制器的输出只是控制量的增量 Δ U k \Delta U_{k} ΔUk

简单的PID代码

//数据定义
typedef struct PID
{
	int SetPoint;//设定目标
	long SumError;//误差累计
	double Proportion;//比例常数
	double Intergral;//积分常数
	double Derivative;//微分常数
	int LastError;//Error[-1]
	int PrevError;//Error[-2]
}PID;

static PID sPID;
static PID *sptr=$sPID;

//PID参数初始化
Void IncPIDInit()
{
	sptr->SumError=0;
	sptr->LastError=0;
	sptr->PrevError=0;
	sptr->SetPoint=0;
	sptr->Proportion=0;
	sptr->Intergral=0;
	sptr->Derivative=0;
}

//增量式PID
int IncPID(int NextPoint)
{
	register int iError,iIncpid;
	iError = sptr->SetPoint - NextPoint;//当前误差
	//增量计算
	iIncpid=sptr->Proportion*iError - sptr->Intergral*sptr->LastError + sptr->Derivative*sptr->PrevError;
	//存储误差
	sptr->PrevError = sptr->LastError;
	sptr->LastError = iError;
	return iIncpid;
}

//位置式PID
unsigned int LocPID(int NextPoint)
{
	register int iError,dError;
	iError = sptr->SetPoint - NextPoint;//当前误差
	sptr->SumError += iError ;//积分
	dError = iError  -  sptr->LastError;//微分
	sptr->LastError = iError;
	return (sptr->Proportion * iError + sptr->Intergral * sptr->SumError + sptr->Derivative * dError );
}

P、I、D三部曲

   比例部分Kp*e(t)
   比例环节的作用是对偏差瞬间作出反应,Kp越大,反应越快,过渡越快,控制过程静态偏差越小,但Kp越大也易产生震荡,破坏系统稳定性。

   积分部分 K p T i ∫ 0 t e ( t ) \frac{Kp}{Ti}\int_{0}^{t}e(t) TiKp0te(t)
   积分环节可以消除系统偏差,但也会降低系统响应速度,增加系统超调量。 K p T i \frac{Kp}{Ti} TiKp越小,积分的积累作用越弱,这时系统在过渡时不会产生震荡,但是会减慢静态误差的消除过程,消除偏差所需时间拉长。反之, K p T i \frac{Kp}{Ti} TiKp越大,积分作用越强,易产生超调和震荡,调节时间短。

   微分部分Kp*Td d e ( t ) d t \frac{de(t)}{dt} dtde(t)
   在偏差变化的瞬间,不但要对偏差量做出立即响应(P的作用),还要根据偏差变化趋势预先给出适当修正,为此在PI基础上加入D。微分环节可以阻止偏差的变化,它有助于减小超调量,克服振荡,使系统趋于稳定,但它对噪声十分敏感,对那些噪声较大的系数,一般不用微分,或在微分起作用前滤波。

特殊的PID

   1、积分分离的PID
   实际系统中存在饱和特性,当控制量达到一定值后系统输出量不再增长,系统进入饱和区,这就要求系统控制量有一定限制,若控制量超过该限制,系统实际执行的不是控制量计算值而是控制量最值,控制达不到预期效果,这种情况在开工、停工、大幅改变给定值情况下常发生。由于“饱和”主要由积分引起,故对积分分离,在误差较大时不进行积分,直至误差达到一定值才在控制量的计算中加入积分累积。
   算式如下:
   位置式改进:
U ( k ) = K p ⋅ e k + K i ∑ j = 0 k e ( j ) ⋅ K l + K d ( e ( k ) − e ( k − 1 ) ) U(k)=Kp\cdot e_{k}+Ki\sum_{j=0}^{k}e_{(j)}\cdot K_{l}+K_{d}(e_{(k)}-e_{(k-1)}) U(k)=Kpek+Kij=0ke(j)Kl+Kd(e(k)e(k1))
K l = { 1  if  x = ∣ e ( k ) ∣ ⩽ ε 0  if  x = ∣ e ( k ) ∣ > ε K_{l}=\begin{cases} 1 & \text{ if } x= |e_{(k)}|\leqslant \varepsilon \\ 0 & \text{ if } x= |e_{(k)}|> \varepsilon \end{cases} Kl={10 if x=e(k)ε if x=e(k)>ε
ε 是 门 限 值 \varepsilon是门限值 ε
   增量式改进:
Δ U k = K p ( 1 + T T i ⋅ K l + T d T ) e k − K p ( 1 + 2 T d T ) e k − 1 + K d T d T e k − 2 \Delta U_{k}=Kp(1+\frac{T}{Ti}\cdot K_{l}+\frac{Td}{T})e_{k}-Kp(1+\frac{2Td}{T})e_{k-1}+Kd\frac{Td}{T}e_{k-2} ΔUk=Kp(1+TiTKl+TTd)ekKp(1+T2Td)ek1+KdTTdek2
Δ U k = K p ( e k − e k − 1 ) + K i K l e k + K d ( e k − 2 e k − 1 + e k − 2 ) \Delta U_{k}=Kp(e_{k}-e_{k-1})+K_{i}K_{l}e_{k}+Kd(e_{k}-2e_{k-1}+e_{k-2}) ΔUk=Kp(ekek1)+KiKlek+Kd(ek2ek1+ek2)
K l = { 1  if  x = ∣ e ( k ) ∣ ⩽ ε 0  if  x = ∣ e ( k ) ∣ > ε K_{l}=\begin{cases} 1 & \text{ if } x= |e_{(k)}|\leqslant \varepsilon \\ 0 & \text{ if } x= |e_{(k)}|> \varepsilon \end{cases} Kl={10 if x=e(k)ε if x=e(k)>ε
ε 是 门 限 值 \varepsilon是门限值 ε
Tip:PID延伸类型有很多如模糊PID、死区PID、串级PID等,内容很多,没接触过不了解我就不写了

PID参数整定

1、参数整定需收集的曲线
1)设定值
2)被调量波动曲线
3)PID输出
若是串级调节系统还包括
4)副调的被调量曲线
5)副调PID输出
6)干扰曲线

2、PID整定口诀
参数整定找最佳,从小到大顺序查
先是比例后积分,最后再把微分加
曲线振荡很频繁,比例度盘要放大
曲线漂浮过大弯,比例度盘往小扳
曲线偏离回复慢,积分时间往下降
曲线波动周期长,积分时间再加长
曲线振荡频率快,先把微分降下来
动差大来波动慢,微分时间应加长
理想曲线两个波,前高后低四比一
PS:口诀从别的地方看到的,具体哪里忘了…

你可能感兴趣的:(软件代码)