import time
class PID:
def __init__(self, setpoint = 0):
self.setpoint = float(setpoint)
self.Kp = 0
self.Ki = 0
self.Kd = 0
self.min_out = 0
self.max_out = 1000
self.Reset()
def SetMin(self, min_out):
self.min_out = min_out
def SetMax(self, max_out):
self.max_out = max_out
def SetSetpoint(self, setpoint):
self.setpoint = float(setpoint)
def SetKp(self, Kp):
self.Kp = float(Kp)
def SetKi(self, Ki):
self.Ki = float(Ki)
def SetKd(self, Kd):
self.Kd = float(Kd)
def Reset(self):
self.current_time = time.time()
self.last_time = self.current_time
self.last_error = 0
self.Cp = 0
self.Ci = 0
self.Cd = 0
def Update(self, value):
print("PID input: " + str(value))
error = self.setpoint - value
self.current_time = time.time()
dt = self.current_time - self.last_time
de = error - self.last_error
self.Cp = self.Kp * error
self.Ci += error * dt
self.Cd = 0
if dt > 0:
self.Cd = de/dt
self.last_time = self.current_time
self.last_error = error
output = self.Cp + (self.Ki * self.Ci) + (self.Kd * self.Cd)
if output > self.max_out:
output = self.max_out
if output < self.min_out:
output = self.min_out
print("PID output: " + str(output))
return output