1 #pragma once 2 3 #include "controller.hpp" 4 #include "ec/pid.hpp" 5 6 #include <limits> 7 #include <string> 8 9 namespace pid_control 10 { 11 12 class ZoneInterface; 13 14 /* 15 * Base class for PID controllers. Each PID that implements this needs to 16 * provide an inputProc, setptProc, and outputProc. 17 */ 18 class PIDController : public Controller 19 { 20 public: PIDController(const std::string & id,ZoneInterface * owner)21 PIDController(const std::string& id, ZoneInterface* owner) : 22 Controller(), _owner(owner), _id(id) 23 { 24 _pid_info.initialized = false; 25 _pid_info.checkHysterWithSetpt = false; 26 _pid_info.ts = static_cast<double>(0.0); 27 _pid_info.integral = static_cast<double>(0.0); 28 _pid_info.lastOutput = static_cast<double>(0.0); 29 _pid_info.proportionalCoeff = static_cast<double>(0.0); 30 _pid_info.integralCoeff = static_cast<double>(0.0); 31 _pid_info.derivativeCoeff = static_cast<double>(0.0); 32 _pid_info.feedFwdOffset = static_cast<double>(0.0); 33 _pid_info.feedFwdGain = static_cast<double>(0.0); 34 _pid_info.integralLimit.min = static_cast<double>(0.0); 35 _pid_info.integralLimit.max = static_cast<double>(0.0); 36 _pid_info.outLim.min = static_cast<double>(0.0); 37 _pid_info.outLim.max = static_cast<double>(0.0); 38 _pid_info.slewNeg = static_cast<double>(0.0); 39 _pid_info.slewPos = static_cast<double>(0.0); 40 _pid_info.negativeHysteresis = static_cast<double>(0.0); 41 _pid_info.positiveHysteresis = static_cast<double>(0.0); 42 } 43 44 ~PIDController() override = default; 45 46 double inputProc(void) override = 0; 47 virtual double setptProc(void) = 0; 48 void outputProc(double value) override = 0; 49 50 void process(void) override; 51 getID(void)52 std::string getID(void) override 53 { 54 return _id; 55 } getSetpoint(void)56 double getSetpoint(void) 57 { 58 return _setpoint; 59 } setSetpoint(double setpoint)60 void setSetpoint(double setpoint) 61 { 62 _setpoint = setpoint; 63 } 64 getPIDInfo(void)65 ec::pid_info_t* getPIDInfo(void) 66 { 67 return &_pid_info; 68 } 69 getLastInput(void)70 double getLastInput(void) 71 { 72 return lastInput; 73 } 74 75 double calPIDOutput(double setpt, double input, ec::pid_info_t* info); 76 77 protected: 78 ZoneInterface* _owner; 79 std::string _id; 80 81 private: 82 // parameters 83 ec::pid_info_t _pid_info; 84 double _setpoint = 0; 85 double lastInput = std::numeric_limits<double>::quiet_NaN(); 86 }; 87 88 } // namespace pid_control 89