前面我们发布了一系列PID控制器相关的文章,包括经典PID控制器以及参数自适应的PID控制器。这一系列PID控制器虽说实现了主要功能,也在实际使用中取得了良好效果,但还有很多的细节部分可以改进以提高性能和灵活性。所以在这篇中我们来讨论改进PID控制器以串级调节等复杂控制方式。

1、提出问题

我们前面提到的PID控制器其实都是基于单回路来考虑的。但有些时候同一个被控对象可能会受到2个控制变量的影响,或者说为了实现一个被控对象更精确的控制需要同时引入两个控制变量才能得到更好的效果。这个时候我们可以将对被控对象起主要作用的控制变量定义为主变量,相应的控制器作为主控制器;而将对被控对象起次要作用的控制变量定义为从变量,相应的控制器作为从控制器。于是一个串级调节系统就建立起来了。

由以上的控制方框图我们可以知道,如果将副回路看作一个整体的执行单元的话,主控制回路就是一个单回路的PID控制。同样只考虑副回路的话也只是一个单回路的PID控制。但有所不同的是副回路的设定值并非由我们输入给它的,而是由主控制器的输出施加给它的。所以,我们想解决PID控制器的串联问题,需要考虑的就是处理如何将主控制器输出施加给副控制器作为设定的问题。

2、分析设计

我们已经提出了实现PID控制器串级需要考虑的主要问题。接下里我们需要分析采用什么办法解决这一问题并将其数字化。在此,我们先来考虑一下几个方面的问题。

第一个问题是主控制器的输出方式。一般来说,PID算法输出的是实际物理量值的大小。在我们的PID控制器中我们输出了实际物理量值和百分比。

第二个问题是副控制器的输入方式。对于PID控制器设定值输入肯定是与控制变量的物理量相对应的。很显然以主控制器的物理量值作为副控制器的设定输入肯定是不合适的。所以我们只有以百分比的方式作为副控制器设定值的输入。

第三个问题是主副控制器的结合问题。既然以主控制器百分比输出作为副控制器的设定输入。而副控制器的设定值为物理量,我们需要根据百分比和副控制变量的量程来获得副控制器的真正设定值。

第四个问题是PID算法该如何调整。对PID算法的调整并不复杂,事实上我们只需要根据是否是串级来处理设定值就好了。如果不是串级就正常处理;如果是串级就需要根据输入和量程来计算设定值。我们可以用如下的流程图来说明:

为了保持PID控制器算法的严谨性,我们并不需要将这段处理设定值的操作添加到PID控制算法内部,而只需要独立处理完设定值的计算并赋值就可以了。

3、软件实现

我们已经设计了如何实现PID控制器串级的方式。我们还需要将其算法以软件的方式实现才能真正获得我们想要的结果。

首先,我们在PID对象类型中添加标识是否为串级的属性。这一属性用于标识这一PID控制器是否处于串级控制状态。只有副控制器需要设定为串级状态。

其次,我们在PID控制器中添加针对串级副控制器设定值输入的代码。其实很简单,就是在串级状态下,将输入的设定值百分比在物理量量程下计算为设定值的最终值。

/* 通用PID控制器,采用增量型算法,具有变积分,梯形积分和抗积分饱和功能,微分项采用不完全微分,一阶滤波,alpha值越大滤波作用越强                    */
void PIDRegulator(CLASSICPID *vPID)
{float thisError;float result;float factor;float increment;float pError,dError,iError;if(*vPID->pMA<1)      //手动模式{vPID->output=*vPID->pMV;//设置无扰动切换vPID->result=(vPID->maximum-vPID->minimum)*vPID->output/100.0+-vPID->minimum;*vPID->pSV=*vPID->pPV;vPID->setpoint=*vPID->pSV;}else                  //自动模式{if(vPID->sm==SMOOTH_ENABLE) //设定值平滑变化{SmoothSetpoint(vPID);}else{if(vPID->cas==CASCADE)    //串级处理{vPID->setpoint=(vPID->maximum-vPID->minimum)*(*vPID->pSV)/100.0+vPID->minimum;}else{vPID->setpoint=*vPID->pSV;}}thisError=vPID->setpoint-(*vPID->pPV); //得到偏差值result=vPID->result;if (fabs(thisError)>vPID->deadband){pError=thisError-vPID->lasterror;iError=(thisError+vPID->lasterror)/2.0;dError=thisError-2*(vPID->lasterror)+vPID->preerror;//变积分系数获取factor=VariableIntegralCoefficient(thisError,vPID->errorabsmax,vPID->errorabsmin);//计算微分项增量带不完全微分vPID->deltadiff=(*vPID->pKd)*(1-vPID->alpha)*dError+vPID->alpha*vPID->deltadiff;increment=(*vPID->pKp)*pError+(*vPID->pKi)*factor*iError+vPID->deltadiff;   //增量计算}else{if((fabs(vPID->setpoint-vPID->minimum)<vPID->deadband)&&(fabs((*vPID->pPV)-vPID->minimum)<vPID->deadband)){result=vPID->minimum;}increment=0.0;}//正反作用设定if(vPID->direct==DIRECT){result=result+increment;}else{result=result-increment;}/*对输出限值,避免超调和积分饱和问题*/if(result>=vPID->maximum){result=vPID->maximum;}if(result<=vPID->minimum){result=vPID->minimum;} vPID->preerror=vPID->lasterror;  //存放偏差用于下次运算vPID->lasterror=thisError;vPID->result=result;vPID->output=(vPID->result-vPID->minimum)/(vPID->maximum-vPID->minimum)*100.0;*vPID->pMV=vPID->output;}
}

