- refactored
This commit is contained in:
@@ -29,12 +29,15 @@ class TempController(APid):
|
||||
self.y = -1
|
||||
self.state = States.IDLE
|
||||
self.use_kalman = True
|
||||
self.kalman.initial((self.theta_ist_set, 0))
|
||||
self.pid_hold.set_params(params['Hold'])
|
||||
self.pid_rate.set_params(params['Heat'])
|
||||
self.is_startup = True
|
||||
|
||||
def set_theta_ist(self, value):
|
||||
self.theta_ist_set = value
|
||||
if self.is_startup:
|
||||
self.is_startup = False
|
||||
self.kalman.initial((value, 0))
|
||||
|
||||
def get_theta_ist(self):
|
||||
return self.theta_ist
|
||||
@@ -82,44 +85,50 @@ class TempController(APid):
|
||||
theta_err = self.theta_soll_set - self.theta_ist
|
||||
heatrate_err = self.heatrate_soll - self.heatrate_ist
|
||||
|
||||
diff = self.theta_soll_set - self.theta_ist
|
||||
self.process_fsm(diff)
|
||||
self.process_pid(theta_err, heatrate_err)
|
||||
|
||||
def process_fsm(self, diff):
|
||||
THRESH_HOLD_IDLE = 0.1
|
||||
THRESH_HOLD_HEAT = 2.0
|
||||
THRESH_IDLE_HEAT = 1.0
|
||||
THRESH_IDLE_HOLD = 0.1
|
||||
THRESH_HEAT_HOLD = 2.0
|
||||
THRESH_HEAT_IDLE = 2.0
|
||||
|
||||
# Process state
|
||||
state_next = self.state
|
||||
diff = self.theta_soll_set - self.theta_ist
|
||||
|
||||
THRESH_HEAT = 1.0
|
||||
THRESH_IDLE = 1.0
|
||||
THRESH_IDLE_HOLD = 0.1
|
||||
THRESH_HEAT_HOLD = 1.0
|
||||
|
||||
if self.state == States.IDLE:
|
||||
if diff > THRESH_HEAT:
|
||||
self.pid_rate.reset()
|
||||
if diff > THRESH_IDLE_HEAT:
|
||||
state_next = States.HEAT
|
||||
self.pid_rate.reset()
|
||||
elif diff > -THRESH_IDLE_HOLD:
|
||||
state_next = States.HOLD
|
||||
self.pid_rate.reset()
|
||||
elif self.state == States.HOLD:
|
||||
if diff > THRESH_HEAT:
|
||||
self.pid_rate.reset()
|
||||
if diff > THRESH_HOLD_HEAT:
|
||||
state_next = States.HEAT
|
||||
self.pid_rate.reset()
|
||||
elif diff < -THRESH_IDLE_HOLD:
|
||||
elif diff < -THRESH_HOLD_IDLE:
|
||||
state_next = States.IDLE
|
||||
elif self.state == States.HEAT:
|
||||
if diff < -THRESH_IDLE:
|
||||
if diff < -THRESH_HEAT_IDLE:
|
||||
state_next = States.IDLE
|
||||
elif diff < THRESH_HEAT_HOLD:
|
||||
state_next = States.HOLD
|
||||
self.pid_hold.reset()
|
||||
|
||||
self.pid_hold.process(theta_err, -self.theta_ist)
|
||||
self.pid_rate.process(heatrate_err, -self.heatrate_ist)
|
||||
|
||||
self.y = self.pid_rate.get_y()
|
||||
self.pid_rate.reset()
|
||||
|
||||
if state_next != self.state:
|
||||
self.state = state_next
|
||||
print("New state = {}".format(state_next))
|
||||
|
||||
def process_pid(self, theta_err, heatrate_err):
|
||||
self.pid_hold.process(theta_err, -self.theta_ist)
|
||||
self.pid_rate.process(heatrate_err, -self.heatrate_ist)
|
||||
|
||||
self.y = self.pid_rate.get_y()
|
||||
|
||||
def get_power(self):
|
||||
return self.y
|
||||
|
||||
|
||||
Reference in New Issue
Block a user