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