/** * adapted from the Arduino PID library * * Created on 2020/01/08. */ #ifndef ARDUINOPID_H #define ARDUINOPID_H #include enum PIDCtlMode { PID_MANUAL = 0, PID_AUTOMATIC = 1, }; enum PIDDirection { PID_DIRECT = 0, PID_REVERSE = 1, }; struct PID { /*working variables*/ uint32_t lastTime; float Input, Output, Setpoint; float ITerm, lastInput; float kp, ki, kd; uint32_t SampleTime; //1 sec = 1000 float outMin, outMax; enum PIDCtlMode ctlMode; // false enum PIDDirection controllerDirection; }; #define PID_DEFAULT() { .SampleTime = 1000, .ctlMode=PID_MANUAL, .controllerDirection=PID_DIRECT } void PID_Compute(struct PID *self, float Input); void PID_SetTunings(struct PID *self, float Kp, float Ki, float Kd); void PID_SetSampleTime(struct PID *self, uint32_t NewSampleTime); void PID_SetOutputLimits(struct PID *self, float Min, float Max); void PID_SetCtlMode(struct PID *self, enum PIDCtlMode Mode); void PID_Initialize(struct PID *self); void PID_SetSetpoint(struct PID *self, float Setpoint); void PID_SetControllerDirection(struct PID *self, enum PIDDirection Direction); #endif //ARDUINOPID_H