diff --git a/PID.py b/PID.py new file mode 100644 --- /dev/null +++ b/PID.py @@ -0,0 +1,73 @@ +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