IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 位置式PID与增量式PID代码实现(python) -> 正文阅读

[Python知识库]位置式PID与增量式PID代码实现(python)

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

一、PID控制器简介

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

水温PID控制系统
u ( t ) = K p e ( t ) + K i ∫ 0 t e ( t ) d t + K d d e ( t ) d t (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)保持比例关系。

  • 运动方程:
    T d y ( t ) d t + y ( t ) = K x ( t ) T\frac{dy(t)}{dt} + y(t) = Kx(t) Tdtdy(t)?+y(t)=Kx(t)
  • 传递函数
    G ( s ) = Y ( s ) X ( s ) = K T s + 1 G(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 ) = K x ( 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 ) = K x ( k ) + T y ( k ? 1 ) 1 + T y(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 ) = K p e ( k ) + K i ∑ i = 0 e ( i ) + K d [ 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 python程序

#位置式PID系统
class PositionalPID:
    def __init__(self, P: float, I: float, D: float):
        self.Kp = P
        self.Ki = I
        self.Kd = D

        self.PIDOutput = 0.0  # PID控制器输出
        self.SystemOutput = 0.0  # 系统输出值
        self.LastSystemOutput = 0.0  # 系统的上一次输出

        self.PIDErrAdd = 0.0
        self.ResultValueBack = 0.0
        self.Error = 0.0
        self.LastError = 0.0

    def SetStepSignal(self, StepSignal):
        self.Error = StepSignal - self.SystemOutput

        KpWork  = self.Kp *self.Error
        KiWork = self.Ki* self.PIDErrAdd
        KdWork = self.Kd * (self.Error- self.LastError)
        self.PIDOutput = KpWork + KiWork + KdWork
        self.PIDErrAdd += self.Error
        self.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)=
K p [ e ( k ) ? e ( k ? 1 ) ] + K i e ( k ) + K d [ e ( k ) ? 2 e ( 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 python程序

#增量式PID系统
class IncrementalPID:
    def __init__(self, P:float ,I:float ,D:float ):
        self.Kp = P
        self.Ki = I
        self.Kd = D

        self.PIDOutput =0.0         #PID控制器输出
        self.SystemOutput = 0.0     #系统输出值
        self.LastSystemOutput = 0.0 #系统的上一次输出

        self.Error = 0.0
        self.LastError = 0.0
        self.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 += IncrementalValue
        self.LastLastError = self.LastError
        self.LastError = self.Error

    #以一阶惯性环节为例子演示控制效果
    def SetInertiaTime(self,IntertiaTime,SampleTime):
        self.SystemOutput = (IntertiaTime*self.LastSystemOutput + SampleTime *self.PIDOutput)/(SampleTime + IntertiaTime)
        self.LastSystemOutput = self.SystemOutput

五、几种控制效果对比

上图!图中红色为增量式PID,蓝色为位置式PID,黑色是不加控制器的效果。
在这里插入图片描述

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-10-23 12:25:47  更:2021-10-23 12:26:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/29 12:03:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计