python實現PID演算法及測試

2021-08-29 07:32:54 字數 3445 閱讀 6678

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)

結果

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...