pid控制器的调节原则,试说明pid控制器的优点

  pid控制器的调节原则,试说明pid控制器的优点

  我们发表了一系列与PID控制器相关的文章,包括经典PID控制器和参数自适应PID控制器。虽然该系列PID控制器实现了主要功能,在实际使用中取得了良好的效果,但仍有许多细节可以改进,以提高性能和灵活性。因此,在本文中,我们将讨论PID控制器的改进,以减少设定值阶跃引起的扰动。

  1.提问

  当我们使用PID控制器时,如果设定值被大幅度修改,就有可能引入大的阶跃扰动。特别是对于差动动作,这种扰动可能引起很大的振荡,通常称为差动冲击。

  为了应对微分动作引起的对设定值变化的激烈反应,人们首先引入微分的PID算法,将基于偏差的微分修改为基于输入的微分。也就是说,设定值的变化不会对微分产生突然的影响,微分只有作用于被控对象后才会起作用,从而消除了设定值变化带来的微分影响。

  但有时,设定值的阶跃变化也会通过比例效应体现出来,这种影响也会对系统造成振荡。当然,我们也可以根据输入将其更改为比率。虽然它也可以消除设定值的突然影响,但对设定值的响应会滞后,因为比率和微分都是面向输入信号的,这不是我们想要的。

  所以,我们希望找到一种方法,既能应对设定值的变化,又不会造成大的冲击,这才是我们这里要考虑的。

  2.分析和设计

  实际上,我们已经讨论了基于输入的比例和微分,这实际上改变了PID的调节模式。在这里,我们希望从另一个角度考虑对设定值的响应。我们讨论了步进式PID控制方式是解决这一问题的较好方法。

  所谓步进式PID算法,实际上并不是在设定值步进变化时直接响应阶跃信号,而是在一定时间内逐渐改变设定值,直到设定值达到目标值。这种逐渐改变设定值的方法使对象运行平稳。适用于高精度伺服系统的位置跟踪。

  显然,这种方法并没有改变PID控制器本身,而是对设定值进行了预处理。因此其结构框图和控制方程与其他PID控制算法一致。

  为了对设定值进行必要的处理,使其不迅速变化,有许多方法。常用的方法是建立线性变差函数。我们可以指定设定值从0-100%的变化时间为t,那么我们就可以确定设定值变化的斜率的绝对值,或者说步长。知道了步长,我们就可以根据步长不断修改设定值,直到目标值。可用的公式描述如下:

  其中,SPt是设定值的目标值,SPs是设定值的初始值,sl是步长,K是步长的变异系数:

  我们希望能够根据自己的需要使用或者不使用步进,所以需要给PID对象添加一个属性来配置是否使用。

  1 /*定义PID对象类型*/

  2 typedef结构经典

  3 {

  4 float * pPV//测量值指针

  5 float * pSV//设置值指针

  6 float * pMV//输出值指针

  7 float * pKp//比例系数指针

  8 float * pKi//整型系数指针

  9 float * pKd//微分系数指针

  10 uint16 _ t * pMA//手动自动操作指针

  11

  12浮动设定值;//设置值

  13浮点lasterror//前一节拍偏差

  14浮点预误差;//前两拍的偏差

  15浮动死区;//死区

  16浮点结果;//PID控制器//的计算结果

  17浮点输出;//输出值为0-100%

  最大18浮动;//输出值的上限

  19浮动最小值;//输出值的下限

  20浮点误差absmax;//最大偏差绝对值

  21浮点误差absmin;//绝对偏差的最小值

  22浮动;//不完全微分系数

  23浮点deltadiff//差分增量

  24浮点积分值;//累计积分金额

  25浮动伽马;//差分第一滤波器系数

  26浮点lastPv//最后一拍的过程测量值

  27 float lastDeltaPv//前一个节拍的过程测量值的增量

  28

  29 ClassicPIDDRType direct//正面和负面影响

  30 ClassicPIDSMType sm//将值设置为平滑

  31

  32 } CLASSICPID3.软件实现。

  实际上,我们讨论的设定值的响应是直接或逐步给出设定值。所谓步进法的实质是将设定值的突变变为平缓的变化,在控制中应用广泛。处理设定值变化的过程如下:

  根据我们前面的描述和上面的流程图,我们可以修改PID控制器。我们将设定值处理的部分单独设置为一个函数,这样除了线性处理之外,还可以根据我们的需要进行其他方式的处理。

  1 /*平滑改变设定值的处理功能*/

  2静态void smooth setpoint(classic PID * vPID)

  3 {

  4 float stepIn=(vPID-maximum-vPID-minimum)* 0.1;

  5 float kFactor=0.0

  六

  7 if(fabs(vPID-设定点-* vPID-pSV)=步进)

  8 {

  9 vPID-设定点=*vPID-

  10 }

  11其他

  12 {

  13 if(vPID-设定点-*vPID- pSV 0)

  14 {

  15k factor=-1.0;

  16 }

  17 else if(vPID-设定点-*vPID- pSV 0)

  18 {

  19 kFactor=1.0

  20 }

  其他21个

  22 {

  23 kFactor=0.0

  24 }

  25 vPID-设定点=vPID-设定点kFactor * stepIn

  26 }

  27 }

  28

  29 /*通用PID控制器,带增量算法,具有变积分、梯形积分、抗积分饱和功能。微分项采用不完全微分和一阶滤波。alpha值越大,过滤效果越强*/

  30空PID调节器(CLASSICPID *vPID)

  31 {

  32 float thisError

  33浮点结果;

  34浮动因子;

  35浮动增量;

  36 float pError,dError,iError

  37

  3IF(* VPID-PMA 1)//手动模式

  39 {

  40 vPID-输出=*vPID-

  1//设置无扰切换

  42 vPID- result=(vPID-最大值-vPID-最小值)*vPID-输出/100.0 -vPID-最小值;

  43 *vPID- pSV=*vPID-

  44 vPID-设定点=*vPID-

  45 }

  4否则//自动模式

  47 {

  48 if(vPID- sm==SMOOTH_ENABLE)

  49 {

  50 smooth setpoint(vPID);

  51 }

  其他52个

  53 {

  54 vPID-设定点=*vPID-

  55 }

  五十六岁

  57 this error=vPID-setpoint-(* vPID-pPV);//获取偏差值

  58结果=vPID-结果;

  59 if (fabs(thisError) vPID-死区)

  60 {

  61 pError=this error-vPID-lasterror;

  62 I error=(thisError vPID-lasterror)/2.0;

  63 dError=this error-2 *(vPID-lasterror)vPID-preerror;

  64

  6//可变积分系数采集

  66 factor=VariableIntegralCoefficient(this error,vPID- errorabsmax,vPID-error absmin);

  67

  6//用不完全微分计算微分项增量

  69 vPID-delta diff=(* vPID-pKd)*(1-vPID-alpha)* dError vPID-alpha * vPID-delta diff;

  70

  71增量=(* vPID-pKp)* pError(* vPID-pKi)* factor * I error vPID-delta diff;//增量计算

  72 }

  73其他

  74 {

  75 if((fabs(vPID-设定点-vPID-最小值)vPID-死区)(fabs(* vPID-pPV)-vPID-最小值)vPID-死区))

  76 {

  77结果=vPID-最小值;

  78 }

  79增量=0.0;

  80 }

  81

  8//正反动作设置

  83 if(vPID- direct==DIRECT)

  84 {

  85结果=结果增量;

  86 }

  87其他

  88 {

  89结果=结果-增量;

  90 }

  91

  2/*对于输出限值,避免过冲和积分饱和*/

  93如果(结果=vPID-最大值)

  94 {

  95结果=vPID-最大值;

  96 }

  97如果(结果=vPID-最小值)

  98 {

  99结果=vPID-最小值;

  100 }

  101

  102 vPID-preerror=vPID-lasterror;//为下一次操作存储偏差。

  103 vPID-lasterror=this error;

  104 vPID-result=结果;

  105

  106 vPID-output=(vPID-result-vPID-minimum)/(vPID-maximum-vPID-minimum)* 100.0;

  107 * vPID-pMV=vPID-output;

  108 }

  09} 4.摘要

  介绍了在不改变PID控制器控制方式的情况下,使设定值在小范围内突变的方法。测试结果可以满足我们的要求。这里,步长固定为范围的十分之一。事实上,我们可以将其作为一个初始化参数进行修改,甚至可以在一定条件下采用可变步长来满足更高的控制要求。

  欢迎关注:

  想更方便及时的阅读相关文章,请关注我的微信微信官方账号【木南创智】

  转载请联系作者取得转载授权,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • waitpid函数作用,c wait函数
  • waitpid函数作用,c wait函数,详解C语言中的wait()函数和waitpid()函数
  • ,,javascript SpiderMonkey中的函数序列化如何进行
  • spiderfoot安装,spiderfoot会被对手反扫描
  • PySpider,pyspider官方文档
  • C语言PID,pid控制算法的c语言实现
  • pid控制死区范围,带死区的pid控制方法有何优点
  • pid控制器中微分的作用,pid控制微分方程
  • 微分先行的pid控制算法课程设计,什么是微分先行pid控制
  • 设计pid控制器并设定参数,pid控制器参数设置
  • PID控制器百科,PID控制实现
  • PID控制算法原理,pid 控制算法
  • pid控制中积分控制指什么,数字pid控制器积分项的改进有哪些
  • 通过进程名查找进程的pid,linux根据程序名查进程
  • 串级控制系统pid怎么调,串级控制pid参数怎么调节
  • 留言与评论(共有 条评论)
       
    验证码: