python实现PID算法及测试的例子


Posted in Python onAugust 08, 2019

PID算法实现

import time

class PID:
  def __init__(self, P=0.2, I=0.0, D=0.0):
    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.windup_guard = 20.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#积分
      if (self.ITerm < -self.windup_guard):
        self.ITerm = -self.windup_guard
      elif (self.ITerm > self.windup_guard):
        self.ITerm = self.windup_guard
      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 setKp(self, proportional_gain):
    self.Kp = proportional_gain
  def setKi(self, integral_gain):
    self.Ki = integral_gain
  def setKd(self, derivative_gain):
    self.Kd = derivative_gain
  def setWindup(self, windup):
    self.windup_guard = windup
  def setSampleTime(self, sample_time):
    self.sample_time = sample_time

测试PID算法

import PID
import time
import matplotlib
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import spline
#这个程序的实质就是在前九秒保持零输出,在后面的操作中在传递函数为某某的系统中输出1

def test_pid(P = 0.2, I = 0.0, D= 0.0, L=100):
  """Self-test PID class

  .. note::
    ...
    for i in range(1, END):
      pid.update(feedback)
      output = pid.output
      if pid.SetPoint > 0:
        feedback += (output - (1/i))
      if i>9:
        pid.SetPoint = 1
      time.sleep(0.02)
    ---
  """
  pid = PID.PID(P, I, D)

  pid.SetPoint=0.0
  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
    if pid.SetPoint > 0:
      feedback +=output# (output - (1/i))控制系统的函数
    if i>9:
      pid.SetPoint = 1
    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.plot(time_smooth, feedback_smooth)
  plt.plot(time_list, setpoint_list)
  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('TEST PID')

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

  plt.grid(True)
  plt.show()

if __name__ == "__main__":
  test_pid(1.2, 1, 0.001, L=80)
#  test_pid(0.8, L=50)

结果

python实现PID算法及测试的例子

以上这篇python实现PID算法及测试的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现将罗马数字转换成普通阿拉伯数字的方法
Apr 19 Python
Python获取当前路径实现代码
May 08 Python
python获取多线程及子线程的返回值
Nov 15 Python
Python实现将Excel转换成xml的方法示例
Aug 25 Python
Python之列表实现栈的工作功能
Jan 28 Python
浅谈Python_Openpyxl使用(最全总结)
Sep 05 Python
Django框架静态文件处理、中间件、上传文件操作实例详解
Feb 29 Python
django实现模板中的字符串文字和自动转义
Mar 31 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
Aug 17 Python
python 如何调用 dubbo 接口
Sep 24 Python
详解Python流程控制语句
Oct 28 Python
Pytest中skip和skipif的具体使用方法
Jun 30 Python
python开头的coding设置方法
Aug 08 #Python
pycharm 安装JPype的教程
Aug 08 #Python
Python学习笔记之lambda表达式用法详解
Aug 08 #Python
python读取大文件越来越慢的原因与解决
Aug 08 #Python
Python实现Singleton模式的方式详解
Aug 08 #Python
Python判断字符串是否xx开始或结尾的示例
Aug 08 #Python
详解解决Python memory error的问题(四种解决方案)
Aug 08 #Python
You might like
一个PHP缓存类代码(附详细说明)
2011/06/09 PHP
php实现快速排序的三种方法分享
2014/03/12 PHP
WordPress中is_singular()函数简介
2015/02/05 PHP
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
2015/11/05 PHP
php版微信自动登录并获取昵称的方法
2016/09/23 PHP
php基于环形链表解决约瑟夫环问题示例
2017/11/07 PHP
php实现的AES加密类定义与用法示例
2018/01/29 PHP
javascript css在IE和Firefox中区别分析
2009/02/18 Javascript
JavaScript中的this实例分析
2011/04/28 Javascript
JS获取图片实际宽高及根据图片大小进行自适应
2013/08/11 Javascript
JavaScript对象之深度克隆介绍
2014/12/08 Javascript
Javascript中的方法和匿名方法实例详解
2015/06/13 Javascript
如何消除inline-block属性带来的标签间间隙
2016/03/31 Javascript
用JS写的一个Ajax库(实例代码)
2016/08/06 Javascript
Nodejs实现短信验证码功能
2017/02/09 NodeJs
JS对象的深度克隆方法示例
2017/03/16 Javascript
原生javascript上传图片带进度条【实例分享】
2017/04/06 Javascript
ES6新特性二:Iterator(遍历器)和for-of循环详解
2017/04/20 Javascript
将 vue 生成的 js 上传到七牛的实例
2017/07/28 Javascript
JavaScript通过mouseover()实现图片变大效果的示例
2017/12/20 Javascript
小程序中使用css var变量(使js可以动态设置css样式属性)
2020/03/31 Javascript
js利用拖放实现添加删除
2020/08/27 Javascript
[01:32:50]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第一场 1月25日
2021/03/11 DOTA
用Python编写分析Python程序性能的工具的教程
2015/04/01 Python
python3+PyQt5实现自定义流体混合窗口部件
2018/04/24 Python
深入分析python中整型不会溢出问题
2018/06/18 Python
python selenium操作cookie的实现
2020/03/18 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
英国在线汽车和面包车零件商店:Car Parts 4 Less
2018/08/15 全球购物
Microsoft Advertising美国:微软搜索广告
2019/05/01 全球购物
俄罗斯披萨、寿司和面食送货到家服务:2 Берега
2019/12/15 全球购物
安全生产活动月方案
2014/03/09 职场文书
大学毕业生个人自荐书
2014/07/02 职场文书
如何使用Tkinter进行窗口的管理与设置
2021/06/30 Python
Java Spring Lifecycle的使用
2022/05/06 Java/Android
mysql 获取相邻数据项
2022/05/11 MySQL