博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PID程序实现
阅读量:5307 次
发布时间:2019-06-14

本文共 2437 字,大约阅读时间需要 8 分钟。

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

这种算法的缺点是,由于全量输出,每次输出均与过去的状态有关,计算时要对

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

代码如下:

1 import matplotlib.pyplot as plt 2 class Pid: 3     def __init__(self,set_value = 100,now_value = 0,error_sum = 0,error_value = 0,error_last = 0,kp = 0,ki = 0,kd = 0): 4         self.set_value = set_value 5         self.now_value = now_value 6         self.error_sum = error_sum 7         self.error_value = error_value 8         self.error_last = error_last 9         self.kp = kp10         self.ki = ki11         self.kd = kd12 pid = Pid(100,100,0,0,0,0.7,0.1,0.1)13 data = []14 i = 10015 while i:16     pid.error_value = pid.set_value - pid.now_value17     pid.error_sum += pid.error_value18     pid.now_value = pid.kp * (pid.error_value + pid.ki * pid.error_sum + pid.kd * (pid.error_value - pid.error_last))19     print(pid.now_value)20     data.append(pid.now_value)21     pid.error_last = pid.error_value22     i = i - 123 #打印输出图表的部分24 plt.plot(data)25 plt.title("kp=" + (str)(pid.kp) + " ki=" + (str)(pid.ki) + " kd=" + (str)(pid.kd))26 plt.ylabel('output')27 plt.xlabel('i')28 plt.show()

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

 

 增量式PID控制调节:

代码如下:

import matplotlib.pyplot as pltclass 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 = kdpid = Pid(100,100,0,0,0,0,0,0.9,0.07,0.02)data = []i = 100while 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 - 1plt.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的参数需自行调节)):

 

转载于:https://www.cnblogs.com/ghost-98210/p/11201569.html

你可能感兴趣的文章
shell脚本快速入门
查看>>
arch初步美化及各种问题
查看>>
了解SQL Server2005新架构规则的优势
查看>>
HDU 1063 Exponentiation
查看>>
pci空间配置
查看>>
Activity的启动模式
查看>>
on duplicate key update
查看>>
CSS设置字体为楷体
查看>>
nginx配置反向代理解决前后端分离跨域问题
查看>>
SP2 网络故障解决
查看>>
VC中pragma指令简介(转)
查看>>
用 Jenkins + .netcore 2.0 构建
查看>>
POJ 2546
查看>>
NAT的三种方式
查看>>
cacti 主机/网络设备流量监控 图解
查看>>
根据id获取某一类的最大最小值
查看>>
[SDOI2014]数数 --- AC自动机 + 数位DP
查看>>
使用floodfill()函数颜色填充一个联通的区域
查看>>
spark记录
查看>>
每天一个linux命令(1):ls命令
查看>>