xref: /openbmc/phosphor-pid-control/pid/ec/pid.hpp (revision 0e8fc398)
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