精华内容
下载资源
问答
  • PID控制器

    2020-05-25 09:12:19
    我发现你有时候对PID控制器的位置和概念有些模糊,它到底处于什么样的一个位置,输入是什么,输出是什么 https://www.bilibili.com/video/BV1ft411a7Kw

    我发现你有时候对PID控制器的位置和概念有些模糊,它到底处于什么样的一个位置,输入是什么,输出是什么

    https://www.bilibili.com/video/BV1ft411a7Kw

     

    PID的输入就是偏差,PID控制就是对偏差的控制。

    比例,积分,微分,是指偏差的比例,积分,微分,理解了这个,别人再叫你写PID的式子你怎么会不会写,也不会忘。清楚了这个,叫你写串级PID的式子你都写得出来!!!!还能自由做变换。

    包括串级PID你也要能画出来。要知道外环的输出是内环的输入也就是内环的期望。

     

    展开全文
  • Pid控制器

    2020-08-30 14:07:06
    PID控制算法 PID是使用最为广泛控制算法的算法之一,P、I、D是三种计算方法叠加的算法;P比例控制,I积分控制,D微分控制。 以控制无人车速度的方式分别介绍 比例控制 当前有一辆在路上行驶的汽车,目标车速为40km/h...

    PID控制算法

    PID是使用最为广泛控制算法的算法之一,P、I、D是三种计算方法叠加的算法;P比例控制,I积分控制,D微分控制。

    以控制无人车速度的方式分别介绍

    比例控制

    当前有一辆在路上行驶的汽车,目标车速为40km/h,当前车速为20km/h,当前车速与目标车速有一个20迈的误差e,要想尽快的达到目标车速可以在现有的加速度0上累加一个加速度,这个累加的加速度为p*e,将比例系数p选为0.3,此时的累加加速度为6,下一时刻的车速为26,误差为14,下一时刻需要的增加的加速度为4.2,总的加速度为10.2,再下一时刻的速度为36.4,速度误差为3.6,增加的加速度为1.08,总加速度为11.28,下一时刻的速度为47.68,速度误差为7.68,需要的加速度为-2.304,下一时刻的速度为56.656,进入一个加速度减小,速度逐渐回落的一个震荡过程,可以看出速度在很长时间内无法达到目标速度,所以单纯通过比例控制速度是不可取的。

    比例与微分控制

    为什么跳过积分控制?当然是速度控制一般只用PD控制了。
    比例与积分同时控制车速,微分是选为误差的导数,我们知道函数的导数反应函数未来发展的趋势,这样就可以预知车速的变化,进而控制汽车加速的大小。
    以上面分析为例,当速度为20时,只有一个误差,微分环节为0,此时增加的加速度6,速度为26时,增加的加速度为4.2,前后两个速度的误差为20和14,可以看出误差在减小,误差函数的导数是一个负值,取微分环节的系数为0.3,则加速度为-1.8,那么下一时刻加速度为6+4.2-0.36=8.4,下一时刻的速度为34.4,误差为5.6,误差的误差为8.4,此时的加速度为5.88;下一时刻的速度为40.28,速度误差为0.28,误差的误差为5.32,加速度为5.88+0.280.3-5.32*0.3=4.368;下一时刻的速度为44.648,速度误差为-4.648,误差的误差为4.928,加速度为1.4952;下一时刻的速度为46.1432,误差为-6.1432,误差的误差为1.4952,加速度为-0.79632,可以看出在最高速到达46.1432时汽车就开始减速,最终达到40km/h速度左右。

    积分控制

    展开全文
  • PID控制器开发笔记之十二:模糊PID控制器的实现

    万次阅读 多人点赞 2018-11-10 19:14:06
    在现实控制中,被控系统并非是线性时不变的,往往需要动态调整PID的参数,而模糊控制正好能够满足这一需求,所以在接下来的这一节我们将讨论模糊PID控制器的相关问题。模糊PID控制器是将模糊算法与PID控制参数的自整...

    在现实控制中,被控系统并非是线性时不变的,往往需要动态调整PID的参数,而模糊控制正好能够满足这一需求,所以在接下来的这一节我们将讨论模糊PID控制器的相关问题。模糊PID控制器是将模糊算法与PID控制参数的自整定相结合的一种控制算法。可以说是模糊算法在PID参数整定上的应用。

    1、模糊算法的原理

    模糊算法是一种基于智能推理的算法,虽然称之为模糊算法其实并不模糊,实际上是一种逐步求精的思想。一个模糊控制器主要是由模糊化,模糊推理机和精确化三个功能模块和知识库(包括数据库和规则库)构成的。在此我们近讨论模糊控制的几个主要问题。

    1.1、输入量的量化

    输入数据都是精确的,要实现模糊算法需要现对其实现量化。所谓量化就是通过量化函数将输入量投射到一定的数字级别,一般都是相对于0对称的数字区间。具体投射到怎样的区间根据实际情况而定,因为这会直接影响到计算的精度。

    1.2、模糊化

    模糊化是模糊算法非常重要的一步,首先确定对应各语言变量的模糊子集,然后根据量化的结果,我们就可以判断该输入所属的集合并计算出对应的隶属度。计算隶属度的方法有很多,最常用的是使用三角形隶属度函数或梯形隶属度函数等来计算获得。

    1.3、规则库

    规则库是基于控制量的模糊化而的味道的,是实现模糊推理的基础,很大程度上依赖于经验来完成。规则库的表现形式可以有多种,具体实现的形式根据我们实现的方便。

    1.4、推理机

    推理决策才是模糊控制的核心,它利用知识库中的信息和模糊运算方式,模拟人的推理决策的思想方法,在一定的输入条件下激活相应的控制规则给出适当的模糊控制输出。

    1.5、精确化

    我们通过模糊推理,得到一系列的模糊表达,需要进行解模糊操作才能得到紧缺的数据。常用的解模糊方法有:

    • 最大隶属度法——计算简单,适用于控制要求不高场合。

    • 重心法——输出更平滑,但计算难度大

    • 加权平均法——一般在工业上应用最广泛

    1.6、工程量化

    系统控制输出是一个精确的数,但不是可以直接用于对象控制的物理量,所以在最后还要按照我们的需要进行转换。比如对应PID的参数则可进行必要的转换和修正在输出给PID控制器。

    2、模糊PID算法的设计

    前面简单的描述了模糊算法的基本原理,接下来我们将讨论如何将其应用于PID控制当中。所谓模糊PID控制是以偏差e及偏差的变化ec为输入,利用模糊控制规则在线对PID参数进行调整,以满足不同的偏差e和偏差的增量ec对PID参数的不同要求。其结构图如下:

    2.1输入值的模糊化

    输入值的模糊化就是将用于计算的输入对应到标准化的数值区间,并根据量化结果和模糊化子集得到该输入对子集的隶属度。我们在使用偏差e和偏差增量ec作为输入实现控制参数调整则需要对e和ec进行模糊化。

    首先,我们确定e和ec的模糊子集,对于PID控制我们选则:负大[NB]、负中[NM]、负小[NS]、零[ZO]、正小[PS]、正中[PM]、正大[PB]等7个语言变量就能够有足够精度表达其模糊子集。所以我们定义e和ec的模糊子集均为{NB,NM,NS,ZO,PS,PM,PB}。

    确定了模糊子集,我们怎么将e和ec的具体值和模糊集对应上呢?我们需要引入量化函数。要确定量化函数,我们先引入e和ec模糊集对应的论域,定义为{-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6}。对于任何一个物理量测量信号都有一个量程范围,我们记为Vmax和Vmin,和自然在PID调节时设定值的范围预期相同,所以偏差e的范围就是Vmin-Vmax到Vmax-Vmin的范围内,而偏差的增量范围则是其两倍。这里我们采用线性方式量化,则其函数关系为:

    利用上述的量化函数就可以将e和ec量化,我们可以采用如4舍5入的方式获取确定的模糊子集。但考虑到e和ec的变化是连续变化的,4舍5入对控制精度可能存在影响,所以我们引入隶属度来实现这一过程。

    最后我们确定e和ec在模糊子集上的隶属度。隶属度是一个介于0和1之间的值,用以描述对应一个输入属于某一个模糊自己的程度。一般我们描述成隶属度函数,可采用的隶属度函数很多,我们在次采用线性的隶属度函数,或者称为三角隶属度函数,其函数关系如下:

    如果我们量化后的结果是1,那么属于ZO的隶属度为0.5,同样属于PS的隶属度也是0.5。至此,模糊化全部完成。

    2.2、建立模糊规则表

    前面我们简述了输入的模糊化,但模糊推理才是模糊控制的根本。为了实现模糊推理首先我们要建立模糊推理的规则库或者称知识库,然后建立推理机进行推理。

    首先,我们来建立模糊规则库,在这里我们要对Kp、Ki和Kd三个参数进行调整,所以要建立这3个变量的模糊规则库。

    2.2.1、Kp模糊规则设计

    在PID控制器中,Kp值的选取决定于系统的响应速度。增大Kp能提高响应速度,减小稳态偏差;但是,Kp值过大会产生较大的超调,甚至使系统不稳定减小Kp可以减小超调,提高稳定性,但Kp过小会减慢响应速度,延长调节时间。因此,调节初期应适当取较大的Kp值以提高响应速度,而在调节中期,Kp则取较小值,以使系统具有较小的超调并保证一定的响应速度;而在调节过程后期再将Kp值调到较大值来减小静差,提高控制精度。基于上述描述我们定义Kp的模糊规则如下:

    2.2.2、Ki模糊规则设计

    在系统控制中,积分控制主要是用来消除系统的稳态偏差。由于某些原因(如饱和非线性等),积分过程有可能在调节过程的初期产生积分饱和,从而引起调节过程的较大超调。因此,在调节过程的初期,为防止积分饱和,其积分作用应当弱一些,甚至可以取零;而在调节中期,为了避免影响稳定性,其积分作用应该比较适中;最后在过程的后期,则应增强积分作用,以减小调节静差。依据以上分析,我们制定的Ki模糊规则如下:

    2.2.3、Kd模糊规则设计

    微分环节的调整主要是针对大惯性过程引入的,微分环节系数的作用在于改变系统的动态特性。系统的微分环节系数能反映信号变化的趋势,并能在偏差信号变化太大之前,在系统中引入一个有效的早期修正信号,从而加快响应速度,减少调整时间,消除振荡.最终改变系统的动态性能。因此,Kd值的选取对调节动态特性影响很大。Kd值过大,调节过程制动就会超前,致使调节时间过长;Kd值过小,调节过程制动就会落后,从而导致超调增加。根据实际过程经验,在调节初期,应加大微分作用,这样可得到较小甚至避免超调;而在中期,由于调节特性对Kd值的变化比较敏感,因此,Kd值应适当小一些并应保持固定不变;然后在调节后期,Kd值应减小,以减小被控过程的制动作用,进而补偿在调节过程初期由于Kd值较大所造成的调节过程的时间延长。依据以上分析,我们制定Kd的模糊规则如下:

    接下来,根据偏差E和偏差增量EC模糊化的结果以及规则库推理出∆Kp、∆Ki、∆Kd对应的模糊子集。由于前面我们设计的是采用隶属度函数来定义输入输出量在模糊子集的隶属度,所以推理出来的∆Kp、∆Ki、∆Kd的模糊子集通常是一个由模糊变量组成的矩阵。而输入量E和EC则是一个由模糊变量组成的向量。

    最后,我们需要明确不同的模糊变量所对应的量化数据。这个量化数据与物理量的对应则根据具体的不同对象是完全不一样的。

    2.3、解模糊处理

    对于求得的目标对象,我们还需要将其你模糊处理以使其与具体的物理量相对应。在模糊PID调解中,我们需要的是Kp,Ki和Kd,所以我们需要根据模糊推理的结果得到我们想要的Kp,Ki和Kd值。

    我们前面设计了三角隶属度函数,并采用相同的量化目标即论域{-6,6},所以在某一时刻,输入输出所处的模糊变量的隶属度是相同的,基于这一基础,我们采用重心法计算各输出量的量化值。其公式如下:

    其实因为我们采用的隶属度函数的特性,在任何方向的计算隶属度的和均为1,所以分母可以省略。于是每一个对象的计算实际上就是矩阵操作,公式如下:

    如果使用的是量化值,则还需要转为实际值,关于这一点直接使用物理量值也是没问题的,怎么处理根据实际需要确定。得到增量后,我们也可以引入系数来放大和缩小Kp,Ki和Kd变化量,具体实现公式如下:

    ,其中∆K为我们所计算得到的值,而α为系数,设定增量对最终只的影响。

    3、模糊PID算法实现

    前面我们描述了算法的全过程,接下来我们编码实现之。首先我们依然需要定义一个模糊PID控制器的结构对象。

    /*定义结构体和公用体*/
    typedef struct
    {
      float setpoint;               /*设定值*/
      float kp;                     /*比例系数*/
      float ki;                     /*积分系数*/
      float kd;                     /*微分系数*/
      float lasterror;              /*前一拍偏差*/
      float preerror;               /*前两拍偏差*/
      float deadband;               /*死区*/
      float output;                 /*输出值*/
      float result;                 /*物理量输出值*/
      float maximum;                /*输出值的上限*/
      float minimum;                /*输出值的下限*/
    
      float maxdKp;                 /*Kp增量的最大限值*/
      float mindKp;                 /*Kp增量的最小限值*/
      float qKp;                    /*Kp增量的影响系数*/
      float maxdKi;                 /*Ki增量的最大限值*/
      float mindKi;                 /*Ki增量的最小限值*/
      float qKi;                    /*Ki增量的影响系数*/
      float maxdKd;                 /*Kd增量的最大限值*/
      float mindKd;                 /*Kd增量的最小限值*/
      float qKd;                    /*Kd增量的影响系数*/
    }FUZZYPID;

    接下来,实现输入值的模糊化。我们前面已经设计了采用线性量化函数以及三角隶属度函数,所以实现就简单了。

    /*线性量化操作函数,论域{-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6}*/
    static void LinearQuantization(FUZZYPID *vPID,float pv,float *qValue)
    {
      float thisError;
      float deltaError;
    
      thisError=vPID->setpoint-pv;                  //计算偏差值
      deltaError=thisError-vPID->lasterror;         //计算偏差增量
    
      qValue[0]=6.0*thisError/(vPID->maximum-vPID->minimum);
      qValue[1]=3.0*deltaError/(vPID->maximum-vPID->minimum);
    }

    对于量化函数实际上可根据需要采用不同的函数,如速降曲线函数,正太分布函数以及其它一元函数等都是可以的,但对于我们在这里的实现目标使用线性函数就足够了。还有隶属度函数也是一样有多种选择,我们这里采用计算量较小的三角隶属度函数:

    /*隶属度计算函数*/
    static void CalcMembership(float *ms,float qv,int * index)
    {
      if((qv>=-NB)&&(qv<-NM))
      {
        index[0]=0;
        index[1]=1;
        ms[0]=-0.5*qv-2.0;  //y=-0.5x-2.0
        ms[1]=0.5*qv+3.0;   //y=0.5x+3.0
      }
      else if((qv>=-NM)&&(qv<-NS))
      {
        index[0]=1;
        index[1]=2;
        ms[0]=-0.5*qv-1.0;  //y=-0.5x-1.0
        ms[1]=0.5*qv+2.0;   //y=0.5x+2.0
      }
      else if((qv>=-NS)&&(qv<ZO))
      {
        index[0]=2;
        index[1]=3;
        ms[0]=-0.5*qv;      //y=-0.5x
        ms[1]=0.5*qv+1.0;   //y=0.5x+1.0
      }
      else if((qv>=ZO)&&(qv<PS))
      {
        index[0]=3;
        index[1]=4;
        ms[0]=-0.5*qv+1.0;  //y=-0.5x+1.0
        ms[1]=0.5*qv;       //y=0.5x
      }
      else if((qv>=PS)&&(qv<PM))
      {
        index[0]=4;
        index[1]=5;
        ms[0]=-0.5*qv+2.0;  //y=-0.5x+2.0
        ms[1]=0.5*qv-1.0;   //y=0.5x-1.0
      }
      else if((qv>=PM)&&(qv<=PB))
      {
        index[0]=5;
        index[1]=6;
        ms[0]=-0.5*qv+3.0;  //y=-0.5x+3.0
        ms[1]=0.5*qv-2.0;   //y=0.5x-2.0
      }
    }

    接下来,我们实现模糊推理的函数,有了前面的基础和模糊规则库,模糊计算的函数其实已经简单了。

    /*解模糊化操作,根据具体的量化函数和隶属度函数调整*/
    static void FuzzyComputation (FUZZYPID *vPID,float pv,float *deltaK)
    {
      float qValue[2]={0,0};        //偏差及其增量的量化值
      int indexE[2]={0,0};          //偏差隶属度索引
      float msE[2]={0,0};           //偏差隶属度
      int indexEC[2]={0,0};         //偏差增量隶属度索引
      float msEC[2]={0,0};          //偏差增量隶属度
      float qValueK[3];
    
      LinearQuantization(vPID,pv,qValue);
    
      CalcMembership(msE,qValue[0],indexE);
      CalcMembership(msEC,qValue[1],indexEC);
    
      qValueK[0]=msE[0]*(msEC[0]*ruleKp[indexE[0]][indexEC[0]]+msEC[1]*ruleKp[indexE[0]][indexEC[1]])
                +msE[1]*(msEC[0]*ruleKp[indexE[1]][indexEC[0]]+msEC[1]*ruleKp[indexE[1]][indexEC[1]]);
      qValueK[1]=msE[0]*(msEC[0]*ruleKi[indexE[0]][indexEC[0]]+msEC[1]*ruleKi[indexE[0]][indexEC[1]])
                +msE[1]*(msEC[0]*ruleKi[indexE[1]][indexEC[0]]+msEC[1]*ruleKi[indexE[1]][indexEC[1]]);
      qValueK[2]=msE[0]*(msEC[0]*ruleKd[indexE[0]][indexEC[0]]+msEC[1]*ruleKd[indexE[0]][indexEC[1]])
                +msE[1]*(msEC[0]*ruleKd[indexE[1]][indexEC[0]]+msEC[1]*ruleKd[indexE[1]][indexEC[1]]);
    
      deltaK[0]=LinearRealization(vPID->maxdKp,vPID->mindKp,qValueK[0]);
      deltaK[1]=LinearRealization(vPID->maxdKi,vPID->mindKi,qValueK[1]);
      deltaK[2]=LinearRealization(vPID->maxdKd,vPID->mindKd,qValueK[2]);
    }

    至此,Kp、Ki和Kd的增量已经得到,剩下的就是修正三个参数,并用于实现PID调节,与普通的增量型PID无异,不再赘述。

    4、总结

    模糊PID算法是模糊算法在PID参数整定上的应用,与纯粹的模糊控制算法是有区别的。普通的模糊控制器适用于直接推理控制器的输出,而模糊PID算法使用模糊算法修改PID参数,最终的控制器输出依然是由PID控制器来实现的。

    模糊控制本身是非常复杂且具体应用方式很多。大多是针对特定对象的专业控制器,已经脱离了PID这种通用性控制器的范畴。此外比较热门的还有模糊多变量控制器是属于先进控制系统(APC)的范畴,有机会再讨论。

    欢迎关注:

    展开全文
  • 这个 simulink 文件是关于 PID 控制器作为子系统的,没有术语N -------------------- s+N
  • PID控制器:用于太空机器人的MATLAB Simulink PID控制器
  • pid控制器代码matlab 珀尔帖 使用Arduino和numPy的PID控制器。 作为基础控制系统课程的项目撰写 输出PWM信号,该信号可以过滤为直流电压,然后发送到Peltier设备。 Arduino代码处理PID常数并输出结果。 反馈环路是...
  • 精品文档可编辑 值得下载 利用MATLAB实现PID控制器的解析法整定 摘 要PID控制是最早发展起来的控制方法之一由于它所涉及的算法和结构简单且可靠性高因此被广泛应用于工业过程控制当中 但常规PID控制器参数往往由于整...
  • 帮助用户设计/改进PID控制器。 所获得的PID控制器具有主动抗扰能力。 该方法来自论文“用于不确定系统的新型抗干扰PID的设计,分析和应用”, ...
  • pid控制器代码matlab REEF控制 REEF控制程序包包含一组简单的级联PID控制器,旨在实现姿态,速度和位置控制。 该软件包最初打算用于使用REEF估算器的PID控制器,但可以轻松地与其他估算器和其他控制器集成。 该...
  • android的pid控制器

    2020-12-24 14:20:12
    android的pid控制器
  • pid控制器代码matlab 设计一个简单的PID来控制机器人头 先决条件 您应该了解罐子对您有什么帮助,以及它为何如此多功能和有效。 :winking_face: 如果还不是这种情况,那么下面是关于该参数的快速或半快速更新的折衷...
  • pid控制器设计代码matlab pid_controller Matlab code for PID controller design using Nicols method
  • pid控制器代码matlab matlab_soft_pid 合理可靠且快速的软件PID控制器状态:该代码尚未准备好在其他项目中使用。 测试未实施。 该代码提供了一种方便的PID功能,用于在环路反馈中运行您自己的计算机,使用适度的硬件...
  • Matlab用RBF神经网络优化PID控制器-用RBF神经网络优化PID控制器.rar 用RBF神经网络优化PID控制器
  • 模糊PID控制器

    2018-12-08 18:01:51
    模糊PID控制器 基于simulink开发 有三个例子可供参考。
  • PID控制器开发笔记之十一:专家PID控制器的实现

    万次阅读 多人点赞 2018-09-09 21:30:49
    再接下来的我们将讨论智能PID控制,智能PID控制不同于常规意义下的智能控制,是智能算法与PID控制算法的结合,是基于PID控制器的智能化优化。 在本章我们首先来探讨一下专家PID算法。正如前面所说,专家PID算法是...

    前面我们讨论了经典的数字PID控制算法及其常见的改进与补偿算法,基本已经覆盖了无模型和简单模型PID控制经典算法的大部。再接下来的我们将讨论智能PID控制,智能PID控制不同于常规意义下的智能控制,是智能算法与PID控制算法的结合,是基于PID控制器的智能化优化。

    在本章我们首先来探讨一下专家PID算法。正如前面所说,专家PID算法是专家系统与PID算法的结合与应用优化,所以我们接下来先简单了解专家控制。

    1、专家控制的基本思想

    专家控制是智能控制的一个分支,是专家系统的理论和技术同控制理论、方法与技术相结合,在无对象模型的情况下,模仿领域专家的经验来实现对被控对象的控制。

    专家控制一般由知识库和推理机构构成主体框架,按照某种策略及时选用恰当的规则进行推理输出,实现控制。其基本结构如下:

    有上图我们不难发现影响专家控制器控制精确性的主要是知识库表达的准确性以及推理机的正确性。知识库越完备、越准确那么对你被控对像的状态识别也就越准确。当然,推理机设计的差别也会对控制结果有影响。

    专家控制器一般来说分为2中实现形式,被称之为直接型专家控制器和间接型专家控制器。所谓直接型专家控制器就是用专门设计的专家控制器直接对被控对象进行控制的方法。该控制器任务和功能都比较简单,一般都是实时在线运行,直接对被控对象进行控制。其结构图如下:

    而所谓间接型专家控制器是指专家控制器作为其他控制器的辅助方式或者相互结合的控制方式来实现的一种控制器。专家系统通过高层决策来影响控制器输出,而这种高层决策可以是在线也可以是离线,器不会直接控制被控对象。其结构图如下:

    所以我们所要讨论的专家PID算法应该是一种直接型专家控制器,因为专家系统决策与PID算法是结合在一起的,并没有独于PID算法的专家控制器,而是专家决策直接决定PID算法机器输出,这与直接型专家控制的定义是相符的。

    2、专家PID的设计思路

    专家PID控制就是基于被控对象和控制规律的各种知识,而不需要知道被控对象的精确模型,利用专家经验来设计PID参数。怎么来实现这一过程呢?我们来分析并推导这一算法。

    我们假设当前为第k采样,当前偏差为e(k),同样前一采样时刻的偏差为e(k-1),而前两个采样时刻的偏差为e(k-2),则可以得到两次的偏差增量为:

    清楚了以上公式,我们再设定偏差的一个极大值,记为Mmax;设定一个偏差较大的中间值,记为Mmid;设定一个偏差的极小值,记为Mmin。根据以上偏差、偏差增量以及偏差极值的设定,我们分析如下:

    1)如果|e(k)|>Mmax

    这种情况说明偏差的绝对值已经很大了,不论偏差变化趋势如何,都应该考虑控制器的输入应按最大(或最小)输出,以达到迅速调整偏差的效果,使偏差绝对值以最大的速度减小。

    这种情况下其实相当于实施开环控制,是一种对偏差出现极限情况的快速响应。

    2)如果|e(k)|≤Mmax

    这种情况我们需要更具系统的变化趋势来分析,具体的情况实施不同的控制方式,我们引入偏差增量来协助分析。

    2.1)当e(k)*e(k)>0或者e(k)=0

    这种情况说明偏差在朝向偏差绝对值增大的方向变化,或者偏差为某一固定值,此时我们再判断偏差的绝对值与偏差的中间值Mmid之间的关系。

    (2.1.1)此时如果|e(k)|>Mmid,说明偏差也较大,可考虑由控制器实施较强的控制作用,以达到扭转偏差绝对值向减小的方向变化,并迅速减小偏差的绝对值。

    (2.1.2)此时如果|e(k)|≤Mmid,说明尽管偏差是向绝对值增大的方向变化,但是偏差绝对值本身并不是很大,可以考虑控制器实施一般的控制作用,只需要扭转偏差的变化趋势,使其向偏差绝对值减小的方向变化即可。

    (2.2)当e(k)*∆e(k)<0且∆e(k)*∆e(k-1)>0或者e(k)=0时,说明偏差的绝对值向减小的方向变化,或者已经达到平衡状态,此时保持控制器输出不变即可。即:U(k)=U(k-1)。

    (2.3)当e(k)*∆e(k)<0且∆e(k)*∆e(k-1)<0时,说明偏差处于极限状态。如果此时偏差的绝对值较大,|e(k)|>Mmid,可以考虑实施较强控制作用。

    如果此时偏差绝对值较小,|e(k)|<Mmid,可以考虑实施较弱控制作用。

    其中,k1为增益放大系数,k1取大于1的值;k2为增益抑制系数,取大于0而小于1的值。

    3)如果|e(k)|<Mmin

    这种情况实际上说明偏差绝对值很小,这种偏差有可能是系统静差引起的,此时必须要引入积分作用,实施PID控制或者PI控制。

    Kp和Ki可以适当减小,以减小控制作用。当偏差小到一定程度后,甚至可以引入死区的概念,是系统稳定下来而不需要去进行调节。

    3、专家PID算法实现

    前面我们了解了专家PID控制器的基本原理,并分析了一个较为常见的专家PID的控制规则。分析规则的过程其实也是一个推理的基本过程,所以我们得到了基本的规则库同时也有相应的推理机,接下来我们就来实现这一算法。

    首先定义一个专家PID的结构体对象:

    /*定义结构体和公用体*/
    typedef struct
    {
      float setpoint;               /*设定值*/
      float kp;                     /*比例系数*/
      float ki;                     /*积分系数*/
      float kd;                     /*微分系数*/
      float lasterror;              /*前一拍偏差*/
      float preerror;               /*前两拍偏差*/
      float result;                 /*PID控制器结果*/
      float output;                 /*输出值,0-100,为百分比值*/
      float maximum;                /*输出值上限*/
      float minimum;                /*输出值下限*/
      float errorabsmax;            /*偏差绝对值最大值*/
      float errorabsmid;            /*偏差绝对值中位值*/
      float errorabsmin;            /*偏差绝对值最小值*/
    }EXPERTPID;

    在上面分析的基础上我们很容易写出来一个专家PID的控制器如下:

    void ExpertPID(EXPERTPID vPID,float pv)
    {
      float thiserror;
      float deltaerror;
      float lastdeltaerror;
      float result;//本次调节输出值
    
      thiserror=vPID->setpoint-pv;
      deltaerror=thiserror-vPID->lasterror;
      lastdeltaerror=vPID->lasterror-vPID->preerror;
    
      if(abs(thiserror)>=vPID->errorabsmax)
      {/*执行规则1*/
        if(thiserror>0)
        {
          result=vPID->maximum;
        }
        if(thiserror<0)
        {
          result=vPID->minimum;
        }
      }
    
      if((thiserror*deltaerror>0)||(deltaerror==0))
      {/*执行规则2*/
       
        if(abs(thiserror)>=vPID->errorabsmid)
        {
          result=vPID->result+2.0*(vPID->kp*deltaerror+vPID->ki*thiserror+vPID->kd*(deltaerror-lastdeltaerror));
        }
        else
        {
          result=vPID->result+0.4*(vPID->kp*deltaerror+vPID->ki*thiserror+vPID->kd*(deltaerror-lastdeltaerror));
        }
      }
    
      if(((thiserror*deltaerror<0)&&(deltaerror*lastdeltaerror>0))||(thiserror==0))
      {/*执行规则3*/
        result=vPID->result;
      }
    
      if((thiserror*deltaerror<0)&&(deltaerror*lastdeltaerror<0))
      {/*执行规则4*/
        if(abs(thiserror)>=vPID->errorabsmid)
        {
          result=vPID->result+2.0*vPID->kp*thiserror;
        }
        else
        {
          result=vPID->result+0.6*vPID->kp*thiserror;
        }
      }
    
      if((abs(thiserror)<=vPID->errorabsmin)&&(abs(thiserror)>0))
      {/*执行规则5*/
        result=vPID->result+0.5*vPID->kp*deltaerror+0.3*vPID->ki*thiserror;
      }
    
      /*对输出限值,避免超调*/
      if(result>=vPID->maximum)
      {
        result=vPID->maximum;
      }
      if(result<=vPID->minimum)
      {
        result=vPID->minimum;
      }
    
      vPID->result=result;
      vPID->preerror=vPID->lasterror;
      vPID->lasterror=thiserror;
      vPID->output=(result/(vPID->maximum-vPID->minimum))*100;
    }

    4、专家PID总结

    本节我们实现了一个专家PID控制器,这是一种专家规则直接与PID算法相结合的直接型专家控制器。通过分析PID的调节过程总结了5条规则,以这5条规则为基础实现了上述的算法。当然这只是一个普遍型的规则库,对于不同的被控对象和控制要求,我们可以采用不同的判断规则,而且各参数的选取需依赖于专家经验,所以规则的获取和使用也会有不同方式。

    欢迎关注:

    展开全文
  • pid控制器代码matlab GA-PID 该存储库包含用于使用遗传算法(GA)调节PID控制器的MATLAB代码。 使用该算法,对三阶传递函数进行了调整,以控制瞬态响应参数和稳态参数。 该存储库的内容 gapid.m pidtest.m myfun.m
  • PID控制器; 改编自 Sebastian Thrun 在 Udacity.org 的课程
  • 此示例说明如何使用实时编辑器任务来离散化对象模型并为离散化对象调整 PID 控制器以实现一组设计要求。
  • pid控制器代码matlab 差动驱动机器人的角度控制 介绍 在此应用中,两轮差速器的角度控制使用PID控制器在matlab环境中对类型为Robot的机器人进行仿真。 在整个模拟角度,误差,角速度,控制信号, 左右轮张力的图表将...
  • 前面我们发布了一系列PID控制器相关的文章,包括经典PID控制器以及参数自适应的PID控制器。这一系列PID控制器虽说实现了主要功能,也在实际使用中取得了良好效果,但还有很多的细节部分可以改进以提高性能和灵活性。...
  • 模糊PID控制器仿真

    2020-11-10 09:23:37
    Matlab/simulink模糊PID控制器仿真设计,其中模糊控制器包括两个输入,三个输出,采用三角形的隶属度函数(响应速度快),当然也可以改成高斯型或者其他,7个隶属度函数,包含49条隶属度规则,其中的模糊控制器需要...
  • pid控制器代码matlab Neural_Networks_for_PID_Controllers 通过各种神经网络策略研究调整PID控制器的项目。 确保读取READ_ME文件以在MATLAB中正确设置代码。 每个文件夹包含一种通过神经网络方法和遗传算法调整PID...
  • PID控制器及PID参数整定rar,PID控制器及PID参数整定
  • PID控制器简要分析PID控制器概述PID控制器的分类位置式PID增量式PID代码实现参数整定 PID控制器概述 PID控制器是自动控制领域一种常见的控制器,其简单易设计的结构和良好的鲁棒性使得其在工业控制中较为常见。PID三...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,638
精华内容 2,255
关键字:

pid控制器