4、总结

这里我们对PID控制器添加了串级控制的配置参数。当一个PID控制器作为串级调节的副控制器时,我们将串级配置参数使能,这样将主调节器的输出给副调节器的设定时就可实现串级。而此时主控制器的串级配置参数并不需要使能,其设定值由操作者给予。

严格来讲串级控制并不是一种单独的控制算法,而是一种控制方式。但为了实现串级控制方式,我们需要对PID控制算法做必要的适应性修改。

欢迎关注:

PID控制器改进笔记之五:改进PID控制器之串级设定相关推荐

  1. PID控制器开发笔记之一:PID算法原理及基本实现

           在自动控制中,PID及其衍生出来的算法是应用最广的算法之一.各个做自动控制的厂家基本都有会实现这一经典算法.我们在做项目的过程中,也时常会遇到类似的需求,所以就想实现这一算法以适用于 ...

  2. PID控制器开发笔记之五:变积分PID控制器的实现

    在普通的PID控制算法中,由于积分系数Ki是常数,所以在整个控制过程中,积分增量是不变的.然而,系统对于积分项的要求是,系统偏差大时,积分作用应该减弱甚至是全无,而在偏差小时,则应该加强.积分系数取大 ...

  3. PID控制器改进笔记之七:改进PID控制器之防超调设定

      我们已经设计了PID控制器,并根据实际使用的情况对器进行了诸多的改进.在这一篇中我们将讨论如何改进PID控制器超调的问题. 1.问题提出   在前面的文章中,我们曾推导过增量式PID控制器的公式, ...

  4. PID控制器开发笔记之七:微分先行PID控制器的实现

    前面已经实现了各种的PID算法,然而在某些给定值频繁且大幅变化的场合,微分项常常会引起系统的振荡.为了适应这种给定值频繁变化的场合,人们设计了微分先行算法. 1.微分先行算法的思想 微分先行PID控制 ...

  5. PID控制器开发笔记之二:积分分离PID控制器的实现

    前面的文章中,我们已经讲述了PID控制器的实现,包括位置型PID控制器和增量型PID控制器.但这个实现只是最基本的实现,并没有考虑任何的干扰情况.在本节及后续的一些章节,我们就来讨论一下经典PID控制 ...

  6. PID控制器开发笔记之八:带死区的PID控制器的实现

    在计算机控制系统中,由于系统特性和计算精度等问题,致使系统偏差总是存在,系统总是频繁动作不能稳定.为了解决这种情况,我们可以引入带死区的PID算法. 1.带死区PID的基本思想 带死区的PID控制算法 ...

  7. PID控制器开发笔记(转)

    源: PID控制器开发笔记 转载于:https://www.cnblogs.com/LittleTiger/p/10499701.html

  8. PID控制器概述及python实现PID控制算法

    PID控制器简要分析 PID控制器概述 PID控制器的分类 位置式PID 增量式PID 代码实现 参数整定 PID控制器概述 PID控制器是自动控制领域一种常见的控制器,其简单易设计的结构和良好的鲁棒 ...

  9. PID控制器开发笔记之十三:单神经元PID控制器的实现

    神经网络是模拟人脑思维方式的数学模型.神经网络是智能控制的一个重要分支,人们针对控制过程提供了各种实现方式,在本节我们主要讨论一下采用单神经元实现PID控制器的方式. 1.单神经元的基本原理 单神经元 ...

最新文章

  1. 高考631能上什么好的计算机学校,2021年高考630分能上什么大学 可以报哪些学校...
  2. C++ 和C 语言混合代码导致的问题
  3. Extjs遇到的一些问题
  4. 由文档那些事儿引发的思考 - 领导,您该反思了
  5. java el ognl_el表达式跟ognl表达式的区别
  6. 阿里云天池发布完整开源数据集!实测可下!
  7. android--------WebView 实现缓存网页数据
  8. 物理设计-数据类型的选择
  9. mysql 5.720安装_MySQL 5.7.27下载安装配置的详细教程
  10. Kernel Panic常见原因以及解决方法
  11. MySQL 8.0复制性能的提升(翻译)
  12. WPF中作用MEF报错The export Xyz is not assignable to type IXyz是设计器问题
  13. UnityEditor-Windows编辑器与Inspector编辑器
  14. Struts2(Maven),小白版
  15. Navivat 中快速快捷查找表和数据
  16. 全方面对比流行报表开发工具,哪一个才是你的菜?
  17. Android使用局域网打印机生成打印任务
  18. 如何通过 HTML+CSS+JS 制作焦点轮播图
  19. 除了编程语言本身,你如果还懂这 7 点,绝对可以在北上深杭拿到 15k
  20. 带你实现女朋友欲罢不能的网易云音乐宇宙尘埃特效

热门文章

  1. 「Luogu5395」【模板】第二类斯特林数·行
  2. ParserError: Error tokenizing data. C error: Expected 1 fields in line 122, saw 2
  3. 深入学习Redis(1):Redis内存模型
  4. Windows10 【系统周期表】【系统下载表】【大型软件表】
  5. MYSQL 定时任务
  6. SGU 187 - Twist and whirl -- want to cheat
  7. 程序员在群询问破解软件
  8. android 自定义 radiobutton 文字颜色随选中状态而改变
  9. C++ primer 4th 第10章《关联容器》总结
  10. mybatis学习笔记-01什么是mybatis