pid各参数对控制系统的调节作用,简述pid调节器的参数对控制性能的影响

  pid各参数对控制系统的调节作用,简述pid调节器的参数对控制性能的影响

  我们发表了一系列与PID控制器相关的文章,包括经典PID控制器和参数自适应PID控制器。虽然该系列PID控制器实现了主要功能,在实际使用中取得了良好的效果,但仍有许多细节可以改进,以提高性能和灵活性。所以在本文中,我们将讨论PID控制器的改进,以达到动态调整参数的目的。

  1.提问

  我们最初开发PID控制器的时候,主要关注的是它的算法实现,并没有太关注它的使用过程。但是在我们的使用过程中,发现了一些不灵活的地方。

  在原有的PID控制器中,设定值是通过外部分配PID对象的参数来实现的。虽然不影响使用,但是我们处理PID控制器中的参数设定值不是很方便。但是在原来的PID控制器中,输出值在外部是不可见的,只能通过PID对象查看,不能改变。这些使得这些参数的操作显得不灵活。

  而且在原有的PID控制器中,三个调节参数都不能随时外部调节,这显然不能满足很多应用的需要,因为PID参数的调节是一项非常普通的工作。所以在本文中,我们将考虑这些参数的动态调整。

  2.分析和设计

  为了使PID控制器更加灵活,我们需要对PID对象进行必要的修改。对于PID对象,我们认为测量值、设定值和输出值是对象的属性。但是我们并不直接使用这些变量作为对象属性,因为这样从外部无法达到灵活操作的目的。我们用几个指向浮点变量的指针作为对象属性,初始化后这些指针会指向我们的测量值、设定值和输出值变量。

  我们想从外部修改同样的三个PID参数。我们还在外部将它们定义为变量,在PID对象中将它们定义为指向这三个变量的浮点指针。当初始化对象时,我们给这些指针分配变量地址。据此,我们将PID对象类型定义为:

  1 /*定义结构和公共机构*/

  2 typedef结构经典

  3 {

  4 float * pPV//测量值指针

  5 float * pSV//设置值指针

  6 float * pMV//输出值指针

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

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

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

  10

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

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

  13浮动预误差;//前两拍的偏差

  14浮动死区;//死区

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

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

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

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

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

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

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

  22浮点deltadiff//差分增量

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

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

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

  26浮点lastDeltaPv//前一个节拍的过程测量值的增量

  27 } CLASSICPID3.软件实现。

  我们计划将PID参数和流程变量更改为指向浮点变量的指针,那么我们需要在代码中进行哪些更改呢?需要修改的功能主要有两个:PID调节功能和PID对象初始化功能。

  首先,我们来看看PID对象的初始化函数。我们知道,将这些变量修改成指向浮点变量方法的指针后,必须在初始化时指定具体的变量地址,否则会指向不可预知的位置。因此,我们将初始化函数修改如下:

  1 /* PID初始化应在修改vPID对象的值之前完成*/

  2 void pidrain初始化(经典PID * vpid,//PID控制器对象

  3 float *pPV,//测量值指针

  4 float *pSV,//设置值指针

  5 float *pMV,//输出值指针

  6 float *pKp,//比例因子指针

  7 float *pKi,//整型系数指针

  8 float *pKd,//微分系数指针

  9浮点vMax,//控制变量范围

  1floatvmin,//控制变量的零点

  11 )

  12 {

  13 if((vPID==NULL) (pPV==NULL) (pSV==NULL) (pMV==NULL)(pKp==NULL) (pKi==NULL) (pKd==NULL))

  14 {

  15返回;

  16 }

  17 vPID-pPV=pPV;

  18 vPID-pSV=pSV;

  19 vPID-pMV=pMV;

  20 vPID-pKp=pKp;

  21 vPID-pKi=pKi;

  22 vPID-pKd=pKd;

  23

  24 vPID-maximum=vMax;/*输出值上限*/

  25 vPID-最小值=vMin/*输出值下限*/

  26

  27 vPID-setpoint=* pPV;/*设定值*/

  28

  29 vPID-lasterror=0.0;/*先前节拍偏差*/

  30 vPID-pre error=0.0;/*前两拍的偏差*/

  31 vPID-result=vMin;/*PID控制器结果*/

  32 vPID-output=0.0;/*产值,百分比*/

  33

  34 vPID-errorabsmax=(vMax-vMin)* 0.8;

  35 vPID-errorabsmin=(vMax-vMin)* 0.2;

  36

  37 vPID-死区=(vMax-vMin)* 0.0005;/*死区*/

  38 vPID-alpha=0.2;/*不完全微分系数*/

  39 vPID-delta diff=0.0;/*微分增量*/

  40

  41 vPID-integral value=0.0;

  四十二个

  43 vPID-mode=mode;

  44}其次,我们还需要修改PID调节功能。在原来的PID调节器中,过程值是作为函数参数输入的,PID参数是作为变量存在于对象中的,所以需要针对这两个方面做相应的修改:

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

  2空PID调节器(CLASSICPID *vPID)

  3 {

  4 float thisError

  5浮动结果;

  6浮动因子;

  7浮动增量;

  8 float pError,dError,iError

  九

  10 vPID-设定点=*vPID-

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

  12结果=vPID-结果;

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

  14 {

  15 pError=this error-vPID-lasterror;

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

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

  18

  9//可变积分系数采集

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

  21

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

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

  24

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

  26 }

  其他27个

  28 {

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

  30 {

  31结果=vPID-最小值;

  32 }

  33增量=0.0;

  34 }

  35

  36结果=结果增量;

  37

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

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

  40 {

  41结果=vPID-最大值;

  42 }

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

  44 {

  45结果=vPID-最小值;

  46 }

  47

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

  49 vPID-lasterror=this error;

  50 vPID-result=结果;

  51

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

  53

  54 * vPID-pMV=vPID-output;

  55 }

  56 }4.摘要

  我们将PID参数和过程变量改为对象中包含的指针,这样当我们修改来自上位机或其他进程的变量值时,也同步修改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控制器的调节原则,试说明pid控制器的优点
  • 通过进程名查找进程的pid,linux根据程序名查进程
  • 留言与评论(共有 条评论)
       
    验证码: