位置式PID与增量式PID的python实现

  • 一、PID控制器简介
  • 二、一阶惯性环节
  • 三、位置式PID
    • 3.1 简介
    • 3.2 程序
  • 四、增量式PID
    • 4.1简介
    • 4.2 程序
  • 五、几种控制效果对比

本文只展示部分代码,完整代码请访问我的github

一、PID控制器简介

PID(P比例,I积分,D微分)是一种model free的控制器,使用该控制器,无需对控制系统进行建立模型,只需对P、I 、D这三个参数进行调整即可,使用起来十分方便,因此在控制系统中被广泛使用。


u(t)=Kpe(t)+Ki∫0te(t)dt+Kdde(t)dt(1)u(t) = K_pe(t) + K_i\int_{0}^{t} e(t)dt +K_d\frac{de(t)}{dt} \tag{1} u(t)=Kp​e(t)+Ki​∫0t​e(t)dt+Kd​dtde(t)​(1)

  • 积分项有助于消除稳态误差
  • 微分项有助于加快系统相应
  • PD控制:提高稳定性,改善瞬态响应
  • PI控制:改善稳态误差

二、一阶惯性环节

以下的代码中将用一阶惯性环节作为被控对象来进行展开。此处简单介绍一下一阶惯性系统。
一阶惯性环节(系统)比较常见,如单容水箱、电容等含有储存元件或容量的元件系统,该系统输出一开始并不与输入同步按比例变化,直到过渡过程结束输出y(t)y(t)y(t)才与输入x(t)x(t)x(t)保持比例关系。

  • 运动方程:
    Tdy(t)dt+y(t)=Kx(t)T\frac{dy(t)}{dt} + y(t) = Kx(t) Tdtdy(t)​+y(t)=Kx(t)
  • 传递函数
    G(s)=Y(s)X(s)=KTs+1G(s)= \frac{Y(s)}{X(s)} =\frac{K}{Ts +1} G(s)=X(s)Y(s)​=Ts+1K​
    其中T是时间常数,K是比例常数
  • 在数字控制系统中通常写为:
    T[y(k)−y(k−1)]+y(k)=Kx(k)T\left[y(k)-y(k-1) \right]+ y(k) = Kx(k)T[y(k)−y(k−1)]+y(k)=Kx(k) ⇒\Rightarrow⇒ y(k)=Kx(k)+Ty(k−1)1+Ty(k)= \frac{Kx(k)+Ty(k-1)}{1+T}y(k)=1+TKx(k)+Ty(k−1)​

三、位置式PID

3.1 简介

在计算机控制系统中往往使用位置式PID算法与增量式PID算法。下面给出位置式PID的公式。
u(k)=Kpe(k)+Ki∑i=0e(i)+Kd[e(k)−e(k−1)](2)u(k) = K_pe(k) + K_i\sum_{i=0} e(i) +K_d\left[e(k)-e(k-1) \right] \tag{2} u(k)=Kp​e(k)+Ki​i=0∑​e(i)+Kd​[e(k)−e(k−1)](2)
从公式可以看出,这就是对式(1)的直接数字化,容易理解,输出u(k)便是PID控制器的输出位置。
该控制器存在的缺点
由于积分饱和带来的影响,控制器需要相当一段长的时间退出饱和区,由此引起系统产生大幅度超调。这里如果想继续了解积分饱和,请点击链接查看matlab官方的讲解。

3.2 程序

