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@13:521d6c6e7042, 2019-04-29 (annotated)
- Committer:
- UditSrivastav
- Date:
- Mon Apr 29 09:40:30 2019 +0000
- Revision:
- 13:521d6c6e7042
- Parent:
- 8:5ed6685f6edd
Anythign um
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 | 8:5ed6685f6edd | 31 | float currErr = setPoint - currVal; |
| mazdo25 | 4:208f5279143a | 32 | float controlAction; |
| mazdo25 | 4:208f5279143a | 33 | |
| mazdo25 | 8:5ed6685f6edd | 34 | //if (currVal > *inMax_) {*inMax_ = currVal; *inMin_ = -1.0f*currVal;} |
| mazdo25 | 8:5ed6685f6edd | 35 | //if (currVal < *inMin_) {*inMin_ = currVal; *inMax_ = -1.0f*currVal;} |
| mazdo25 | 8:5ed6685f6edd | 36 | |
| mazdo25 | 4:208f5279143a | 37 | controlAction = prevControlAction - (PrevErr*Kp_) + (Kp_*currErr)+ (Ki_*Ts*currErr) + ((Kd_/Ts)*(currErr - PrevErr - PrevErr + PrevPrevErr)); |
| mazdo25 | 4:208f5279143a | 38 | |
| mazdo25 | 4:208f5279143a | 39 | prevControlAction = controlAction; |
| mazdo25 | 4:208f5279143a | 40 | PrevPrevErr = PrevErr; |
| mazdo25 | 4:208f5279143a | 41 | PrevErr = currErr; |
| mazdo25 | 4:208f5279143a | 42 | //scale the control Action to the correct output limits and output |
| mazdo25 | 6:477382219bcf | 43 | controlAction = ((((controlAction)- *inMin_)/(*inMax_ - *inMin_)) * (outMax_ - outMin_)) + outMin_; |
| mazdo25 | 6:477382219bcf | 44 | |
| mazdo25 | 6:477382219bcf | 45 | if (controlAction > outMax_) {return outMax_;} else if (controlAction < outMin_) {return outMin_;} else {return controlAction;} |
| mazdo25 | 6:477382219bcf | 46 | |
| mazdo25 | 4:208f5279143a | 47 | } |
| mazdo25 | 4:208f5279143a | 48 | |
| mazdo25 | 4:208f5279143a | 49 | void setSetPoint(float _sP) |
| mazdo25 | 4:208f5279143a | 50 | { |
| mazdo25 | 4:208f5279143a | 51 | setPoint = _sP; |
| mazdo25 | 4:208f5279143a | 52 | } |
| mazdo25 | 4:208f5279143a | 53 | |
| mazdo25 | 4:208f5279143a | 54 | void setOutputLimits(float outMin,float outMax) |
| mazdo25 | 4:208f5279143a | 55 | { |
| mazdo25 | 4:208f5279143a | 56 | if (outMin > outMax) {return;} |
| mazdo25 | 4:208f5279143a | 57 | |
| mazdo25 | 4:208f5279143a | 58 | outMin_ = outMin; |
| mazdo25 | 4:208f5279143a | 59 | outMax_ = outMax; |
| mazdo25 | 4:208f5279143a | 60 | } |
| mazdo25 | 4:208f5279143a | 61 | |
| mazdo25 | 5:f1613df66ceb | 62 | void assignLimitAddress(float *inMax, float *inMin) |
| mazdo25 | 4:208f5279143a | 63 | { |
| mazdo25 | 5:f1613df66ceb | 64 | inMax_ = inMax; |
| mazdo25 | 4:208f5279143a | 65 | inMin_ = inMin; |
| mazdo25 | 5:f1613df66ceb | 66 | } |
| mazdo25 | 5:f1613df66ceb | 67 | |
| mazdo25 | 5:f1613df66ceb | 68 | float returnInMax() |
| mazdo25 | 5:f1613df66ceb | 69 | { |
| mazdo25 | 5:f1613df66ceb | 70 | return *inMax_; |
| mazdo25 | 4:208f5279143a | 71 | } |
| mazdo25 | 4:208f5279143a | 72 | |
| mazdo25 | 4:208f5279143a | 73 | float scaler(float prevMin, float prevMax, float newMin, float newMax, float var) |
| mazdo25 | 4:208f5279143a | 74 | { |
| mazdo25 | 4:208f5279143a | 75 | if (var > prevMax) {var = prevMax;} |
| mazdo25 | 4:208f5279143a | 76 | if (var < prevMin) {var = prevMin;} |
| mazdo25 | 4:208f5279143a | 77 | return (((var-prevMin)/(prevMax - prevMin))*(newMax-newMin))+newMin; |
| mazdo25 | 4:208f5279143a | 78 | } |
| mazdo25 | 4:208f5279143a | 79 | |
| mazdo25 | 4:208f5279143a | 80 | float returnPrevCA() |
| mazdo25 | 4:208f5279143a | 81 | { |
| mazdo25 | 4:208f5279143a | 82 | return prevControlAction; |
| mazdo25 | 4:208f5279143a | 83 | } |
| mazdo25 | 4:208f5279143a | 84 | |
| UditSrivastav | 13:521d6c6e7042 | 85 | void reset() |
| UditSrivastav | 13:521d6c6e7042 | 86 | { |
| UditSrivastav | 13:521d6c6e7042 | 87 | prevControlAction = 0; |
| UditSrivastav | 13:521d6c6e7042 | 88 | PrevPrevErr = 0; |
| UditSrivastav | 13:521d6c6e7042 | 89 | PrevErr = 0; |
| UditSrivastav | 13:521d6c6e7042 | 90 | } |
| UditSrivastav | 13:521d6c6e7042 | 91 | |
| mazdo25 | 4:208f5279143a | 92 | }; |
| mazdo25 | 4:208f5279143a | 93 | |
| mazdo25 | 4:208f5279143a | 94 | //(((temp-inMin)/(inMax - inMin))*(outMax-outMin))+outMin |