PID算法实现

1.位置式PID控制算法

 位置式PID控制基本特点:

  • 位置型PID控制的输出与整个过去的状态有关,用到了偏差的累加值,容易产生累积偏差。
  • 位置型PID适用于执行机构不带积分部件的对象。
  • 位置型的输出直接对应对象的输出,对系统的影响比较大。

 缺点:

  • 由于采用全量输出,所以每次输出均与过去的状态有关。,输出u(k)对应的是执行机构的实际位置偏差,如果位置传感器出现故障,u(k)可能会出现大幅变化,引起执行机构位置的大幅变化。
    u ( k ) = k p ( e r r ( k ) ) + k i ∑ j = 0 k e r r ( j ) + k d ( e r r ( k ) − e r r ( k − 1 ) ) u\left( k \right) =k_p\left( err\left( k \right) \right) +k_i\sum_{j=0}^k{err\left( j \right)}+k_d\left( err\left( k \right) -err\left( k-1 \right) \right) u(k)=kp(err(k))+kij=0kerr(j)+kd(err(k)err(k1))

2.增量式PID控制算法

 增量型PID控制器的基本特点:

  • 增量型PID算法不需要做累加,控制量增量的确定仅与最近几次偏差值有关,计算偏差的影响较小。
  • 增量型PID算法得出的是控制量的增量,对系统的影响相对较小。
  • 采用增量型PID算法易于实现手动到自动的无扰动切换。
    △ u ( k ) = k p ( e r r ( k ) − e r r ( k − 1 ) ) + k i e r r ( k ) + k d ( e r r ( k ) − 2 e r r ( k − 1 ) + e r r ( k − 2 ) ) u ( k ) = u ( k − 1 ) + △ u ( k ) \bigtriangleup u\left( k \right) =k_p\left( err\left( k \right) -err\left( k-1 \right) \right) +k_ierr\left( k \right) +k_d\left( err\left( k \right) -2err\left( k-1 \right) +err\left( k-2 \right) \right) \\ u\left( k \right) =u\left( k-1 \right) +\bigtriangleup u\left( k \right) u(k)=kp(err(k)err(k1))+kierr(k)+kd(err(k)2err(k1)+err(k2))u(k)=u(k1)+u(k)

