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)
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)
結果![](https://pic.w3help.cc/907/a9dab0b932282c8a06c2ca41f88cf.jpeg)
PID演算法的理解及實現
關於理解pid控制演算法最典型的乙個例子就是乙個漏水的水缸的問題。網上有很多講解pid的帖子會講到這個例子。這裡我也把我自己對於pid的理解用這個例子闡述一遍。有個漏水的水缸,而且漏水的速度還不是恆定的。然後我們還有個水桶,我們可以控制往水缸裡面加水或者從水缸裡面舀水出來。另外我們可以檢測水平面。現...
Pid演算法 pid 及引數除錯方法
所謂pid指的是proportion integral differential。翻譯成中文是比例 積分 微分。記住兩句話 1 pid是經典控制 使用年代久遠 2 pid是誤差控制 對直流電機速度進行定速控制 1 l293作為電機驅動 2 光電感測器 作為輸出反饋 3 pwm做為輸入控制。pid怎麼...
Pid控制演算法 增量型pid演算法的C 實現
上一節中介紹了最簡單的位置型pid的實現手段,這一節主要講解增量式pid的實現方法.實現過程仍然是分為定義變數 初始化變數 實現控制演算法函式 演算法測試四個部分,這裡直接給出 了。pid.h ifndef pid h define pid h typedef struct pidpid class...