for dror
PID.h@1:b738a8164729, 2019-12-25 (annotated)
- Committer:
- noamnahum
- Date:
- Wed Dec 25 09:00:32 2019 +0000
- Revision:
- 1:b738a8164729
- Parent:
- 0:6e12a3e5af19
code change
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
noamnahum | 1:b738a8164729 | 1 | |
aberk | 0:6e12a3e5af19 | 2 | |
aberk | 0:6e12a3e5af19 | 3 | #ifndef PID_H |
aberk | 0:6e12a3e5af19 | 4 | #define PID_H |
aberk | 0:6e12a3e5af19 | 5 | |
aberk | 0:6e12a3e5af19 | 6 | #include "mbed.h" |
aberk | 0:6e12a3e5af19 | 7 | |
aberk | 0:6e12a3e5af19 | 8 | |
aberk | 0:6e12a3e5af19 | 9 | class PID { |
aberk | 0:6e12a3e5af19 | 10 | |
aberk | 0:6e12a3e5af19 | 11 | public: |
aberk | 0:6e12a3e5af19 | 12 | |
noamnahum | 1:b738a8164729 | 13 | |
aberk | 0:6e12a3e5af19 | 14 | PID(float Kc, float tauI, float tauD, float interval); |
aberk | 0:6e12a3e5af19 | 15 | |
aberk | 0:6e12a3e5af19 | 16 | /** |
aberk | 0:6e12a3e5af19 | 17 | * Scale from inputs to 0-100%. |
aberk | 0:6e12a3e5af19 | 18 | * |
aberk | 0:6e12a3e5af19 | 19 | * @param InMin The real world value corresponding to 0%. |
aberk | 0:6e12a3e5af19 | 20 | * @param InMax The real world value corresponding to 100%. |
aberk | 0:6e12a3e5af19 | 21 | */ |
aberk | 0:6e12a3e5af19 | 22 | void setInputLimits(float inMin , float inMax); |
aberk | 0:6e12a3e5af19 | 23 | |
aberk | 0:6e12a3e5af19 | 24 | /** |
aberk | 0:6e12a3e5af19 | 25 | * Scale from outputs to 0-100%. |
aberk | 0:6e12a3e5af19 | 26 | * |
aberk | 0:6e12a3e5af19 | 27 | * @param outMin The real world value corresponding to 0%. |
aberk | 0:6e12a3e5af19 | 28 | * @param outMax The real world value corresponding to 100%. |
aberk | 0:6e12a3e5af19 | 29 | */ |
aberk | 0:6e12a3e5af19 | 30 | void setOutputLimits(float outMin, float outMax); |
aberk | 0:6e12a3e5af19 | 31 | |
aberk | 0:6e12a3e5af19 | 32 | /** |
aberk | 0:6e12a3e5af19 | 33 | * Calculate PID constants. |
aberk | 0:6e12a3e5af19 | 34 | * |
aberk | 0:6e12a3e5af19 | 35 | * Allows parameters to be changed on the fly without ruining calculations. |
aberk | 0:6e12a3e5af19 | 36 | * |
aberk | 0:6e12a3e5af19 | 37 | * @param Kc - Tuning parameter |
aberk | 0:6e12a3e5af19 | 38 | * @param tauI - Tuning parameter |
aberk | 0:6e12a3e5af19 | 39 | * @param tauD - Tuning parameter |
aberk | 0:6e12a3e5af19 | 40 | */ |
aberk | 0:6e12a3e5af19 | 41 | void setTunings(float Kc, float tauI, float tauD); |
aberk | 0:6e12a3e5af19 | 42 | |
aberk | 0:6e12a3e5af19 | 43 | /** |
aberk | 0:6e12a3e5af19 | 44 | * Reinitializes controller internals. Automatically |
aberk | 0:6e12a3e5af19 | 45 | * called on a manual to auto transition. |
aberk | 0:6e12a3e5af19 | 46 | */ |
aberk | 0:6e12a3e5af19 | 47 | void reset(void); |
aberk | 0:6e12a3e5af19 | 48 | |
aberk | 0:6e12a3e5af19 | 49 | /** |
aberk | 0:6e12a3e5af19 | 50 | * Set PID to manual or auto mode. |
aberk | 0:6e12a3e5af19 | 51 | * |
aberk | 0:6e12a3e5af19 | 52 | * @param mode 0 -> Manual |
aberk | 0:6e12a3e5af19 | 53 | * Non-zero -> Auto |
aberk | 0:6e12a3e5af19 | 54 | */ |
aberk | 0:6e12a3e5af19 | 55 | void setMode(int mode); |
aberk | 0:6e12a3e5af19 | 56 | |
aberk | 0:6e12a3e5af19 | 57 | /** |
aberk | 0:6e12a3e5af19 | 58 | * Set how fast the PID loop is run. |
aberk | 0:6e12a3e5af19 | 59 | * |
aberk | 0:6e12a3e5af19 | 60 | * @param interval PID calculation peformed every interval seconds. |
aberk | 0:6e12a3e5af19 | 61 | */ |
aberk | 0:6e12a3e5af19 | 62 | void setInterval(float interval); |
aberk | 0:6e12a3e5af19 | 63 | |
aberk | 0:6e12a3e5af19 | 64 | /** |
aberk | 0:6e12a3e5af19 | 65 | * Set the set point. |
aberk | 0:6e12a3e5af19 | 66 | * |
aberk | 0:6e12a3e5af19 | 67 | * @param sp The set point as a real world value. |
aberk | 0:6e12a3e5af19 | 68 | */ |
aberk | 0:6e12a3e5af19 | 69 | void setSetPoint(float sp); |
aberk | 0:6e12a3e5af19 | 70 | |
aberk | 0:6e12a3e5af19 | 71 | /** |
aberk | 0:6e12a3e5af19 | 72 | * Set the process value. |
aberk | 0:6e12a3e5af19 | 73 | * |
aberk | 0:6e12a3e5af19 | 74 | * @param pv The process value as a real world value. |
aberk | 0:6e12a3e5af19 | 75 | */ |
aberk | 0:6e12a3e5af19 | 76 | void setProcessValue(float pv); |
aberk | 0:6e12a3e5af19 | 77 | |
aberk | 0:6e12a3e5af19 | 78 | /** |
aberk | 0:6e12a3e5af19 | 79 | * Set the bias. |
aberk | 0:6e12a3e5af19 | 80 | * |
aberk | 0:6e12a3e5af19 | 81 | * @param bias The bias for the controller output. |
aberk | 0:6e12a3e5af19 | 82 | */ |
aberk | 0:6e12a3e5af19 | 83 | void setBias(float bias); |
aberk | 0:6e12a3e5af19 | 84 | |
aberk | 0:6e12a3e5af19 | 85 | /** |
aberk | 0:6e12a3e5af19 | 86 | * PID calculation. |
aberk | 0:6e12a3e5af19 | 87 | * |
aberk | 0:6e12a3e5af19 | 88 | * @return The controller output as a float between outMin and outMax. |
aberk | 0:6e12a3e5af19 | 89 | */ |
aberk | 0:6e12a3e5af19 | 90 | float compute(void); |
aberk | 0:6e12a3e5af19 | 91 | |
aberk | 0:6e12a3e5af19 | 92 | //Getters. |
aberk | 0:6e12a3e5af19 | 93 | float getInMin(); |
aberk | 0:6e12a3e5af19 | 94 | float getInMax(); |
aberk | 0:6e12a3e5af19 | 95 | float getOutMin(); |
aberk | 0:6e12a3e5af19 | 96 | float getOutMax(); |
aberk | 0:6e12a3e5af19 | 97 | float getInterval(); |
aberk | 0:6e12a3e5af19 | 98 | float getPParam(); |
aberk | 0:6e12a3e5af19 | 99 | float getIParam(); |
aberk | 0:6e12a3e5af19 | 100 | float getDParam(); |
aberk | 0:6e12a3e5af19 | 101 | |
aberk | 0:6e12a3e5af19 | 102 | private: |
aberk | 0:6e12a3e5af19 | 103 | |
aberk | 0:6e12a3e5af19 | 104 | bool usingFeedForward; |
aberk | 0:6e12a3e5af19 | 105 | bool inAuto; |
aberk | 0:6e12a3e5af19 | 106 | |
aberk | 0:6e12a3e5af19 | 107 | //Actual tuning parameters used in PID calculation. |
aberk | 0:6e12a3e5af19 | 108 | float Kc_; |
aberk | 0:6e12a3e5af19 | 109 | float tauR_; |
aberk | 0:6e12a3e5af19 | 110 | float tauD_; |
aberk | 0:6e12a3e5af19 | 111 | |
aberk | 0:6e12a3e5af19 | 112 | //Raw tuning parameters. |
aberk | 0:6e12a3e5af19 | 113 | float pParam_; |
aberk | 0:6e12a3e5af19 | 114 | float iParam_; |
aberk | 0:6e12a3e5af19 | 115 | float dParam_; |
aberk | 0:6e12a3e5af19 | 116 | |
aberk | 0:6e12a3e5af19 | 117 | //The point we want to reach. |
aberk | 0:6e12a3e5af19 | 118 | float setPoint_; |
aberk | 0:6e12a3e5af19 | 119 | //The thing we measure. |
aberk | 0:6e12a3e5af19 | 120 | float processVariable_; |
aberk | 0:6e12a3e5af19 | 121 | float prevProcessVariable_; |
aberk | 0:6e12a3e5af19 | 122 | //The output that affects the process variable. |
aberk | 0:6e12a3e5af19 | 123 | float controllerOutput_; |
aberk | 0:6e12a3e5af19 | 124 | float prevControllerOutput_; |
aberk | 0:6e12a3e5af19 | 125 | |
aberk | 0:6e12a3e5af19 | 126 | //We work in % for calculations so these will scale from |
aberk | 0:6e12a3e5af19 | 127 | //real world values to 0-100% and back again. |
aberk | 0:6e12a3e5af19 | 128 | float inMin_; |
aberk | 0:6e12a3e5af19 | 129 | float inMax_; |
aberk | 0:6e12a3e5af19 | 130 | float inSpan_; |
aberk | 0:6e12a3e5af19 | 131 | float outMin_; |
aberk | 0:6e12a3e5af19 | 132 | float outMax_; |
aberk | 0:6e12a3e5af19 | 133 | float outSpan_; |
aberk | 0:6e12a3e5af19 | 134 | |
aberk | 0:6e12a3e5af19 | 135 | //The accumulated error, i.e. integral. |
aberk | 0:6e12a3e5af19 | 136 | float accError_; |
aberk | 0:6e12a3e5af19 | 137 | //The controller output bias. |
aberk | 0:6e12a3e5af19 | 138 | float bias_; |
aberk | 0:6e12a3e5af19 | 139 | |
aberk | 0:6e12a3e5af19 | 140 | //The interval between samples. |
aberk | 0:6e12a3e5af19 | 141 | float tSample_; |
aberk | 0:6e12a3e5af19 | 142 | |
aberk | 0:6e12a3e5af19 | 143 | //Controller output as a real world value. |
aberk | 0:6e12a3e5af19 | 144 | volatile float realOutput_; |
aberk | 0:6e12a3e5af19 | 145 | |
aberk | 0:6e12a3e5af19 | 146 | }; |
aberk | 0:6e12a3e5af19 | 147 | |
aberk | 0:6e12a3e5af19 | 148 | #endif /* PID_H */ |