专栏首页日常撸知识PID控制算法原理,并用python实现演示

PID控制算法原理,并用python实现演示

1. PID算法控制运用在哪些地方?

PID:比列(Proportion),积分(Integral),微分(Differential)

PID算法可以用来控制温度,压强,流量,化学成分,速度等等。汽车的定速巡航;伺服驱动器中的速度位置控制;冷却系统的温度;液压系统的压力等都可以通过PID算法实现,很好的保证系统的稳定性。

2. PID算法的原理

先了解几个概念:

偏差 e:某时刻的系统的输出值(output)和目标值(target)之差

Kp: 比列系数

Ki: 积分系数

Kd: 微分系数

Ti: 积分时间

Td: 微分时间

原理图:

如图,当得到输出后,将输出和输入的差值作为偏差,将这个偏差信号经过比列,积分,微分3种运算方式叠加后再以一定的方式加入到输入中,从而控制最终的结果,达到想要的输出值。

比例系数Kp:

增大比例系数使系统反应灵敏,调节速度加快,并且可以减小稳态误差。但是比例系数过大会使超调量增大,振荡次数增加,调节时间加长,动态性能变坏,比例系数太大甚至会使闭环系统不稳定。

比例控制不能消除稳态误差。

积分系数Ki:

使系统消除稳态误差,提高无差度。积分控制的作用是,只要系统有误差存在,积分调节就进行,积分控制器就不断地积累,输出控制量,直至无差,积分调节停止,积分调节输出一常值。因而,只要有足够的时间,积分控制将能完全消除误差,使系统误差为零,从而消除稳态误差。积分作用的强弱取决于积分时间常数Ti,Ti越小,积分作用就越强,积分作用太强会使系统超调加大,甚至使系统出现振荡,反之Ti大则积分作用弱。加入积分调节可使系统稳定性下降,动态响应变慢。

微分系数Kd:

微分控制可以减小超调量,克服振荡,使系统的稳定性提高,同时加快系统的动态响应速度,减小调整时间,从而改善系统的动态性能。

微分的控制作用跟偏差的变化的速度有关,微分控制能够预测偏差,产生 超前的校正作用,有助于减少超调。

PID的公式原理:

如果需要在计算机上实现,需要将其离散化:

可以看出,某一个偏差的PID值只跟相邻的三个偏差相关。

3. PID算法的python实现

首先建立一个PID的算法模块,算法原理就是上面的式子,保存为PID.py,如下:

#this code refer to CSDN and do some minor change. 
import time

class PID:
    def __init__(self, P, I, D):
        self.Kp = P
        self.Ki = I
        self.Kd = D
        self.sample_time = 0.00
        self.current_time = time.time()
        self.last_time = self.current_time
        self.clear()
    def clear(self):
        self.SetPoint = 0.0
        self.PTerm = 0.0
        self.ITerm = 0.0
        self.DTerm = 0.0
        self.last_error = 0.0
        self.int_error = 0.0
        self.output = 0.0
    def update(self, feedback_value):
        error = self.SetPoint - feedback_value
        self.current_time = time.time()
        delta_time = self.current_time - self.last_time
        delta_error = error - self.last_error
        if (delta_time >= self.sample_time):
            self.PTerm = self.Kp * error#比例
            self.ITerm += error * delta_time#积分
            self.DTerm = 0.0
            if delta_time > 0:
                self.DTerm = delta_error / delta_time#微分
            self.last_time = self.current_time
            self.last_error = error
            self.output = self.PTerm + (self.Ki * self.ITerm) + (self.Kd * self.DTerm)


    def setSampleTime(self, sample_time):
        self.sample_time = sample_time

然后在相同路径下建立一个test_pid.py,实现PID控制的算法示意,如下:

import PID #导入上面的PID算法
import time
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import spline


def test_pid(P, I , D, L):

    pid = PID.PID(P, I, D)

    pid.SetPoint=1.1
    pid.setSampleTime(0.01)

    END = L
    feedback = 0
    feedback_list = []
    time_list = []
    setpoint_list = []

    for i in range(1, END):
        pid.update(feedback)
        output = pid.output
        feedback +=output #PID控制系统的函数
        time.sleep(0.01)
        feedback_list.append(feedback)
        setpoint_list.append(pid.SetPoint)
        time_list.append(i)

    time_sm = np.array(time_list)
    time_smooth = np.linspace(time_sm.min(), time_sm.max(), 300)
    feedback_smooth = spline(time_list, feedback_list, time_smooth)
    plt.figure(0)
    plt.grid(True)
    plt.plot(time_smooth, feedback_smooth,'b-')
    plt.plot(time_list, setpoint_list,'r')
    plt.xlim((0, L))
    plt.ylim((min(feedback_list)-0.5, max(feedback_list)+0.5))
    plt.xlabel('time (s)')
    plt.ylabel('PID (PV)')
    plt.title('PythonTEST PID--xiaomokuaipao',fontsize=15)

    plt.ylim((1-0.5, 1+0.5))

    plt.grid(True)
    plt.show()

