PID程序实现
2024-08-28 13:19:28
传统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的参数需自行调节)):
最新文章
- Nginx -- Gzip 压缩功能作用
- VFP不同句柄 同一事务处理 统一提交或回滚
- RouteData
- leetcode:32 最长有效括号
- qt编译mysql插件
- iOS ASIHTTPRequest用https协议加密请求
- Nginx 笔记与总结(1)编译安装
- java ajax传值 中文乱码
- DDR(一)
- Linux运维命令之一
- Oracle数据库——索引、视图、序列和同义词的创建
- [转]Best way to sort a DropDownList in MVC3 / Razor using helper method
- 移动收入超PC端 盛大文学战略转型初见成效
- Handler消息传递机制——Handler类简洁
- Python爬虫从入门到放弃(十五)之 Scrapy框架中Spiders用法
- css动画--元素上下跳动
- Linux 如何使用echo指令向文件写入内容
- shell编程快速入门及实战
- NetBeans Lookups Explained!
- Android Studio添加so文件并打包到APK的lib文件夹中