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用ConfigObj读写配置文件的实现代码
Mar 04 Python
Python 创建子进程模块subprocess详解
Apr 08 Python
更改Ubuntu默认python版本的两种方法python-&gt; Anaconda
Dec 18 Python
python实现发送邮件功能
Jul 22 Python
python+pyqt5实现KFC点餐收银系统
Jan 24 Python
python issubclass 和 isinstance函数
Jul 25 Python
python基础 range的用法解析
Aug 23 Python
基于python的selenium两种文件上传操作实现详解
Sep 19 Python
Python 实现数组相减示例
Dec 27 Python
开启Django博客的RSS功能的实现方法
Feb 17 Python
Python如何实现的二分查找算法
May 27 Python
基于pycharm实现批量修改变量名
Jun 02 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
第八节--访问方式
2006/11/16 PHP
php处理json时中文问题的解决方法
2011/04/12 PHP
php+curl 发送图片处理代码分享
2015/07/09 PHP
对象的类型:本地对象(1)
2006/12/29 Javascript
jQuery源码分析之Event事件分析
2010/06/07 Javascript
js中格式化日期时间型数据函数代码
2010/11/08 Javascript
用js来解决ajax读取页面乱码
2010/11/28 Javascript
由Javascript实现的页面日历
2011/11/04 Javascript
JavaScript中的变量声明早于赋值分析
2012/03/01 Javascript
使用Math.floor与Math.random取随机整数的方法详解
2013/05/07 Javascript
DOM基础教程之模型中的模型节点
2015/01/19 Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
2015/11/19 Javascript
AngularJs Understanding the Model Component
2016/09/02 Javascript
jquery+Jscex打造游戏力度条
2020/09/12 Javascript
vue、react等单页面项目应该这样子部署到服务器
2018/01/03 Javascript
JS删除数组里的某个元素方法
2018/02/03 Javascript
javascript中函数的写法实例代码详解
2018/10/28 Javascript
koa2 从入门到精通(小结)
2019/07/23 Javascript
Vue 动态路由的实现及 Springsecurity 按钮级别的权限控制
2019/09/05 Javascript
Python 返回汉字的汉语拼音
2009/02/27 Python
用Python编写简单的定时器的方法
2015/05/02 Python
详解python如何调用C/C++底层库与互相传值
2016/08/10 Python
PyQt5实现下载进度条效果
2018/04/19 Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
2018/04/19 Python
python 从文件夹抽取图片另存的方法
2018/12/04 Python
详解Python数据分析--Pandas知识点
2019/03/23 Python
Python中使用gflags实例及原理解析
2019/12/13 Python
python线程join方法原理解析
2020/02/11 Python
俄罗斯披萨、寿司和面食送货到家服务:2 Берега
2019/12/15 全球购物
Python中pass语句的作用是什么
2016/06/01 面试题
2014年医院十一国庆节活动方案
2014/09/15 职场文书
领导干部学习“三严三实”思想汇报
2014/09/15 职场文书
法学专业大学生实习自我鉴定
2014/10/05 职场文书
python基于机器学习预测股票交易信号
2021/05/25 Python
JavaScript 定时器详情
2021/11/11 Javascript
Docker 镜像介绍以及commit相关操作
2022/04/13 Servers