1 #pragma once 2 3 #include <cstdint> 4 5 namespace pid_control 6 { 7 namespace ec 8 { 9 10 typedef struct 11 { 12 double min; 13 double max; 14 } limits_t; 15 16 /* Note: If you update these structs you need to update the copy code in 17 * pid/util.cpp. 18 */ 19 typedef struct 20 { 21 bool initialized; // has pid been initialized 22 23 double ts; // sample time in seconds 24 double integral; // intergal of error 25 double lastOutput; // value of last output 26 double lastError; // value of last error 27 28 double proportionalCoeff; // coeff for P 29 double integralCoeff; // coeff for I 30 double derivativeCoeff; // coeff for D 31 double feedFwdOffset; // offset coeff for feed-forward term 32 double feedFwdGain; // gain for feed-forward term 33 34 limits_t integralLimit; // clamp of integral 35 limits_t outLim; // clamp of output 36 double slewNeg; 37 double slewPos; 38 double positiveHysteresis; 39 double negativeHysteresis; 40 } pid_info_t; 41 42 double pid(pid_info_t* pidinfoptr, double input, double setpoint); 43 44 /* Condensed version for use by the configuration. */ 45 struct pidinfo 46 { 47 double ts; // sample time in seconds 48 double proportionalCoeff; // coeff for P 49 double integralCoeff; // coeff for I 50 double derivativeCoeff; // coeff for D 51 double feedFwdOffset; // offset coeff for feed-forward term 52 double feedFwdGain; // gain for feed-forward term 53 ec::limits_t integralLimit; // clamp of integral 54 ec::limits_t outLim; // clamp of output 55 double slewNeg; 56 double slewPos; 57 double positiveHysteresis; 58 double negativeHysteresis; 59 }; 60 61 } // namespace ec 62 } // namespace pid_control 63