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实现网页链接提取的方法分享
Feb 25 Python
Python实现子类调用父类的方法
Nov 10 Python
python定时执行指定函数的方法
May 27 Python
用python做一个搜索引擎(Pylucene)的实例代码
Jul 05 Python
matplotlib作图添加表格实例代码
Jan 23 Python
简单实现python画圆功能
Jan 25 Python
Python语言的变量认识及操作方法
Feb 11 Python
基于python实现聊天室程序
Jul 27 Python
python 对字典按照value进行排序的方法
May 09 Python
Python os模块常用方法和属性总结
Feb 20 Python
SpringBoot实现登录注册常见问题解决方案
Mar 04 Python
Django 返回json数据的实现示例
Mar 05 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的MVC模式实现原理分析(一相简单的MVC框架范例)
2014/04/29 PHP
浅谈使用PHP开发微信支付的流程
2015/10/04 PHP
PHP的Yii框架中创建视图和渲染视图的方法详解
2016/03/29 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
2016/11/02 PHP
Linux下 php7安装redis的方法
2018/11/01 PHP
php实现的生成排列算法示例
2019/07/25 PHP
JS加ASP二级域名转向的代码
2007/05/17 Javascript
改进版通过Json对象实现深复制的方法
2012/10/24 Javascript
JSON 数字排序多字段排序介绍
2013/09/18 Javascript
js 上下左右键控制焦点(示例代码)
2013/12/14 Javascript
jQuery动态添加及删除表单上传元素的方法(附demo源码下载)
2016/01/15 Javascript
JS动态遍历json中所有键值对的方法(不知道属性名的情况)
2016/12/28 Javascript
利用javascript实现的三种图片放大镜效果实例(附源码)
2017/01/23 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
2017/02/27 Javascript
vue指令以及dom操作详解
2017/03/04 Javascript
Node.js实现文件上传的示例
2017/06/28 Javascript
Angular项目中$scope.$apply()方法的使用详解
2017/07/26 Javascript
SeaJS中use函数用法实例分析
2017/10/10 Javascript
js登录滑动验证的实现(不滑动无法登陆)
2018/01/03 Javascript
基于datepicker定义自己的angular时间组件的示例
2018/03/14 Javascript
基于vue展开收起动画的示例代码
2018/07/05 Javascript
vue移动端轻量级的轮播组件实现代码
2018/07/12 Javascript
如何使用pm2快速将项目部署到远程服务器
2019/03/12 Javascript
inquirer.js一个用户与命令行交互的工具详解
2019/05/18 Javascript
layer弹出层自定义提交取消按钮的例子
2019/09/10 Javascript
解决vuex改变了state的值,但是页面没有更新的问题
2020/11/12 Javascript
nestjs中异常过滤器Exceptionfilter的具体使用
2021/02/07 Javascript
归纳整理Python中的控制流语句的知识点
2015/04/14 Python
python如何拆分含有多种分隔符的字符串
2018/03/20 Python
python使用pdfminer解析pdf文件的方法示例
2018/12/20 Python
python+opencv实现移动侦测(帧差法)
2020/03/20 Python
几个CSS3的flex弹性盒模型布局的简单例子演示
2016/05/12 HTML / CSS
加利福尼亚州威尼斯的女性奢侈品设计师服装和概念店:Mona Moore
2018/09/13 全球购物
4s店机修工岗位职责
2013/12/20 职场文书
投标承诺函范文
2015/01/21 职场文书
2015银行年终工作总结范文
2015/05/26 职场文书