传统PID(位置式PID控制)调节:

这种算法的缺点是,由于全量输出,每次输出均与过去的状态有关,计算时要对
e(k) 进行累加,计算机运算工作量大。而且,因为计算机输出的 u(k) 对应的是执行机构的实际位置,如计算机出现故障, u(k) 的大幅度变化,会引起执行机构位置的大幅度变化,这种情况往往是生产实践中不允许的,在某些场合,还可能造成重大的生产事故,因而产生了增量式
PID 控制算法。

代码如下:

 import matplotlib.pyplot as plt
class Pid:
def __init__(self,set_value = 100,now_value = 0,error_sum = 0,error_value = 0,error_last = 0,kp = 0,ki = 0,kd = 0):
self.set_value = set_value
self.now_value = now_value
self.error_sum = error_sum
self.error_value = error_value
self.error_last = error_last
self.kp = kp
self.ki = ki
self.kd = kd
pid = Pid(100,100,0,0,0,0.7,0.1,0.1)
data = []
i = 100
while i:
pid.error_value = pid.set_value - pid.now_value
pid.error_sum += pid.error_value
pid.now_value = pid.kp * (pid.error_value + pid.ki * pid.error_sum + pid.kd * (pid.error_value - pid.error_last))
print(pid.now_value)
data.append(pid.now_value)
pid.error_last = pid.error_value
i = i - 1
#打印输出图表的部分
plt.plot(data)
plt.title("kp=" + (str)(pid.kp) + " ki=" + (str)(pid.ki) + " kd=" + (str)(pid.kd))
plt.ylabel('output')
plt.xlabel('i')
plt.show()

波形如下(kp,ki,kd的参数需自行调节):

增量式PID控制调节:

代码如下:

import matplotlib.pyplot as plt
class Pid:
def __init__(self,set_value = 100,now_value = 0,add_value = 0,last_value = 0,error_value = 0,error_last = 0,error_last_last = 0,kp = 0,ki = 0,kd = 0):
self.set_value = set_value
self.now_value = now_value
self.add_value = add_value
self.last_value = last_value
self.error_value = error_value
self.error_last = error_last
self.error_last_last = error_last_last
self.kp = kp
self.ki = ki
self.kd = kd
pid = Pid(100,100,0,0,0,0,0,0.9,0.07,0.02)
data = []
i = 100
while i:
pid.error_value = pid.set_value - pid.now_value
pid.add_value = pid.kp * (pid.error_value - pid.error_last) + pid.ki * pid.error_value + pid.kd * (pid.error_value - 2 * pid.error_last + pid.error_last_last)
pid.now_value += pid.add_value
print(pid.now_value)
data.append(pid.now_value)
pid.error_last = pid.error_value
pid.error_last_last = pid.error_last
i = i - 1 plt.plot(data)
plt.title("kp=" + (str)(pid.kp) + " ki=" + (str)(pid.ki) + " kd=" + (str)(pid.kd))
plt.ylabel('output')
plt.xlabel('i')
plt.show()

波形如下((kp,ki,kd的参数需自行调节)):

PID程序实现的更多相关文章

  1. 增量式PID计算公式4个疑问与理解

    一开始见到PID计算公式时总是疑问为什么是那样子?为了理解那几道公式,当时将其未简化前的公式“活生生”地算了一遍,现在想来,这样的演算过程固然有助于理解,但假如一开始就带着对疑问的答案已有一定看法后再 ...

  2. PID控制器的数字实现及C语法讲解

    PID控制器的数字实现及C语法讲解 概述 为方便学习与交流,根据自己的理解与经验写了这份教程,有错误之处请各位读者予以指出,具体包含以下三部分内容: (1)  PID数字化的推导过程(实质:微积分的近 ...

  3. android 卸载程序、清除数据、停止服务用法

    要实现卸载程序.清除数据.停止正在执行的服务这几大模块,如今将代码粗略总结例如以下: 主要运用到的类有 PackageManager ActivityManager ApplicationInfo R ...

  4. Android学习-应用程序管理

    在前段时间,公司要求做一个Android系统的应用程序管理,要实现卸载程序.清除数据.停止正在运行的服务这几大模块,现在将代码粗略总结如下: 主要运用到的类有 PackageManager Activ ...

  5. linux 之程序管理

    一个程序的父进程可以用PPID来判断   命令ps -l 可以用来观察程序相关的输出信息   被关闭的程序又产生:crontab或者父进程产生的   我们将常驻在系统中的程序称为:服务(daemon) ...

  6. Python编写守护进程程序

    Python编写守护进程程序思路 1. fork子进程,父进程退出通常,我们执行服务端程序的时候都会通过终端连接到服务器,成功连接后会加载shell环境,终端和shell都是进程,shell进程是终端 ...

  7. perf + Flame Graph火焰图分析程序性能

    1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果 ...

  8. [转]perf + 火焰图分析程序性能

    1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果 ...

  9. SIMATIC PID温度控制

    SIMATIC PID温度控制 // VAR_INPUT ------------------------------------------------------------------- #if ...

随机推荐

  1. 使用zabbix-proxy

    事情背景: vt上两个vps,只提供ipv6.(因为便宜嘛).而我的zabbix服务器在腾讯云.它丫的没有ipv6. 那么我没法监控它们了呀... 这咋个行呢? 想办法... 我还有另外的vps 可以 ...

  2. BZOJ 4734 UOJ #269 如何优雅地求和 (多项式)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4734 (UOJ) http://uoj.ac/problem/269 题解 ...

  3. input上传mp3格式文件,预览并且获取时间

    <input type="file" id="file" name="file" class="upfile" o ...

  4. Windows下使用cmd运行jar文件

    一般window系统下是不能直接运行jar文件的.(有些电脑可以,记得我以前的电脑是双击jar就可以运行的) 那么如何在windows下运行jar呢? 1.首先,电脑必须配置java运行环境jre-- ...

  5. linux系统安装Memcache

    Linux系统安装memcached 首先要先安装libevent库. centos  下执行 yum install libevent libevent-devel 查看memcached 是否已经 ...

  6. win10 下cuda 9.0 卸载

    1.首先 对于cuda8.0.cuda7.5的卸载都可以兼容 安装cuda9.0之后,电脑原来的NVIDIA图形驱动会被更新,NVIDIA Physx系统软件也会被更新(安装低版cuda可能不会被更新 ...

  7. 【Java/JDBC】借助ResultSetMetaData,从数据库表中抽取字段信息存成Excel文件

    本例工程下载:https://files.cnblogs.com/files/xiandedanteng/FindNotnullColumns20191102-3.rar 工作中曾有个为42张表建立测 ...

  8. Kotlin入门-Android的基础布局

    线性布局线性布局LinearLayout是最常用的布局,顾名思义,它下面的子视图像是用一根线串了起来,所以其内部视图的排列是有顺序的,要么从上到下垂直排列,要么从左到右水平排列.排列顺序只能指定一维方 ...

  9. c++ throw异常(学习)

    #include <iostream>#include <stdio.h> using namespace std; void my_copy(const char* src_ ...

  10. 使用java NIO及高速缓冲区写入文件

    byte[] bytes = Files.readAllBytes(Paths.get("E:\\pdf\\aaa\\html\\text.txt").normalize()); ...