From 60ead3fadb1bac2e79b54be885bf1b3a15674b1e Mon Sep 17 00:00:00 2001 From: Matt Kohls Date: Sun, 17 Jun 2018 01:38:45 -0400 Subject: Intial working version --- pid.py | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 pid.py (limited to 'pid.py') diff --git a/pid.py b/pid.py new file mode 100644 index 0000000..2923360 --- /dev/null +++ b/pid.py @@ -0,0 +1,91 @@ +#The recipe gives simple implementation of a Discrete Proportional-Integral-Derivative (PID) controller. PID controller gives output value for error between desired reference input and measurement feedback to minimize error value. +#More information: http://en.wikipedia.org/wiki/PID_controller +# +#cnr437@gmail.com +# +####### Example ######### +# +#p=PID(3.0,0.4,1.2) +#p.setPoint(5.0) +#while True: +# pid = p.update(measurement_value) +# +# + + +class PID: + """ + Discrete PID control + """ + + def __init__(self, P=2.0, I=0.0, D=1.0, Derivator=0, Integrator=0, Integrator_max=500, Integrator_min=-500, Set_Point=0.0): + + self.Kp=P + self.Ki=I + self.Kd=D + self.Derivator=Derivator + self.Integrator=Integrator + self.Integrator_max=Integrator_max + self.Integrator_min=Integrator_min + + self.set_point=Set_Point + self.error=0.0 + + def update(self,current_value): + """ + Calculate PID output value for given reference input and feedback + """ + + self.error = self.set_point - current_value + + self.P_value = self.Kp * self.error + self.D_value = self.Kd * ( self.error - self.Derivator) + self.Derivator = self.error + + self.Integrator = self.Integrator + self.error + + if self.Integrator > self.Integrator_max: + self.Integrator = self.Integrator_max + elif self.Integrator < self.Integrator_min: + self.Integrator = self.Integrator_min + + self.I_value = self.Integrator * self.Ki + + PID = self.P_value + self.I_value + self.D_value + + return PID + + def setPoint(self,set_point): + """ + Initilize the setpoint of PID + """ + self.set_point = set_point + self.Integrator=0 + self.Derivator=0 + + def setIntegrator(self, Integrator): + self.Integrator = Integrator + + def setDerivator(self, Derivator): + self.Derivator = Derivator + + def setKp(self,P): + self.Kp=P + + def setKi(self,I): + self.Ki=I + + def setKd(self,D): + self.Kd=D + + def getPoint(self): + return self.set_point + + def getError(self): + return self.error + + def getIntegrator(self): + return self.Integrator + + def getDerivator(self): + return self.Derivator -- cgit v1.2.3