#位置式PID系统
class PositionalPID:def __init__(self, P: float, I: float, D: float):self.Kp = Pself.Ki = Iself.Kd = Dself.PIDOutput = 0.0  # PID控制器输出self.SystemOutput = 0.0  # 系统输出值self.LastSystemOutput = 0.0  # 系统的上一次输出self.PIDErrAdd = 0.0self.ResultValueBack = 0.0self.Error = 0.0self.LastError = 0.0def SetStepSignal(self, StepSignal):self.Error = StepSignal - self.SystemOutputKpWork  = self.Kp *self.ErrorKiWork = self.Ki* self.PIDErrAddKdWork = self.Kd * (self.Error- self.LastError)self.PIDOutput = KpWork + KiWork + KdWorkself.PIDErrAdd += self.Errorself.LastError = self.Error# 以一阶惯性环节为例子演示控制效果def SetInertiaTime(self, IntertiaTime, SampleTime):self.SystemOutput = (IntertiaTime * self.LastSystemOutput + SampleTime * self.PIDOutput) / (SampleTime + IntertiaTime)self.LastSystemOutput = self.SystemOutput

四、增量式PID

4.1简介

Δu(k)=u(k)−u(k−1)=\Delta u(k) = u(k)-u(k-1)=Δu(k)=u(k)−u(k−1)=
Kp[e(k)−e(k−1)]+Kie(k)+Kd[e(k)−2e(k−1)+e(k−2)](3)K_p\left[e(k)-e(k-1) \right] + K_i e(k) +K_d\left[e(k)-2e(k-1)+e(k-2) \right] \tag{3}Kp​[e(k)−e(k−1)]+Ki​e(k)+Kd​[e(k)−2e(k−1)+e(k−2)](3)
增量式PID只求取控制量的变化量,一旦确定了 KP、TI 、TD,只要使用前后三次测量值的偏差, 即可由公式求出控制增量,而得出的控制量▲u(k)对应的是近几次位置误差的增量,而不是对应与实际位置的偏差,因此没有误差累加,容易通过加权处理获得比较好的控制效果,并且在系统发生问题时,增量式不会严重影响系统的工作
最后的输出要加上上一时刻的输出u(k-1),即:
u(k)=Δu(k)+u(k−1)(4)u(k)= \Delta u(k)+u(k-1)\tag{4}u(k)=Δu(k)+u(k−1)(4)

4.2 程序

#增量式PID系统
class IncrementalPID:def __init__(self, P:float ,I:float ,D:float ):self.Kp = Pself.Ki = Iself.Kd = Dself.PIDOutput =0.0         #PID控制器输出self.SystemOutput = 0.0     #系统输出值self.LastSystemOutput = 0.0 #系统的上一次输出self.Error = 0.0self.LastError = 0.0self.LastLastError = 0.0#设置PID控制器参数def SetStepSignal(self,StepSignal):self.Error = StepSignal - self.SystemOutput#计算增量IncrementalValue = self.Kp*(self.Error - self.LastError)\+ self.Ki * self.Error +self.Kd *(self.Error -2*self.LastError +self.LastLastError)#计算输出self.PIDOutput += IncrementalValueself.LastLastError = self.LastErrorself.LastError = self.Error#以一阶惯性环节为例子演示控制效果def SetInertiaTime(self,IntertiaTime,SampleTime):self.SystemOutput = (IntertiaTime*self.LastSystemOutput + SampleTime *self.PIDOutput)/(SampleTime + IntertiaTime)self.LastSystemOutput = self.SystemOutput

五、几种控制效果对比

上图!图中红色为增量式PID,蓝色为位置式PID,黑色是不加控制器的效果。

