diff --git a/components/pid/pid.py b/components/pid/pid.py index 05445e3..f1a7c0a 100644 --- a/components/pid/pid.py +++ b/components/pid/pid.py @@ -11,30 +11,32 @@ class Pid: # Differentiator self.err = 0 - # Auto windup + # Anti windup self.y_min = -1.0 self.y_max = 1.0 + self.awu = 0 # Output self.y = 0 @staticmethod - def params(kp, ki, kd, rho): - p = dict(kp=kp, ki=ki, kd=kd, rho=rho) + def params(kp, ki, kd, kt): + p = dict(kp=kp, ki=ki, kd=kd, kt=kt) return p def reset(self): self.yi = 0 self.err = 0 + self.awu = 0 def process(self, err): dt = self.params['dt'] kp = self.params['kp'] ki = self.params['ki'] kd = self.params['kd'] - rho = self.params['rho'] + kt = self.params['kt'] - self.yi = rho*self.yi + ki*dt * err + self.yi = self.yi + ki*dt * err + kt*dt * self.awu yd = kd/dt*(err - self.err) yp = kp * err @@ -44,5 +46,8 @@ class Pid: self.y = max(self.y_min, min(self.y_max, y)) + # Anti windup + self.awu = self.y - y + def get_y(self): return self.y diff --git a/components/pid/temp_controller.py b/components/pid/temp_controller.py index 54e0ed1..8a58fdd 100644 --- a/components/pid/temp_controller.py +++ b/components/pid/temp_controller.py @@ -75,7 +75,7 @@ class TempController(AttributeChange): self.pid_rate.reset() elif diff > -THRESH_IDLE_HOLD: state_next = States.HOLD - self.pid_hold.reset() + self.pid_rate.reset() elif self.state == States.HOLD: if diff > THRESH_HEAT: state_next = States.HEAT @@ -109,14 +109,14 @@ if __name__ == '__main__': "kp": 0.5, "ki": 0.0, "kd": 0.0, - "rho": 1.0 + "kt": 0.0 }, "Heat": { "dt": 1.0, "kp": 0.1, "ki": 0.01, "kd": 0.0, - "rho": 1.0 + "kt": 1.0 } } @@ -159,7 +159,7 @@ if __name__ == '__main__': hold_counter = temp['Duration'] hold = False ctrl.set_theta_soll(temp_soll) - ctrl.set_heatrate_soll(2.0) + ctrl.set_heatrate_soll(2.5) while True: if hold: