搭建机器人电控系统——PID算法——位置式、增量式、模糊式PID

PID算法

PID算法介绍,不同系数仿真,优缺点

位置式、增量式、模糊式PID

大林算法、史密斯算法和PID算法的区别

位置式PID和增量式PID

位置式PID:

在这里插入图片描述

e(n):期望值与实际值的差

输出量:当前的输出值u(n)

含义:控制的是系统当前位置的实际值与你期望值之间的偏差。特点在于积分项是对所有过去状态误差的累加,所以系统容易受积分I项的影响,需要采用抗积分饱和

适用:适用于不需要积分I项的系统,如倒立摆等中位平衡的系统,采用PD控制即可达到目的。

  float PIDCal_pos ( PIDType *PIDptr, float ThisError ) // 位置式PID
{
  pError = ThisError ; 
  iError = ThisError + PIDptr->LastErr + PIDptr->PreErr;
  dError = ThisError -  PIDptr->LastErr ;
  integral = PIDptr->KI * iError;
  
  PIDptr->PreErr = PIDptr->LastErr;
  PIDptr->LastErr = ThisError;
 }

增量式PID:

在这里插入图片描述

输出量:当前的输出值和上一次输出值之差。

含义:控制的是系统近3次误差的增量,而不是与实际值的偏差。特点在于积分I项没有误差的累加,仅与此次误差大小有关,积分I项变得更加安全,不用对其进行限幅。

适用:适用于带积分I项的系统,如电机控制(尤其是步进电机)、小车速度、位置控制等指定上限输出的系统。

  float PIDCal ( PIDType *PIDptr, float ThisError ) // 增量式PID
{
  pError = ThisError - PIDptr->LastErr; 
  iError = ThisError;
  dError = ThisError - 2 * ( PIDptr->LastErr ) + PIDptr->PreErr;
  integral = PIDptr->KI * iError;
  
  PIDptr->PreErr = PIDptr->LastErr;
  PIDptr->LastErr = ThisError;
  }

模糊控制PID

概念:利用模糊控制实现系统在控制过程中对PID参数的自适应,达到运动过程中实时优化PID参数的目的。
适用:非线性控制系统,输出量随环境振荡较强。
模糊控制:模糊化+模糊推演+清晰化。
在这里插入图片描述

①模糊化:

输入:即PID控制系统的输入量,可以是一维、二维或多维的数据。这里以二维数据为例:考虑误差值e(n)、误差值的变化量Δe(n)同时输入的情形

步骤

第一步,规定输入量的变化区间。如规定误差e(n)在[-100,+100]内,误差的变化量Δe(n)在[-10,+10]内。

第二步,将区间分割为n个部分,规定n-1个特征值。如将误差和误差的变化量各分割为5个部分,规定4个特征值:

  • 误差e(n):[-100,-60] [-60,-20] [-20,20] [20,60] [60 100]
    特征值:-60,-20,20,60
    误差的变化量Δe(n):[-10,-6] [-6 -2] [-2 2] [2,6] [6,10]
    特征值:-6,-2,2,6

第三步,计算每次得到的输入X属于不同特征值的百分比,称为隶属度:
在这里插入图片描述
如误差X=50,隶属于特征值60的隶属度=(60-50)/40=1/4,隶属于特征值20的隶属度=(50-20)/40=3/4。这样一来,隶属度越大就代表隶属于特征值代表的那个区间更强烈,如此时,误差X=50隶属于特征值20代表的区别[20,60]最强烈。

对每个输入的数据都计算它们的隶属度,即是模糊化的含义

②模糊推演:

含义:利用模糊化中计算出的输入值的隶属度,构造模糊规则表,计算得出输出值的隶属度。

步骤

