搭建机器人电控系统——PID算法——位置式、增量式、模糊式PID
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相关推荐
- 搭建机器人电控系统——MCU基石——STM32 GPIO原理
文章目录 搭建机器人电控系统--MCU基石 GPIO是什么? GPIO的模式 5种输入模式: 4种输出模式: GPIO的输出速度 搭建机器人电控系统--MCU基石 在上一章中,我讲解了搭建一个机器人电 ...
- 搭建机器人电控系统——如何从零开发主控?——文件下载、工程配置、烧录
文章目录 搭建机器人电控系统--如何从零开发主控? 如何开发主控?(软件实现烧录控制功能) 确定你选择的MCU参数 ①首先去ST官网上找到对应的单片机型号: ②找到对应型号的三大关键参数: ③找到官网 ...
- 搭建机器人电控系统——PID算法——什么是PID?
PID算法 PID算法介绍,不同系数仿真,优缺点 位置式.增量式.模糊式PID 大林算法.史密斯算法和PID算法的区别 文章目录 PID算法 控制系统介绍 开环控制系统 前馈控制系统 单闭环控制系统 ...
- 搭建机器人电控系统——通信协议——CAN通信及其实例
通信协议 串口通信详解 IIC通信详解 SPI通信详解 CAN通信详解 文章目录 通信协议 CAN通信 什么是CAN通信? CAN通信的优点: CAN通信电平格式: CAN通信的结构: CAN通信协议 ...
- 搭建机器人电控系统——通信协议——串口通信USART/UART、RS232、RS485及其实例
通信协议 串口通信详解 IIC通信详解 SPI通信详解 CAN通信详解 文章目录 通信协议 什么是串口? 串口分类 USART/UART.RS232.RS485的区别 串口协议原理 传输协议 需要定义 ...
- 搭建机器人电控系统——器件选型——如何选择电机?
器件选型 电源选择 传感器选择 电机选择 电机选型 电机是机器人电控系统控制机构动力的直接来源,一个好的电机可以解决很多机械的问题,也能解决很多控制的问题.电机的选型不仅和电控有关,也和机械环境密切相 ...
- 搭建机器人电控系统——器件选型——如何选择传感器?
器件选型 电源选择 传感器选择 电机选择 传感器 传感器是电控中非常重要的元件,对于不同的传感器,我们也需要对其进行选型,在学校的时候,也许我们不用考虑到太多的成本问题.对于我们来说,选择一个传感器应 ...
- 搭建机器人电控系统——如何从零画一块主控板?——搭建最小系统电路原理图
文章目录 如何画好一块主控? 搭建最小系统电路原理图 以STM32F407ZET6为例: 晶振电路原理 如何搭建晶振电路? 复位电路原理 如何搭建复位电路? 下载电路 电源电路原理 如何搭建电源电路? ...
- 搭建机器人电控系统——器件选型——如何选择机器人系统电源?
器件选型 电源选择 传感器选择 电机选择 电源的参数 一般来说,一款电池的参数主要如下图所示.其中的电压V.容量MAH.持续放电电流A是我们主要的选型依据,接口端子和重量尺寸也是需要考虑的因素. 如何 ...
最新文章
- 开源助力!武汉新型冠状病毒防疫开源信息收集平台
- 微软VSTS的新功能:WebTest要点
- 【51nod】1559 车和矩形
- macbook双网卡路由
- NanoProfiler-Step1翻译
- matlab创建二叉树(二维数据)
- 大数据、数据挖掘、机器学习与模式识别的关系
- minist _On_[GoogleNet]
- STM32学习第三课:STM32 c语言学习基础3(内存操作、指针、结构指针)
- UE4之模型格式介绍
- 计算机应用中格式刷怎么用,如何连续使用格式刷【搞定手段】
- PureStake CEO Derek Yoo解释Moonbeam背后的技术
- 点点动画~画出懂你的3D魔方
- 如何下载安装与火狐浏览器不兼容的火狐浏览器插件
- matlab Lorenz混沌系统求解
- 国产开源操作系统OpenCloudOS新进展:装机量超1000万节点,合作伙伴超500家
- FP-Tree的Python实现
- python b站动态转发、动态评论区抽奖(已打包成exe,可以下载食用)
- 使用RSD批量正射校正和批量融合高分1号卫星数据
- EXCEL——排序sumproduct函数
热门文章
- http://localhost:8080/ 无法访问
- 峰会 | 2019长三角科技金融峰会召开 区块链应用前景持续探索
- 树 —— 线索二叉树
- 设置全局css/less/sass样式and优化与style-resources-loader的理解
- 第二天 02-在VMware 安装安卓虚拟机
- java中验证码发送_实现短信验证码的发送[JAVA]
- 设计模式(10)——策略模式
- UEditor之图片上传如何和真实项目结合
- 计算机网络课程设计:电子政务
- ABAP BDC返回成功但是未创建单据或没有产生相应效果