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显示天气预报
Mar 02 Python
基于Python的XSS测试工具XSStrike使用方法
Jul 29 Python
python+opencv实现的简单人脸识别代码示例
Nov 14 Python
python中利用zfill方法自动给数字前面补0
Apr 10 Python
Python实现读取txt文件并转换为excel的方法示例
May 17 Python
python操作excel的方法(xlsxwriter包的使用)
Jun 11 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
Aug 25 Python
python使用adbapi实现MySQL数据库的异步存储
Mar 19 Python
Laravel框架表单验证格式化输出的方法
Sep 25 Python
python之array赋值技巧分享
Nov 28 Python
python3 webp转gif格式的实现示例
Dec 10 Python
Python 输出详细的异常信息(traceback)方式
Apr 08 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
JQUERY获取form表单值的代码
2010/07/17 Javascript
date.parse在IE和FF中的区别
2010/07/29 Javascript
jQuery插件开发全解析
2012/10/10 Javascript
JS代码同步文本框内容的实例方法
2013/07/12 Javascript
Node.js中文件操作模块File System的详细介绍
2017/01/05 Javascript
详解AngularJS中$filter过滤器使用(自定义过滤器)
2017/02/04 Javascript
利用js的闭包原理做对象封装及调用方法
2017/04/07 Javascript
使用InstantClick.js让页面提前加载200ms
2017/09/12 Javascript
如何选择适合你的JavaScript框架
2017/11/20 Javascript
使用vue-cli编写vue插件的方法
2018/02/26 Javascript
基于Three.js实现360度全景图片
2018/12/30 Javascript
了解重排与重绘
2019/05/29 Javascript
基于js实现复制内容到操作系统粘贴板过程解析
2019/10/11 Javascript
JavaScript 类的封装操作示例详解
2020/05/16 Javascript
如何利用javascript接收json信息并进行处理
2020/08/06 Javascript
微信小程序实现单个或多个倒计时功能
2020/11/01 Javascript
wxpython学习笔记(推荐查看)
2014/06/09 Python
简单介绍利用TK在Python下进行GUI编程的教程
2015/04/13 Python
Python的ORM框架中SQLAlchemy库的查询操作的教程
2015/04/25 Python
python获取当前日期和时间的方法
2015/04/30 Python
python 网络编程常用代码段
2016/08/28 Python
django2 快速安装指南分享
2018/01/05 Python
Python+matplotlib实现计算两个信号的交叉谱密度实例
2018/01/08 Python
详解如何设置Python环境变量?
2019/05/13 Python
Python使用pdb调试代码的技巧
2020/05/03 Python
Python-jenkins模块获取jobs的执行状态操作
2020/05/12 Python
python爬虫---requests库的用法详解
2020/09/28 Python
HTML5中通过li-canvas轻松实现单图、多图、圆角图绘制,单行文字、多行文字等
2018/11/30 HTML / CSS
HTML5之SVG 2D入门8—文档结构及相关元素总结
2013/01/30 HTML / CSS
是否有自动比较结构的方法
2015/06/03 面试题
SQL Server里面什么样的视图才能创建索引
2015/04/17 面试题
师范生自我鉴定
2014/03/20 职场文书
《永远的白衣战士》教学反思
2014/04/25 职场文书
教师国庆节演讲稿范文2014
2014/09/21 职场文书
执法作风整顿剖析材料
2014/10/11 职场文书
Python可变集合和不可变集合的构造方法大全
2021/12/06 Python