位置式PID与增量式PID代码实现(python)相关推荐

  1. 位置式PID与增量式PID的介绍和代码实现

    PID分为位置式PID与增量式PID. 一.位置式PID 1.表达式为: 2.缺点: 1).由于全量输出,所以每次输出均与过去状态有关,计算时要对ek进行累加,工作量大: 2).因为计算机输出的uk对 ...

  2. C语言实现PID算法:位置式PID和增量式PID

    原创者微信公众号 PID算法可以说是在自动控制原理中比较经典的一套算法,在现实生活中应用的比较广泛. 大学参加过电子竞赛的朋友都应该玩过电机(或者说循迹小车),我们要控制电机按照设定的速度运转,PID ...

  3. 位置式PID与增量式PID区别浅析(百度百科增量式PID讲解思路概念更明确清晰)

    位置式PID与增量式PID区别浅析 Z小旋 2019-04-26 08:55:12  59882  收藏 713 分类专栏: NXP智能车学习 文章标签: 位置式PID PID 增量式PID 版权 1 ...

  4. 位置式PID和增量式PID的区分

    目录 位置式PID和增量式PID的区分 位置式PID: 增量式PID: 附上本人参考别人写的代码----链接: 附上本人收集的资料----链接: 位置式PID和增量式PID的区分 仅是个人理解,如有错 ...

  5. C语言实现位置式pid与增量式pid

    //经典PID控制的c实现 //1.位置式PID实现 //1.位置式PID实现 typedef struct {float setValue;//设定值float actValue;//输出值floa ...

  6. PID算法:位置式PID和增量式PID

    口诀 参数整定找最佳, 从小到大顺序查. 先是比例后积分, 最后再把微分加. 曲线振荡很频繁, 比例度盘要放大. 曲线漂浮绕大弯, 比例度盘往小扳. 曲线偏离回复慢, 积分时间往下降. 曲线波动周期长 ...

  7. 位置式PID和增量式PID的区别(转载)

    参考 https://blog.csdn.net/as480133937/article/details/89508034 上述文章中给出了位置式PID和增量式PID的公式及区别,比较容易理解.

  8. 入门智能车 | 带你认识PID闭环控制 - 增量式PID实现电机速度闭环

    带你认识PID闭环控制 - 增量式PID实现电机速度闭环 闭环控制是指控制论的一个基本概念.指作为被控的输出量以一定方式返回到作为控制的输入端,并对输入端施加控制影响的一种控制关系.带有反馈信息的系统 ...

  9. c语言程序位置式pid算法,增量式与位置式PID算法(C语言实现与电机控制项目)...

    4.2核心代码 /************************************************************************** 函数功能:增量PI控制器 入口参 ...

最新文章

  1. 利用均值漂移实现图像分割的原理和OpenCV代码
  2. int类型的实参与int*类型的形参不兼容_谁告诉的你们Python是强类型语言!站出来,保证不打你!...
  3. Python 2退出历史舞台 一句话证明它的重要性
  4. Nginx的几个常用配置和技巧
  5. OpenCV学习笔记六-提高对比度
  6. 打开虚拟机磁盘类型无效_[图文]VMWARE虚拟机如何打开.VMDK格式的磁盘映像
  7. 计算机不能显示可移动磁盘咋办,U盘插上电脑不显示“可移动磁盘”该怎么办...
  8. c语言long double位数,int long double 所占位数 和最大值
  9. 安装ElasticSearch过程遇到的坑
  10. 【转】ASP.NET 2.0中Page事件的执行顺序
  11. sql取最大值的那一行_SQL高级功能
  12. linux删除0字节的文件,如何在linux中删除许多0字节的文件?
  13. infor wms 中英文对照_WMS系统中波次管理有多大作用
  14. 基于编辑方法的文本生成(下)
  15. android amr 播放器,Android使用createInnerAudioContext无法播放amr?
  16. 恢复系统设置或计算机点击没反应,win7系统电脑无法使用系统还原,按钮点不开的解决方法...
  17. 春分节气介绍PPT模板
  18. Android电阻触摸屏校准
  19. 大学计算机专业和培训机构区别,扎心了
  20. 图灵系列丛书(交互设计、编程、大数据、人工智能等)

热门文章

  1. 抖音短视频SEO优化排名服务
  2. win7计算机用户权限,怎么设置win7用户系统权限?设置用户权限教程
  3. Bioinformatics Armory第5题:New Motif Discovery
  4. Win10修改无线网卡的MAC地址
  5. 深度学习--常用数学符号
  6. M2006+C610驱动方案(二)arduino can模块
  7. 解决toastr的escapeHtml属性失效问题
  8. 超简单,在Win10上配置安卓子系统WSA,直接运行APP
  9. 电影/商品 推荐的两种经典算法
  10. geany配置python_Win10系统中Geany配置python环境