class PID:
def __init__(self,P,I,D,t):
self.P = P
self.I = I
self.D = D
self.e = 0
self.e_old_list = [0,0,0,0]
self.kp = self.P
self.ki = 0
self.kd = self.D
self.Dt = t
self.limit_up = float('inf')
self.limit_down = float('-inf')
self.out = 0
self.i = 0
def input(self,e,t):
self.e = e
self.Dt = t - self.Dt
def Integral_separation(self): #积分分离
self.ki = self.I if abs(self.e) < 0.2 else 0
def FPCDM(self): #四点中心差分法
self.e_old_list.insert(0, e)
self.e_old_list.pop()
self.Dx = (self.e_old_list[0] + 3 * self.e_old_list[1] - 3 * self.e_old_list[2] + self.e_old_list[3]) / 6 * self.Dt * self.kp * self.kd
def out_separation(self): #输出分离
self.out = self.out if self.out < self.limit_up else self.limit_up
self.out = self.out if self.out > self.limit_down else self.limit_down
def main(self):
self.Integral_separation()
self.FPCDM()
self.i = self.i + self.i * self.ki * self.Dt
self.out = self.e * self.kp + self.i + self.Dx
self.out_separation()