if __name__ == "__main__":
    test_pid(1.2, 1, 0.001, L=100)

最终,输出的示意图如下,

其中,红色线是目标值(setpoint),蓝色线是在当前Kp,Ki,Kd参数下的震荡结果,最终趋于目标值,实现了控制。

从而用python实现了PID算法的简单示意。

4. PID调试的一些经验

PID调试的一般原则:

在输出不震荡时,增大比例增益;

在输出不震荡时,减少积分时间常数;

在输出不震荡时,增大微分时间常数;

PID调节口诀:

参数整定找最佳,从小到大顺序查

先是比例后积分,最后再把微分加

曲线振荡很频繁,比例度盘要放大

曲线漂浮绕大湾,比例度盘往小扳

曲线偏离回复慢,积分时间往下降

曲线波动周期长,积分时间再加长

曲线振荡频率快,先把微分降下来

动差大来波动慢,微分时间应加长

理想曲线两个波,前高后低四比一

一看二调多分析,调节质量不会低

欢迎关注,了解更多......

文章分享自微信公众号:
小末快跑

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

如有侵权,请联系 yunjia_community@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • Github 项目推荐 | SpaceX Falcon 9 Box2D 回收降落动作模拟器

    这是一款 SpaceX Falcon 9 第一级火箭的垂直火箭着陆模拟器,该模拟器用 Python 3.5 开发并且在 OpenAI Gym 环境中编写。该模拟...

    AI研习社
  • 鸿蒙系统(Harmony OS)开发工具DevEco Studio初体验

    愿有朝一日用上国产的IDE、编译器、数据库系统、OS、光刻机、芯片等等,以形成闭环。

    周星星9527
  • softmax分类算法原理(用python实现)

    逻辑回归神经网络实现手写数字识别 如果更习惯看Jupyter的形式,请戳Gitthub_逻辑回归softmax神经网络实现手写数字识别.ipynb 1 -...

    marsggbo
  • 热传导问题的数值解法Edition4

    关于本科《传热学》简单温度场数值求解,早先有2018年的视频: 一维常物性无内热源无穷大平板温度场数值模拟(基于基于HTML5编程)。2019年重新录...

    周星星9527
  • [python从入门到放弃]安装Anaconda python求解方程(组)

    1 https://www.anaconda.com/ 下载对应的anaconda安装包,一路下一步完成安装;

    周星星9527
  • MathJax实现在网页中植入数学公式

    《传热学》相关小程序演示动画如下(其中下图1D非稳态导热计算发散,调小时间步长后重新计算,结果收敛!):

    周星星9527
  • 用 Python 实现并行计算

    注:不少学过点编程语言的人,都会抱怨 Python 语言的程序执行速度慢,因此对学习和使用此语言嗤之以鼻。暂且不论程序的执行速度是否是开发者追求的唯一目标(有意...

    老齐
  • 电机控制进阶——PID速度控制

    之前的几篇文章(电机控制基础篇),介绍的电机编码器原理、定时器输出PWM、定时器编码器模式测速等。

    xxpcb
  • 数字PID控制示例,原来是这样!以液位控制为例

    完整代码请点击阅读原文,也可体验贫道的PID控制演示小程序,(PID控制相关视频见:基础/整定/重要补充)。

    周星星9527
  • 电机控制进阶1——PID速度控制

    之前的几篇文章(电机控制基础篇),介绍的电机编码器原理、定时器输出PWM、定时器编码器模式测速等。

    xxpcb
  • [机器学习]基于tensorflow.js的k-means聚类分析

    A Simple JavaScript Library to make it easy for people to use KMeans algorithms ...

    周星星9527
  • 深入Python多进程编程基础

    多进程编程知识是Python程序员进阶高级的必备知识点,我们平时习惯了使用multiprocessing库来操纵多进程,但是并不知道它的具体实现原理。下面我对多...

    老钱
  • 深入Python多进程编程基础——图文版

    多进程编程知识是Python程序员进阶高级的必备知识点,我们平时习惯了使用multiprocessing库来操纵多进程,但是并不知道它的具体实现原理。下面我对多...

    老钱
  • 热传导问题的数值解法Edition3

    特别注意:由于视频结束时下课停止录制,视频公式没有推导完成,最终请参考后边草稿:

    周星星9527
  • PID的那些事——位置式PID

    首先要知道,很多时候PID算法都是通过一个控制器进行编程实现,可以是一台计算机,也可以是一个微处理器,但不管怎样,他们处理的信号都已经不再是模拟信号,而是对模拟...

    狂人V
  • Sanlock原理与基本使用

    Sanlock是一个基于共享存储的分布式锁管理器,集群中的每个节点都各自运行sanlock服务,锁的状态都被写到了共享存储上,所有节点都能访问共享存储,共同维护...

    jiang
  • 如何通过网页超链接控制电脑应用程序

    我们通过手机端可以管理电脑进程资源,上一篇推文已经实现对电脑进程资源查看,本次介绍如何实现对电脑应用程序的启停管理。

    用户8949263

扫码关注云+社区

领取腾讯云代金券