3.积分分离PID控制算法

 在过程的启动、结束或大幅度增减设定值时,短时间内系统输出有很大偏差,会造成PID运算的积分累积,引起超调或者振荡。由此引入了积分分离的思想。其思路是偏差值较大时,取消积分作用,以免于超调量增大;而偏差值较小时,引入积分作用,以便消除静差,提高控制精度。
 根据实际情况,设定一个阈值;当偏差大于阈值时,消除积分仅用PD控制;当偏差小于等于阈值时,引入积分采用PID控制。

 难点:

  • 积分分离算法的效果其实与ε值的选取有莫大关系,所以ε值的选取实际上是实现的难点,ε值过大则达不到积分分离的效果,而ε值过小则难以进入积分区,ε值的选取存在很大的主观因素。
    u ( k ) = k p ( e r r ( k ) ) + β k i ∑ j = 0 k e r r ( j ) + k d ( e r r ( k ) − e r r ( k − 1 ) ) β = { 1    ∣ e r r ( k ) ∣ ≤ ε 0    ∣ e r r ( k ) ∣ > ε u\left( k \right) =k_p\left( err\left( k \right) \right) +\beta k_i\sum_{j=0}^k{err\left( j \right)}+k_d\left( err\left( k \right) -err\left( k-1 \right) \right) \\ \beta =\left\{ \begin{array}{c} 1\ \ \left| err\left( k \right) \right|\le \varepsilon\\ 0\ \ \left| err\left( k \right) \right|>\varepsilon\\ \end{array} \right. u(k)=kp(err(k))+βkij=0kerr(j)+kd(err(k)err(k1))β={1  err(k)ε0  err(k)>ε

4.抗积分饱和PID控制算法

 积分饱和就是指系统存在一个方向的偏差,PID控制器的输出由于积分作用的不断累加而扩大,从而导致控制器输出不断增大超出正常范围进入饱和区。当系统出现反响的偏差时,需要首先从饱和区退出,而不能对反向的偏差进行快速的响应。
 由此引入了抗积分饱和算法,其思路是在计算U(k)的时候,先判断上一时刻的控制量U(k-1)是否已经超出了限制范围。若U(k-1)>Umax,则只累加负偏差;若U(k-1)<Umin,则只累加正偏差。从而避免控制量长时间停留在饱和区。即当饱和时,积分项停止累积。

	  if(vpid->err_integration > GIMBAL_Integral_max)		//抗积分饱和
		vpid->err_integration = GIMBAL_Integral_max;
	  else if(vpid->err_integration < -GIMBAL_Integral_max)
		vpid->err_integration = -GIMBAL_Integral_max;

5.梯形积分PID控制算法

 在PID控制其中,积分项的作用是消除余差,为了尽量减小余差,应提高积分项的运算精度。在积分项中,默认是按矩形方式来计算积分,将矩形积分改为梯形积分可以提高运算精度。
u ( k ) = k p ( e r r ( k ) ) + k i ∑ j = 0 k e r r ( i ) + e r r ( i − 1 ) 2 + k d ( e r r ( k ) − e r r ( k − 1 ) ) u\left( k \right) =k_p\left( err\left( k \right) \right) +k_i\sum_{j=0}^k{\frac{err\left( i \right) +err\left( i-1 \right)}{2}}+k_d\left( err\left( k \right) -err\left( k-1 \right) \right) u(k)=kp(err(k))+kij=0k2err(i)+err(i1)+kd(err(k)err(k1))

5.变积分PID控制算法

 系统对于积分项的要求是,系统偏差大时,积分作用应该减弱甚至是全无,而在偏差小时,则应该加强。积分系数取大了会产生超调,甚至积分饱和,取小了又不能短时间内消除静差。
 因此提出了变积分PID算法,其思想是设法改变积分项的累加速度,使其与偏差大小相对应:偏差越大,积分越慢; 偏差越小,积分越快。设定系数为f(err(k)),它是err(k)的函数。当|err(k)|增大时,f减小,反之增大。
u i ( k ) = k i { ∑ j = 0 k − 1 e r r ( j ) + f ( e r r ( k ) ) ∗ e r r ( k ) } u_i\left( k \right) =k_i\left\{ \sum_{j=0}^{k-1}{err\left( j \right) +f\left( err\left( k \right) \right) *err\left( k \right)} \right\} ui(k)=ki{j=0k1err(j)+f(err(k))err(k)}
 其中f(err(k))与|err(k)|的函数关系可根据具体情况设定,可以是线性的也可以是非线性的,通常比较简单的设置如下:
f ( e r r ( k ) ) = { 1 ∣ e r r ( k ) ∣ ≤ B A − ∣ e r r ( k ) ∣ + B A B < ∣ e r r ( k ) ∣ ≤ A + B 0 ∣ e r r ( k ) ∣ > A + B f\left( err\left( k \right) \right) =\left\{ \begin{array}{c} 1 & \left| err\left( k \right) \right|\le B\\ \frac{A-\left| err\left( k \right) \right|+B}{A}& B<\left| err\left( k \right) \right|\le A+B\\ 0& \left| err\left( k \right) \right|>A+B\\ \end{array} \right. f(err(k))=1AAerr(k)+B0err(k)BB<err(k)A+Berr(k)>A+B
这种算法对A、B两参数的要求不精确,参数整定较容易。

6.不完全微分PID控制算法

 微分信号的引入可改善系统的动态特性,但容易引进高频干扰,在偏差扰动突变时尤其显出微分项的不足。但若在控制算法中加入低通滤波器,则可使系统性能得到改善。方法之一就是在PID算法中加入一个一阶低通滤波器。这就是所谓的不完全微分。
 在这种情况下,微分与一阶惯性环节结合,其微分部分的计算公式可表示如下:
u d ( k ) = k d ( 1 − α ) ( e r r ( k ) − e r r ( k − 1 ) ) + α u d ( k − 1 ) u_d\left( k \right) =k_d\left( 1-\alpha \right) \left( err\left( k \right) -err\left( k-1 \right) \right) +\alpha u_d\left( k-1 \right) ud(k)=kd(1α)(err(k)err(k1))+αud(k1)
 增量式表示为:
△ u d ( k ) = k d ( 1 − α ) ( e r r ( k ) − 2 e r r ( k − 1 ) + e r r ( k − 2 ) ) + α △ u d ( k − 1 ) \bigtriangleup u_d\left( k \right) =k_d\left( 1-\alpha \right) \left( err\left( k \right) -2err\left( k-1 \right) +err\left( k-2 \right) \right) +\alpha \bigtriangleup u_d\left( k-1 \right) ud(k)=kd(1α)(err(k)2err(k1)+err(k2))+αud(k1)
α = T f T s + T f \alpha =\frac{T_f}{T_s+T_f} α=Ts+TfTf
 其中:Ts为采样时间,Tf为滤波器系数

6.微分先行PID控制算法

 在某些给定值频繁且大幅变化的场合,微分项常常会引起系统的振荡。由此提出了微分先行PID算法。其只对输出量进行微分,而对给定指令不起微分作用,因此它适合于给定指令频繁升降的场合,可以避免指令的改变导致超调过大。
大佬写的微分先行PID

7.带死区的PID控制算法

 即检测偏差值,若是偏差值达到一定程度,就进行调节。若是偏差值较小,就认为没有偏差。
 在零点附近时,若偏差很小,进入死去后,偏差置0会造成积分消失,如是系统存在静差将不能消除,所以需要人为处理这一点。
e r r ( k ) = { 0 ∣ e r r ( k ) ∣ ≤ ∣ e r r 0 ∣ e r r ( k ) ∣ e r r ( k ) ∣ > ∣ e r r 0 ∣ err\left( k \right) =\left\{ \begin{array}{c} 0&\left| err\left( k \right) \right|\le \left| err_0 \right|\\ err\left( k \right) &\left| err\left( k \right) \right|>\left| err_0 \right|\\ \end{array} \right. err(k)={0err(k)err(k)err0err(k)>err0

8.基于前馈补偿的PID控制算法

对于一般的时滞系统来说,设定值的变动会产生较大的滞后才能反映在被控变量上,从而产生合理的调节。而前馈控制系统是根据扰动或给定值的变化按补偿原理来工作的控制系统,其特点是当扰动产生后,被控变量还未变化以前,根据扰动作用的大小进行控制,以补偿扰动作用对被控变量的影响。前馈控制系统运用得当,可以使被控变量的扰动消灭在萌芽之中,使被控变量不会因扰动作用或给定值变化而产生偏差,它较之反馈控制能更加及时地进行控制,并且不受系统滞后的影响。
大佬写的基于前馈补偿的PID

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值