第一步构造模糊集特征表
在模糊化中我们得到了4个特征值,以此将误差和误差的变化量分为4个模糊集。(实际上模糊集分得也可以比4更多,这里主要是讲解模糊控制的思路。一般来说会分为7个模糊集,分别为最小NB,较小NM,稍小NS,零ZO,稍大PS,较大PM,最大PB

第二步构造模糊规则表
构造需要符合输入量之间的关系规则:如误差和误差变化量应当是大对大,小对小,0对0的原则。(有些是大对小)
在这里插入图片描述

第三步,对于输出值
我们同样先规定它的范围,比如[1000,2000],然后将它分成和输入相同的部分,即5个部分[1000,1200] [1200 1400] [1400 1600] [1600 1800] [1800 2000],4个特征值1200,1400,1600,1800。对应4个模糊集:最小、较小、较大、最大。

第四步根据输出量与输入量的关系制定模糊规则表。(可以查阅文献,也可以自己填)
在这里插入图片描述

第五步计算输出隶属度
比如误差为50,隶属于特征值60的隶属度=(60-50)/40=1/4,隶属于特征值20的隶属度=(50-20)/40=3/4。误差的变化量为5,隶属于特征值6的隶属度=(6-5)/4=1/4,隶属于特征值2的隶属度=(5-2)/4=3/4。
于是可以得到4种不同组合的隶属度:

误差隶属于特征值60,误差变化量隶属于特征值6:1/16
误差隶属于特征值60,误差变化量隶属于特征值2:3/16
误差隶属于特征值20,误差变化量隶属于特征值6:3/16
误差隶属于特征值20,误差变化量隶属于特征值2:9/16

③清晰化

含义:利用输入值不同组合得到的输出隶属度加权计算输出值。

步骤

第一步,从中找到4种组合依次对应输出模糊集中的最小、最小、最小、较小。
在这里插入图片描述

第二步,计算输出值=1/16最小1200+3/16最小1200+3/16最小1200+9/16较小1400=1312.5。


模糊PID的步骤:

  • 写好一个位置式PID或者增量式PID的代码
  • 将误差或者误差的变化量,或者二者一起作为模糊控制的输入量
  • 将输入量进行模糊化
  • 将Kp、Ki、Kd的增加量分别作为输出量:ΔKp、ΔKi、ΔKd,并对输出量进行模糊化
  • 根据不同输入量和输出量之间的关系制定模糊规则表,进行模糊推演,计算出不同输入情况下的输出隶属度
  • 对输出量ΔKp、ΔKi、ΔKd进行清晰化
  • 将计算出来的ΔKp、ΔKi、ΔKd与之前的KP、KI、KD系数进行求和带入PID控制器
  • 实现控制系统在不同误差或误差变化量下对PID参数的自适应

ΔKp、ΔKi、ΔKd与输入量的模糊规则表(文献查找,也可以自己填):

①与ΔKp的关系
在这里插入图片描述

②与ΔKi的关系
在这里插入图片描述

②与ΔKd的关系
在这里插入图片描述


模糊PID代码

模糊增量式PID

/*
*********************************************************************************************************
*                                        fuzzy control    模糊控制
*********************************************************************************************************
*/
int qValue[2] = {0,0};
float qValueK[3];
int msE  = 0;
int msEC = 0;
extern float K1 = 0.03;
extern float K2 = 0.009;
extern float K3 = 0.001;
extern float maximum = 3000;
extern float minimum = -3000;

int ruleKp[7][7] = {3,3,2,2,1,0,0,
                    3,3,2,1,1,0,-1,
                    2,2,2,1,0,-1,-1,
                    2,2,1,0,-1,-2,-2,
                    1,1,0,-1,-1,-2,-2,
                    1,0,-1,-2,-2,-2,-3,
                    0,0,-2,-2,-2,-3,-3};
int ruleKi[7][7] = {-3,-3,-2,-2,-1,0,0,
                    -3,-3,-2,-1,-1,0,0,
                    -3,-2,-1,-1,0,1,1,
                    -2,-2,-1,0,1,2,2,
                    -2,-1,0,1,1,2,3,
                    0,0,1,1,2,3,3,
                    0,0,1,2,2,3,3};
int ruleKd[7][7] = {1,-1,-3,-3,-3,-2,1,
                    1,-1,-3,-2,-2,-1,0,
                    0,-1,-2,-2,-1,-1,0,
                    0,-1,-1,-1,-1,-1,0,
                    0,0,0,0,0,0,0,
                    3,-1,1,1,1,1,3,
                    3,2,2,2,1,1,3};
float PIDCal_Fuzzy ( PIDType *PIDptr, float ThisError ) // 模糊增量式PID
{
  float pError,dError,iError,temp,integral;	
  
  pError = ThisError - PIDptr->LastErr; 
  iError = ThisError;
  dError = ThisError - 2 * ( PIDptr->LastErr ) + PIDptr->PreErr;
  /*********模糊控制************/
  //两个输入量:误差ThisError和误差的变化量pError,对两个输入量进行归一化并缩放,这样就和输出量ΔKp、ΔKi、ΔKd在同一量级
  qValue[0]=6.0*ThisError/(maximum-minimum);//ThisError/1000
  qValue[1]=3.0*pError/(maximum-minimum);//pError/2000
  
  msE  = qValue[0];//误差ThisError
  msEC = qValue[1];//误差的变化量pError
  /*对输入量进行模拟化
    确定误差msE范围:-3,3
    确定误差msEC范围:-3,3
    分7段:-3,-2,-1,0,1,2,3分别对应最小[-,-3]、较小[-3,-2]、稍小[-2,-1]、零[-1,1]、稍大[1,2]、较大[2,3]、最大[3,+]
  */
  if(msE>3)
  {
    msE = 3;
  }
  if(msE<-3)
  {
    msE = -3;
  }
  if(msEC>3)
  {
    msE = 3;
  }
  if(msEC<-3)
  {
    msE = -3;
  }
  /*
  确定输出量ΔKp、ΔKi、ΔKd范围,也分为7段
  ΔKp范围:K1*[-3,3]
  ΔKi范围:K2*[-3,3]
  ΔKd范围:K3*[-3,3]
  根据输入量与输出量的关系:msE和msEC与KP的关系制定模糊规则表ruleKp
                            msE和msEC与Ki的关系制定模糊规则表ruleKi
                            msE和msEC与Kd的关系制定模糊规则表ruleKd
  */
  //这里msE和msEC都以整数计算,所以不同的输入只会对应一种组合情况:对ruleKp[msE + 3][msEC + 3]处的输出量ruleKp隶属度为1
  qValueK[0] = abs(ruleKp[msE + 3][msEC + 3] * K1);
  qValueK[1] = abs(ruleKi[msE + 3][msEC + 3] * K2);
  qValueK[2] = abs(ruleKd[msE + 3][msEC + 3] * K3);
  
  
  integral = (PIDptr->KI + qValueK[1])* iError;
  
  //PID限幅
  if( ( integral > PIDptr->KIlimit ) && ( PIDptr->KIlimit != 0 ) )
    integral = PIDptr->KIlimit;
  
  else if( ( integral < -PIDptr->KIlimit ) && ( PIDptr->KIlimit != 0 ) )
    integral = -PIDptr->KIlimit;
  
  if( ( ThisError > PIDptr->delErr ) || ( ThisError < -PIDptr->delErr ) )	
    temp = (PIDptr->KP + qValueK[0]) * pError + integral + (PIDptr->KD + qValueK[2]) * dError;  
  
  else
    temp = 0;
  
  PIDptr->PreErr = PIDptr->LastErr;
  PIDptr->LastErr = ThisError;
  
  return temp;
}
  • 7
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值