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开发常用的一些开源Package分享
Feb 14 Python
通过实例浅析Python对比C语言的编程思想差异
Aug 30 Python
Python实现简单多线程任务队列
Feb 27 Python
python结合selenium获取XX省交通违章数据的实现思路及代码
Jun 26 Python
Python列出一个文件夹及其子目录的所有文件
Jun 30 Python
深入理解python中的atexit模块
Mar 07 Python
python如何使用unittest测试接口
Apr 04 Python
利用Python实现原创工具的Logo与Help
Dec 03 Python
使用python制作一个解压缩软件
Nov 13 Python
Python代码块及缓存机制原理详解
Dec 13 Python
Python面向对象之私有属性和私有方法应用案例分析
Dec 31 Python
python画环形图的方法
Mar 25 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时间戳与日期之间转换的实例介绍
2013/04/19 PHP
php生成zip压缩文件的方法详解
2013/06/09 PHP
joomla jce editor 解决上传中文名文件失败问题
2013/06/09 PHP
PHPWind9.0手动屏蔽验证码解决后台关闭验证码但是依然显示的问题
2016/08/12 PHP
php中简单的对称加密算法实现
2017/01/05 PHP
php屏蔽错误及提示的方法
2020/05/10 PHP
利用js获取服务器时间的两个简单方法
2010/01/08 Javascript
JSDoc 介绍使用规范JsDoc的使用介绍
2011/02/12 Javascript
jQuery 阴影插件代码分享
2012/01/09 Javascript
jQuery实现鼠标可拖动调整表格列宽度
2014/05/26 Javascript
Ext4.2的Ext.grid.plugin.RowExpander无法触发事件解决办法
2014/08/15 Javascript
require.js深入了解 require.js特性介绍
2014/09/04 Javascript
Javascript调用函数方法的几种方式介绍
2015/03/20 Javascript
jQuery实现简单的DIV拖动效果
2016/02/19 Javascript
基于JavaScript实现自动更新倒计时效果
2016/12/19 Javascript
微信小程序本地缓存数据增删改查实例详解
2017/05/24 Javascript
vue-cli启动本地服务局域网不能访问的原因分析
2018/01/22 Javascript
vue路由对不同界面进行传参及跳转的总结
2019/04/20 Javascript
微信小程序 腾讯地图显示偏差问题解决
2019/07/27 Javascript
JS 数组和对象的深拷贝操作示例
2020/06/06 Javascript
Python正则表达式使用范例分享
2016/12/04 Python
python中reduce()函数的使用方法示例
2017/09/29 Python
python如何实现反向迭代
2018/03/20 Python
解决python中使用plot画图,图不显示的问题
2018/07/04 Python
Python中的Django基本命令实例详解
2018/07/15 Python
Python3.5多进程原理与用法实例分析
2019/04/05 Python
美国老牌主机服务商:iPage
2016/07/22 全球购物
GAP美国官网:美国休闲时尚品牌
2016/08/26 全球购物
50道外企软件测试面试题
2014/08/18 面试题
完美主义个人的自我评价
2014/02/17 职场文书
三八妇女节活动总结
2014/05/04 职场文书
民主评议党员登记表自我评价
2014/10/20 职场文书
2015年员工工作表现评语
2015/03/25 职场文书
交通安全教育主题班会
2015/08/12 职场文书
Winsows11性能如何? win11性能测评多核竟比Win10差了10%
2021/11/21 数码科技
MySQL的InnoDB存储引擎的数据页结构详解
2022/03/03 MySQL