diff --git a/Control/brewpi/controller.py b/Control/brewpi/controller.py index 138d90c..7e8092c 100644 --- a/Control/brewpi/controller.py +++ b/Control/brewpi/controller.py @@ -64,8 +64,8 @@ class Controller(TimerListener): self.timerMgr.registerTimer(self.plantTimer) self.timerMgr.registerTimer(self.reportTimer) self.rast_running = False - self.power_hold = 0 - self.power_heat = 1500 + self.power_hold_offset = 200 + self.power_heat_offset = 1500 def onTimer(self, timer): if timer == self.sensorTimer: @@ -239,18 +239,15 @@ class Controller(TimerListener): self.pid_hold.process(self.dt, self.params['Hold']['Pid'], ctrl_theta_err) self.pid_rate.process(self.dt, self.params['Heat']['Pid'], ctrl_heatrate_err) - if self.ovenState == ovenStates.HOLD: - self.power_hold += self.params['P_max'] * self.pid_hold.get_y() + power_hold = self.power_hold_offset + self.params['P_max'] * self.pid_hold.get_y() + power_heat = self.power_heat_offset + self.params['P_max'] * self.pid_rate.get_y() + power_hold = max(self.params['P_min'], min(self.params['P_max'], power_hold)) + power_heat = max(self.params['P_min'], min(self.params['P_max'], power_heat)) + + power_soll = min(power_hold, power_hold) if self.ovenState == ovenStates.HEAT: - self.power_heat += self.params['P_max'] * self.pid_rate.get_y() - - self.power_hold = max(self.params['P_min'], min(self.params['P_max'], self.power_hold)) - self.power_heat = max(self.params['P_min'], min(self.params['P_max'], self.power_heat)) - - power_soll = min(self.power_hold, self.power_hold) - if self.ovenState == ovenStates.HEAT: - power_soll = min(self.power_heat, self.power_heat) + power_soll = min(power_heat, power_heat) self.plant.setPower(power_soll) power_ist = self.plant.getPower() @@ -259,8 +256,8 @@ class Controller(TimerListener): self.theta_v = np.append(self.theta_v, ctrl_theta) self.heatrate_v = np.append(self.heatrate_v, ctrl_heatrate) self.power_v = np.append(self.power_v, power_soll) - self.power_hold_v = np.append(self.power_hold_v, self.power_hold) - self.power_heat_v = np.append(self.power_heat_v, self.power_heat) + self.power_hold_v = np.append(self.power_hold_v, power_hold) + self.power_heat_v = np.append(self.power_heat_v, power_heat) self.error_v = np.append(self.error_v, ctrl_theta_err) self.power_soll = power_soll @@ -268,11 +265,13 @@ class Controller(TimerListener): if ovenStateNext != self.ovenState: self.log("{} -> {}".format(self.ovenState, ovenStateNext)) if ovenStateNext == ovenStates.HEAT: -# self.pid_rate.reset() + self.power_hold_offset = power_hold + self.pid_rate.reset() self.stirrer.setSpeed(self.stirrSpeedHeat) self.stirrer.setDutyCycle(1.0) if ovenStateNext == ovenStates.HOLD: + self.power_heat_offset = power_heat self.pid_hold.reset() self.stirrer.setSpeed(self.stirrSpeedRast) self.stirrer.setDutyCycle(self.stirrDutyRast) diff --git a/Control/brewpi/plant.py b/Control/brewpi/plant.py index 0e1d1f4..39db9cd 100644 --- a/Control/brewpi/plant.py +++ b/Control/brewpi/plant.py @@ -11,6 +11,9 @@ class Plant(APlant): self.tempsensor = Max31865() self.P = 0 self.isOn = False + self.cycleTime = 10 + self.dutyCycle = 1 + self.cycleCounter = 0 def activate(self, enable=True): if enable == True: @@ -20,20 +23,29 @@ class Plant(APlant): self.heater.setSwitch(enable) self.heater.remoteEnable(enable) - def process(self): - pass + def process(self, dt=1): + isOn = self.isOn + self.cycleCounter += dt + if self.cycleCounter >= self.cycleTime: + self.cycleCounter -= self.cycleTime + isOn = 0 + + if self.cycleCounter >= (self.cycleTime * (1-self.dutyCycle)): + if not isOn: + isOn = 1 + + if self.isOn != isOn: + if isOn: + self.heater.setSwitch(True) + else: + self.heater.setSwitch(False) + + self.isOn = isOn def setPower(self, power_w): self.P = power_w - self.heater.setPowerWatts(power_w) - if power_w < 250: - if self.isOn: - self.heater.setSwitch(False) - self.isOn = False - elif power_w >= 500: - if not self.isOn: - self.heater.setSwitch(True) - self.isOn = True + self.heater.setPowerWatts(max(500, power_w)) + self.dutyCycle = min(1, power_w / 500) def getPower(self): return self.heater.getPowerWatts()