PID算法

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

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

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

文章目录

  • PID算法
  • 位置式PID和增量式PID
    • 位置式PID:
    • 增量式PID:
  • 模糊控制PID
    • ①模糊化:
    • ②模糊推演:
    • ③清晰化
  • 模糊PID的步骤:
    • ΔKp、ΔKi、ΔKd与输入量的模糊规则表(文献查找,也可以自己填):
  • 模糊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/1000qValue[1]=3.0*pError/(maximum-minimum);//pError/2000msE  = qValue[0];//误差ThisErrormsEC = 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的关系制定模糊规则表ruleKpmsE和msEC与Ki的关系制定模糊规则表ruleKimsE和msEC与Kd的关系制定模糊规则表ruleKd*///这里msE和msEC都以整数计算,所以不同的输入只会对应一种组合情况:对ruleKp[msE + 3][msEC + 3]处的输出量ruleKp隶属度为1qValueK[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;  elsetemp = 0;PIDptr->PreErr = PIDptr->LastErr;PIDptr->LastErr = ThisError;return temp;
}

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

  1. 搭建机器人电控系统——MCU基石——STM32 GPIO原理

    文章目录 搭建机器人电控系统--MCU基石 GPIO是什么? GPIO的模式 5种输入模式: 4种输出模式: GPIO的输出速度 搭建机器人电控系统--MCU基石 在上一章中,我讲解了搭建一个机器人电 ...

  2. 搭建机器人电控系统——如何从零开发主控?——文件下载、工程配置、烧录

    文章目录 搭建机器人电控系统--如何从零开发主控? 如何开发主控?(软件实现烧录控制功能) 确定你选择的MCU参数 ①首先去ST官网上找到对应的单片机型号: ②找到对应型号的三大关键参数: ③找到官网 ...

  3. 搭建机器人电控系统——PID算法——什么是PID?

    PID算法 PID算法介绍,不同系数仿真,优缺点 位置式.增量式.模糊式PID 大林算法.史密斯算法和PID算法的区别 文章目录 PID算法 控制系统介绍 开环控制系统 前馈控制系统 单闭环控制系统 ...

  4. 搭建机器人电控系统——通信协议——CAN通信及其实例

    通信协议 串口通信详解 IIC通信详解 SPI通信详解 CAN通信详解 文章目录 通信协议 CAN通信 什么是CAN通信? CAN通信的优点: CAN通信电平格式: CAN通信的结构: CAN通信协议 ...

  5. 搭建机器人电控系统——通信协议——串口通信USART/UART、RS232、RS485及其实例

    通信协议 串口通信详解 IIC通信详解 SPI通信详解 CAN通信详解 文章目录 通信协议 什么是串口? 串口分类 USART/UART.RS232.RS485的区别 串口协议原理 传输协议 需要定义 ...

  6. 搭建机器人电控系统——器件选型——如何选择电机?

    器件选型 电源选择 传感器选择 电机选择 电机选型 电机是机器人电控系统控制机构动力的直接来源,一个好的电机可以解决很多机械的问题,也能解决很多控制的问题.电机的选型不仅和电控有关,也和机械环境密切相 ...

  7. 搭建机器人电控系统——器件选型——如何选择传感器?

    器件选型 电源选择 传感器选择 电机选择 传感器 传感器是电控中非常重要的元件,对于不同的传感器,我们也需要对其进行选型,在学校的时候,也许我们不用考虑到太多的成本问题.对于我们来说,选择一个传感器应 ...

  8. 搭建机器人电控系统——如何从零画一块主控板?——搭建最小系统电路原理图

    文章目录 如何画好一块主控? 搭建最小系统电路原理图 以STM32F407ZET6为例: 晶振电路原理 如何搭建晶振电路? 复位电路原理 如何搭建复位电路? 下载电路 电源电路原理 如何搭建电源电路? ...

  9. 搭建机器人电控系统——器件选型——如何选择机器人系统电源?

    器件选型 电源选择 传感器选择 电机选择 电源的参数 一般来说,一款电池的参数主要如下图所示.其中的电压V.容量MAH.持续放电电流A是我们主要的选型依据,接口端子和重量尺寸也是需要考虑的因素. 如何 ...

最新文章

  1. 开源助力!武汉新型冠状病毒防疫开源信息收集平台
  2. 微软VSTS的新功能:WebTest要点
  3. 【51nod】1559 车和矩形
  4. macbook双网卡路由
  5. NanoProfiler-Step1翻译
  6. matlab创建二叉树(二维数据)
  7. 大数据、数据挖掘、机器学习与模式识别的关系
  8. minist _On_[GoogleNet]
  9. STM32学习第三课:STM32 c语言学习基础3(内存操作、指针、结构指针)
  10. UE4之模型格式介绍
  11. 计算机应用中格式刷怎么用,如何连续使用格式刷【搞定手段】
  12. PureStake CEO Derek Yoo解释Moonbeam背后的技术
  13. 点点动画~画出懂你的3D魔方
  14. 如何下载安装与火狐浏览器不兼容的火狐浏览器插件
  15. matlab Lorenz混沌系统求解
  16. 国产开源操作系统OpenCloudOS新进展:装机量超1000万节点,合作伙伴超500家
  17. FP-Tree的Python实现
  18. python b站动态转发、动态评论区抽奖(已打包成exe,可以下载食用)
  19. 使用RSD批量正射校正和批量融合高分1号卫星数据
  20. EXCEL——排序sumproduct函数

热门文章

  1. http://localhost:8080/ 无法访问
  2. 峰会 | 2019长三角科技金融峰会召开 区块链应用前景持续探索
  3. 树 —— 线索二叉树
  4. 设置全局css/less/sass样式and优化与style-resources-loader的理解
  5. 第二天 02-在VMware 安装安卓虚拟机
  6. java中验证码发送_实现短信验证码的发送[JAVA]
  7. 设计模式(10)——策略模式
  8. UEditor之图片上传如何和真实项目结合
  9. 计算机网络课程设计:电子政务
  10. ABAP BDC返回成功但是未创建单据或没有产生相应效果