diff --git a/firmware/drivers/pid_controller/pid_controller.cpp b/firmware/drivers/pid_controller/pid_controller.cpp index a5d77c5253ed46f0d62f298460c96aa85f16084e..a0132eb2cb60a84be74df13d72e5c479067f95dc 100644 --- a/firmware/drivers/pid_controller/pid_controller.cpp +++ b/firmware/drivers/pid_controller/pid_controller.cpp @@ -23,6 +23,7 @@ std::vector<double> Pid_controller::pid_vec_ = {0., 0., 0.}; //current values of std::vector<double> Pid_controller::kpid_vec_ = {0., 0., 0.}; //coefficients Kp Ki Kd double Pid_controller::I_reset_ = 0.; //reset value of I double Pid_controller::I_reset_errsq_ = 0.5; //value of error*error above which the I-term is held in reset +bool Pid_controller::enabled_ = true; void Pid_controller::init(double setpoint, std::vector<double> kpid, double I_reset, double I_reset_errsq){ @@ -33,6 +34,11 @@ void Pid_controller::init(double setpoint, std::vector<double> kpid, double I_re } void Pid_controller::update_pid(double temperature){ + if(!enabled_){ //if we have been turned off, stay off + output_ = 0.09; + Ltc6992::set_level(output_); + return; + } //calculate error from setpoint double error = setpoint_ - temperature; //update P,I,D @@ -92,3 +98,12 @@ double Pid_controller::get_I_reset(){ double Pid_controller::get_setpoint(){ return setpoint_; } + +void Pid_controller::turn_off(){ + output_ = 0.09; + enabled_ = false; +} + +void Pid_controller::turn_on(){ + enabled_ = true; +} \ No newline at end of file diff --git a/firmware/drivers/pid_controller/pid_controller.hpp b/firmware/drivers/pid_controller/pid_controller.hpp index 4c5bd047e32df6ec5e865158700a0c0aee6c07ec..55e53e8a2001b072d6f1eab10d9fe08561905092 100644 --- a/firmware/drivers/pid_controller/pid_controller.hpp +++ b/firmware/drivers/pid_controller/pid_controller.hpp @@ -21,6 +21,9 @@ public: static double get_I_reset(); static double get_setpoint(); + static void turn_off(); + static void turn_on(); + private: static double setpoint_; //target temperature in °C static double output_; //output to LTC6992 @@ -28,6 +31,8 @@ private: static std::vector<double> kpid_vec_; //coefficients Kp Ki Kd static double I_reset_; //reset value of I static double I_reset_errsq_; //value of error*error above which the I-term is held in reset + + static bool enabled_; }; #endif