PID控制调节,pid调节器的使用操作与调整

  PID控制调节,pid调节器的使用操作与调整

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

  1.提问

  PID控制器的效果众所周知,但有时我们想强制输出某个值来查看执行器的响应,或者有时我们想直接指定执行器的行为而不要求它随时调整。在这些情况下我们应该怎么做?

  这时,我们需要解释两个定义。当PID控制器用于自动调节时,我们称之为自动运行;在上述情况下,当我们直接指定控制器的输出,或者直接指定执行器的行为时,我们称之为手动。显然,为了实现上述相应的操作,我们需要在PID控制器中加入手动自动转换功能。在本文中,我们将讨论这个问题。

  2.分析和设计

  现在需要考虑的是如何实现自动换手功能。首先,我们需要给PID对象添加一个属性,用来标识PID控制器是处于手动模式还是自动模式。为了对外修改PID对象的手动自动模式,我们设计了一个指向uint16 _ t的指针类型,所以我们设计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 } CLASSICPID对于手动自动操作,我们需要通过外部变量赋值。初始化时,我们默认将其初始化为自动模式。毕竟使用PID控制器的目的不是手动操作。

  3.软件实现。

  我们给PID对象添加了手动自动运行的属性,那么根据这个属性我们需要对PID控制器做哪些修改呢?让我们考虑一下在自动状态和手动状态下需要做哪些工作。

  自动状态下没事做,让PID控制器正常输出就好。在手动状态下,我们希望PID控制器的输出是我们人为给定的输出。只有这样,自然不行。我们来考虑一下PID控制器由自动改为手动可能会对系统产生什么影响。事实上,当我们从自动改为手动时,只要不修改输出,整个系统的状态就不会改变。但是,当从手动切换到自动时,测量值也会随着我们修改输出值而改变。在原设定值的情况下,从手动切换到自动时,不可避免地会出现阶跃干扰。为了避免这种情况,我们在手动状态下让设定值跟随测量值,实现无扰切换。相应地,我们修改PID控制器代码如下:

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

  2空PID调节器(CLASSICPID *vPID)

  3 {

  4 float thisError

  5浮动结果;

  6浮动因子;

  7浮动增量;

  8 float pError,dError,iError

  九

  1if(* vpid-PMA 1)//手动模式

  11 {

  12 vPID-输出=*vPID-

  13 //设置无扰动切换

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

  15 *vPID- pSV=*vPID-

  16 vPID-设定点=*vPID-

  17 }

  18 else //自动模式

  19 {

  20 vPID-设定值=*vPID-

  21该误差=vPID-设定点-(* vPID-pPV);//得到偏差值

  22结果=vPID-结果;

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

  24 {

  25 pError=this error-vPID-lasterror;

  26i error=(thisError vPID-lasterror)/2.0;

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

  28

  29 //变积分系数获取

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

  31

  32 //计算微分项增量带不完全微分

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

  34

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

  36 }

  其他37个

  38 {

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

  40 {

  41结果=vPID-最小值;

  42 }

  43增量=0.0;

  44 }

  45

  46结果=结果增量;

  47

  48 /*对输出限值,避免超调和积分饱和问题*/

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

  50 {

  51结果=vPID-最大值;

  52 }

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

  54 {

  55结果=vPID-最小值;

  56 }

  57

  58 vPID-preerror=vPID-lasterror;//存放偏差用于下次运算

  59 vPID-lasterror=这个错误;

  60 vPID-结果=结果;

  61

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

  63 * vPID-pMV=vPID-output;

  64 }

  65 }4、总结

  我们添加了手自动转换功能,并在手动转为自动时,做了无扰动切换的预置。经测试效果与我们的预期一致。当我们将PID控制器置为自动状态时,我们通过修改设定值(服务)来实现对系统的影响。而当我们将PID控制器置为手动状态时,我们通过修改输出值(MV)来实现对系统的影响。

  欢迎关注:

  如果您希望更方便且及时的阅读相关文章,关注我的微信公众号【木南创智】

郑重声明:本文由网友发布,不代表盛行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根据程序名查进程
  • 留言与评论(共有 条评论)
       
    验证码: