Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
PID.h@5:f1613df66ceb, 2019-03-25 (annotated)
- Committer:
- mazdo25
- Date:
- Mon Mar 25 22:42:31 2019 +0000
- Revision:
- 5:f1613df66ceb
- Parent:
- 4:208f5279143a
- Child:
- 6:477382219bcf
LATEST WORKING VERSION;
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| mazdo25 | 4:208f5279143a | 1 | class PID |
| mazdo25 | 4:208f5279143a | 2 | { |
| mazdo25 | 4:208f5279143a | 3 | private: |
| mazdo25 | 4:208f5279143a | 4 | float Kp_, Ki_, Kd_, Ts, PrevErr, PrevPrevErr, prevControlAction, setPoint; |
| mazdo25 | 4:208f5279143a | 5 | |
| mazdo25 | 5:f1613df66ceb | 6 | float* inMin_; |
| mazdo25 | 5:f1613df66ceb | 7 | float* inMax_; |
| mazdo25 | 4:208f5279143a | 8 | |
| mazdo25 | 4:208f5279143a | 9 | float outMin_; |
| mazdo25 | 4:208f5279143a | 10 | float outMax_; |
| mazdo25 | 4:208f5279143a | 11 | |
| mazdo25 | 4:208f5279143a | 12 | public: |
| mazdo25 | 4:208f5279143a | 13 | PID (float Kp, float Ki, float Kd, float sampleTime) |
| mazdo25 | 4:208f5279143a | 14 | { |
| mazdo25 | 4:208f5279143a | 15 | PrevErr = 0; |
| mazdo25 | 4:208f5279143a | 16 | PrevPrevErr = 0; |
| mazdo25 | 4:208f5279143a | 17 | prevControlAction = 0; |
| mazdo25 | 4:208f5279143a | 18 | setPoint = 0; |
| mazdo25 | 4:208f5279143a | 19 | |
| mazdo25 | 4:208f5279143a | 20 | outMin_ = -1.0f; |
| mazdo25 | 4:208f5279143a | 21 | outMax_ = 1.0f; |
| mazdo25 | 4:208f5279143a | 22 | |
| mazdo25 | 4:208f5279143a | 23 | Ts = sampleTime; |
| mazdo25 | 4:208f5279143a | 24 | Kp_ = Kp; |
| mazdo25 | 4:208f5279143a | 25 | Ki_ = Ki; |
| mazdo25 | 4:208f5279143a | 26 | Kd_ = Kd; |
| mazdo25 | 4:208f5279143a | 27 | } |
| mazdo25 | 4:208f5279143a | 28 | |
| mazdo25 | 4:208f5279143a | 29 | float compute (float currVal) |
| mazdo25 | 4:208f5279143a | 30 | { |
| mazdo25 | 4:208f5279143a | 31 | float currErr = setPoint - (currVal); |
| mazdo25 | 4:208f5279143a | 32 | float controlAction; |
| mazdo25 | 4:208f5279143a | 33 | |
| mazdo25 | 5:f1613df66ceb | 34 | if (currVal > *inMax_) {*inMax_ = currVal;} |
| mazdo25 | 5:f1613df66ceb | 35 | if (currVal < *inMin_) {*inMin_ = currVal;} |
| mazdo25 | 5:f1613df66ceb | 36 | |
| mazdo25 | 5:f1613df66ceb | 37 | |
| mazdo25 | 4:208f5279143a | 38 | |
| mazdo25 | 4:208f5279143a | 39 | controlAction = prevControlAction - (PrevErr*Kp_) + (Kp_*currErr)+ (Ki_*Ts*currErr) + ((Kd_/Ts)*(currErr - PrevErr - PrevErr + PrevPrevErr)); |
| mazdo25 | 4:208f5279143a | 40 | |
| mazdo25 | 5:f1613df66ceb | 41 | if (controlAction > *inMax_) {controlAction = *inMax_;} |
| mazdo25 | 5:f1613df66ceb | 42 | if (controlAction < *inMin_) {controlAction = *inMin_;} |
| mazdo25 | 4:208f5279143a | 43 | |
| mazdo25 | 4:208f5279143a | 44 | prevControlAction = controlAction; |
| mazdo25 | 4:208f5279143a | 45 | PrevPrevErr = PrevErr; |
| mazdo25 | 4:208f5279143a | 46 | PrevErr = currErr; |
| mazdo25 | 4:208f5279143a | 47 | //scale the control Action to the correct output limits and output |
| mazdo25 | 5:f1613df66ceb | 48 | return ((((controlAction)- *inMin_)/(*inMax_ - *inMin_)) * (outMax_ - outMin_)) + outMin_; |
| mazdo25 | 4:208f5279143a | 49 | } |
| mazdo25 | 4:208f5279143a | 50 | |
| mazdo25 | 4:208f5279143a | 51 | void setSetPoint(float _sP) |
| mazdo25 | 4:208f5279143a | 52 | { |
| mazdo25 | 4:208f5279143a | 53 | setPoint = _sP; |
| mazdo25 | 4:208f5279143a | 54 | } |
| mazdo25 | 4:208f5279143a | 55 | |
| mazdo25 | 4:208f5279143a | 56 | void setOutputLimits(float outMin,float outMax) |
| mazdo25 | 4:208f5279143a | 57 | { |
| mazdo25 | 4:208f5279143a | 58 | if (outMin > outMax) {return;} |
| mazdo25 | 4:208f5279143a | 59 | |
| mazdo25 | 4:208f5279143a | 60 | outMin_ = outMin; |
| mazdo25 | 4:208f5279143a | 61 | outMax_ = outMax; |
| mazdo25 | 4:208f5279143a | 62 | } |
| mazdo25 | 4:208f5279143a | 63 | |
| mazdo25 | 5:f1613df66ceb | 64 | void assignLimitAddress(float *inMax, float *inMin) |
| mazdo25 | 4:208f5279143a | 65 | { |
| mazdo25 | 5:f1613df66ceb | 66 | inMax_ = inMax; |
| mazdo25 | 4:208f5279143a | 67 | inMin_ = inMin; |
| mazdo25 | 5:f1613df66ceb | 68 | } |
| mazdo25 | 5:f1613df66ceb | 69 | |
| mazdo25 | 5:f1613df66ceb | 70 | float returnInMax() |
| mazdo25 | 5:f1613df66ceb | 71 | { |
| mazdo25 | 5:f1613df66ceb | 72 | return *inMax_; |
| mazdo25 | 4:208f5279143a | 73 | } |
| mazdo25 | 4:208f5279143a | 74 | |
| mazdo25 | 4:208f5279143a | 75 | float scaler(float prevMin, float prevMax, float newMin, float newMax, float var) |
| mazdo25 | 4:208f5279143a | 76 | { |
| mazdo25 | 4:208f5279143a | 77 | if (var > prevMax) {var = prevMax;} |
| mazdo25 | 4:208f5279143a | 78 | if (var < prevMin) {var = prevMin;} |
| mazdo25 | 4:208f5279143a | 79 | return (((var-prevMin)/(prevMax - prevMin))*(newMax-newMin))+newMin; |
| mazdo25 | 4:208f5279143a | 80 | } |
| mazdo25 | 4:208f5279143a | 81 | |
| mazdo25 | 4:208f5279143a | 82 | float returnPrevCA() |
| mazdo25 | 4:208f5279143a | 83 | { |
| mazdo25 | 4:208f5279143a | 84 | return prevControlAction; |
| mazdo25 | 4:208f5279143a | 85 | } |
| mazdo25 | 4:208f5279143a | 86 | |
| mazdo25 | 4:208f5279143a | 87 | }; |
| mazdo25 | 4:208f5279143a | 88 | |
| mazdo25 | 4:208f5279143a | 89 | //(((temp-inMin)/(inMax - inMin))*(outMax-outMin))+outMin |