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 列表(List)操作方法详解
Mar 11 Python
Python命令启动Web服务器实例详解
Feb 23 Python
python多线程socket编程之多客户端接入
Sep 12 Python
Python实战小程序利用matplotlib模块画图代码分享
Dec 09 Python
Python实现Event回调机制的方法
Feb 13 Python
获取django框架orm query执行的sql语句实现方法分析
Jun 20 Python
python导包的几种方法(自定义包的生成以及导入详解)
Jul 15 Python
简单了解Django应用app及分布式路由
Jul 24 Python
python实现WebSocket服务端过程解析
Oct 18 Python
如何教少儿学习Python编程
Jul 10 Python
Python内置函数property()如何使用
Sep 01 Python
Python爬虫之Selenium多窗口切换的实现
Dec 04 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操作csv文件代码实例汇总
2014/09/22 PHP
解决phpcms更换javascript的幻灯片代码调用图片问题
2014/12/26 PHP
PHP中array_keys和array_unique函数源码的分析
2016/02/26 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
2016/11/03 PHP
PHP实现合并两个排序链表的方法
2018/01/19 PHP
基于jQuery的弹出框插件
2012/03/18 Javascript
javascript小组件 原生table排序表格脚本(兼容ie firefox opera chrome)
2012/07/25 Javascript
js给selected添加options的方法
2015/05/06 Javascript
JavaScript原生编写《飞机大战坦克》游戏完整实例
2017/01/04 Javascript
详解Angularjs 如何自定义Img的ng-load 事件
2017/02/15 Javascript
Vue.use源码学习小结
2018/06/20 Javascript
Vue 组件注册实例详解
2019/02/23 Javascript
详解jquery和vue对比
2019/04/16 jQuery
Vue 实现复制功能,不需要任何结构内容直接复制方式
2019/11/09 Javascript
实例讲解React 组件
2020/07/07 Javascript
Python完全新手教程
2007/02/08 Python
Python中的exec、eval使用实例
2014/09/23 Python
python通过shutil实现快速文件复制的方法
2015/03/14 Python
Python实现生成随机日期字符串的方法示例
2017/12/25 Python
python使用mysql的两种使用方式
2018/03/07 Python
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
2020/05/20 Python
python中的split、rsplit、splitlines用法说明
2020/10/23 Python
pycharm远程连接服务器并配置python interpreter的方法
2020/12/23 Python
CSS3 实现穿梭星空动画
2020/11/13 HTML / CSS
HTML5 b和i标记将被赋予真正的语义
2009/07/16 HTML / CSS
世界领先的以旅馆为主的在线预订平台:Hostelworld
2016/10/09 全球购物
台湾最大网路书店:博客来
2018/03/18 全球购物
汽车运用工程专业毕业生推荐信
2013/12/25 职场文书
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
奥巴马竞选演讲稿
2014/05/15 职场文书
党的群众路线教育实践活动个人整改落实情况汇报
2014/10/28 职场文书
放假通知范文
2015/04/14 职场文书
Go语言操作数据库及其常规操作的示例代码
2021/04/21 Golang
SpringBoot集成Redis的思路详解
2021/10/16 Redis
Win10 heic文件怎么打开 ? Win10 heic文件打开教程
2022/04/06 数码科技