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.cpp@1:fa0730bf53ef, 2022-08-23 (annotated)
- Committer:
- ohdoyoel
- Date:
- Tue Aug 23 08:55:01 2022 +0000
- Revision:
- 1:fa0730bf53ef
hello~
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| ohdoyoel | 1:fa0730bf53ef | 1 | #include "PID.h" | 
| ohdoyoel | 1:fa0730bf53ef | 2 | |
| ohdoyoel | 1:fa0730bf53ef | 3 | extern Serial bt; | 
| ohdoyoel | 1:fa0730bf53ef | 4 | |
| ohdoyoel | 1:fa0730bf53ef | 5 | float PID::getP(){ | 
| ohdoyoel | 1:fa0730bf53ef | 6 | return Kp_; | 
| ohdoyoel | 1:fa0730bf53ef | 7 | } | 
| ohdoyoel | 1:fa0730bf53ef | 8 | void PID::setP(float Kp){ | 
| ohdoyoel | 1:fa0730bf53ef | 9 | Kp_ = Kp; | 
| ohdoyoel | 1:fa0730bf53ef | 10 | } | 
| ohdoyoel | 1:fa0730bf53ef | 11 | float PID::getI(){ | 
| ohdoyoel | 1:fa0730bf53ef | 12 | return Ki_; | 
| ohdoyoel | 1:fa0730bf53ef | 13 | } | 
| ohdoyoel | 1:fa0730bf53ef | 14 | void PID::setI(float Ki){ | 
| ohdoyoel | 1:fa0730bf53ef | 15 | Ki_ = Ki; | 
| ohdoyoel | 1:fa0730bf53ef | 16 | } | 
| ohdoyoel | 1:fa0730bf53ef | 17 | float PID::getD(){ | 
| ohdoyoel | 1:fa0730bf53ef | 18 | return Kd_; | 
| ohdoyoel | 1:fa0730bf53ef | 19 | } | 
| ohdoyoel | 1:fa0730bf53ef | 20 | void PID::setD(float Kd){ | 
| ohdoyoel | 1:fa0730bf53ef | 21 | Kd_ = Kd; | 
| ohdoyoel | 1:fa0730bf53ef | 22 | } | 
| ohdoyoel | 1:fa0730bf53ef | 23 | |
| ohdoyoel | 1:fa0730bf53ef | 24 | PID::PID(float Kp, float Ki, float Kd, float interval) | 
| ohdoyoel | 1:fa0730bf53ef | 25 | { | 
| ohdoyoel | 1:fa0730bf53ef | 26 | Kp_=Kp; | 
| ohdoyoel | 1:fa0730bf53ef | 27 | Ki_=Ki; | 
| ohdoyoel | 1:fa0730bf53ef | 28 | Kd_=Kd; | 
| ohdoyoel | 1:fa0730bf53ef | 29 | interval_=interval; | 
| ohdoyoel | 1:fa0730bf53ef | 30 | |
| ohdoyoel | 1:fa0730bf53ef | 31 | err_ = 0; | 
| ohdoyoel | 1:fa0730bf53ef | 32 | accErr_ = 0; | 
| ohdoyoel | 1:fa0730bf53ef | 33 | prevCV_ = 0; | 
| ohdoyoel | 1:fa0730bf53ef | 34 | |
| ohdoyoel | 1:fa0730bf53ef | 35 | prevVelocity_=0; // speed control | 
| ohdoyoel | 1:fa0730bf53ef | 36 | |
| ohdoyoel | 1:fa0730bf53ef | 37 | TV_ = 0; | 
| ohdoyoel | 1:fa0730bf53ef | 38 | |
| ohdoyoel | 1:fa0730bf53ef | 39 | Scale_ = PID_SCALE; // pulses / rotation | 
| ohdoyoel | 1:fa0730bf53ef | 40 | } | 
| ohdoyoel | 1:fa0730bf53ef | 41 | |
| ohdoyoel | 1:fa0730bf53ef | 42 | void PID::ReadCurrentValue(int CurrentValue) // current Encoder Value | 
| ohdoyoel | 1:fa0730bf53ef | 43 | { | 
| ohdoyoel | 1:fa0730bf53ef | 44 | CV_ = CurrentValue; | 
| ohdoyoel | 1:fa0730bf53ef | 45 | } | 
| ohdoyoel | 1:fa0730bf53ef | 46 | |
| ohdoyoel | 1:fa0730bf53ef | 47 | void PID::SetTargetValue(int targetValue) | 
| ohdoyoel | 1:fa0730bf53ef | 48 | { | 
| ohdoyoel | 1:fa0730bf53ef | 49 | TV_ = targetValue; | 
| ohdoyoel | 1:fa0730bf53ef | 50 | } | 
| ohdoyoel | 1:fa0730bf53ef | 51 | |
| ohdoyoel | 1:fa0730bf53ef | 52 | float PID::ReadCurrentVelocity(void) | 
| ohdoyoel | 1:fa0730bf53ef | 53 | { | 
| ohdoyoel | 1:fa0730bf53ef | 54 | float CurrentVelocity_ = (CV_ - prevCV_) / interval_ / PID_SCALE; | 
| ohdoyoel | 1:fa0730bf53ef | 55 | |
| ohdoyoel | 1:fa0730bf53ef | 56 | return CurrentVelocity_; | 
| ohdoyoel | 1:fa0730bf53ef | 57 | } | 
| ohdoyoel | 1:fa0730bf53ef | 58 | |
| ohdoyoel | 1:fa0730bf53ef | 59 | float PID::Performance_Speed(void) | 
| ohdoyoel | 1:fa0730bf53ef | 60 | { | 
| ohdoyoel | 1:fa0730bf53ef | 61 | float CurrentVelocity_ = (CV_ - prevCV_) / interval_ / PID_SCALE; | 
| ohdoyoel | 1:fa0730bf53ef | 62 | |
| ohdoyoel | 1:fa0730bf53ef | 63 | err_= TV_ - CurrentVelocity_; | 
| ohdoyoel | 1:fa0730bf53ef | 64 | accErr_ += err_; | 
| ohdoyoel | 1:fa0730bf53ef | 65 | |
| ohdoyoel | 1:fa0730bf53ef | 66 | /* // wrong code | 
| ohdoyoel | 1:fa0730bf53ef | 67 | float slope = (CurrentVelocity_ - prevVelocity_) / interval_; | 
| ohdoyoel | 1:fa0730bf53ef | 68 | controllerOutput_ = (Kp_ * err_) + (Ki_ * accErr_) + (Kd_ * slope); | 
| ohdoyoel | 1:fa0730bf53ef | 69 | */ | 
| ohdoyoel | 1:fa0730bf53ef | 70 | |
| ohdoyoel | 1:fa0730bf53ef | 71 | controllerOutput_ = (Kp_ * err_) + (Ki_ * interval_ * accErr_) + (Kd_ * (ScaledCV_ - ScaledPrevCV_) / interval_); | 
| ohdoyoel | 1:fa0730bf53ef | 72 | |
| ohdoyoel | 1:fa0730bf53ef | 73 | |
| ohdoyoel | 1:fa0730bf53ef | 74 | prevCV_ = CV_; | 
| ohdoyoel | 1:fa0730bf53ef | 75 | |
| ohdoyoel | 1:fa0730bf53ef | 76 | prevVelocity_ = CurrentVelocity_; | 
| ohdoyoel | 1:fa0730bf53ef | 77 | |
| ohdoyoel | 1:fa0730bf53ef | 78 | return controllerOutput_; | 
| ohdoyoel | 1:fa0730bf53ef | 79 | } | 
| ohdoyoel | 1:fa0730bf53ef | 80 | |
| ohdoyoel | 1:fa0730bf53ef | 81 | float PID::Performance_Location(void) | 
| ohdoyoel | 1:fa0730bf53ef | 82 | { | 
| ohdoyoel | 1:fa0730bf53ef | 83 | ScaledCV_ = CV_ / Scale_; | 
| ohdoyoel | 1:fa0730bf53ef | 84 | ScaledTV_ = TV_ / Scale_; | 
| ohdoyoel | 1:fa0730bf53ef | 85 | ScaledPrevCV_ = prevCV_ / Scale_; | 
| ohdoyoel | 1:fa0730bf53ef | 86 | |
| ohdoyoel | 1:fa0730bf53ef | 87 | |
| ohdoyoel | 1:fa0730bf53ef | 88 | err_ = ScaledTV_ - ScaledCV_; | 
| ohdoyoel | 1:fa0730bf53ef | 89 | accErr_ += err_; | 
| ohdoyoel | 1:fa0730bf53ef | 90 | |
| ohdoyoel | 1:fa0730bf53ef | 91 | /* // wrong code | 
| ohdoyoel | 1:fa0730bf53ef | 92 | float slope = (ScaledCV_ - ScaledPrevCV_) / interval_; | 
| ohdoyoel | 1:fa0730bf53ef | 93 | controllerOutput_ = (Kp_ * err_) + (Ki_ * accErr_) + (Kd_ * slope); // missed the sampling time in Ki terms | 
| ohdoyoel | 1:fa0730bf53ef | 94 | */ | 
| ohdoyoel | 1:fa0730bf53ef | 95 | |
| ohdoyoel | 1:fa0730bf53ef | 96 | controllerOutput_ = (Kp_ * err_) + (Ki_ * interval_ * accErr_) + (Kd_ * (ScaledCV_ - ScaledPrevCV_) / interval_); | 
| ohdoyoel | 1:fa0730bf53ef | 97 | |
| ohdoyoel | 1:fa0730bf53ef | 98 | prevCV_ = CV_; | 
| ohdoyoel | 1:fa0730bf53ef | 99 | |
| ohdoyoel | 1:fa0730bf53ef | 100 | return controllerOutput_; | 
| ohdoyoel | 1:fa0730bf53ef | 101 | } | 
| ohdoyoel | 1:fa0730bf53ef | 102 | |
| ohdoyoel | 1:fa0730bf53ef | 103 | void PID::Reset(void) | 
| ohdoyoel | 1:fa0730bf53ef | 104 | { | 
| ohdoyoel | 1:fa0730bf53ef | 105 | err_ = 0; | 
| ohdoyoel | 1:fa0730bf53ef | 106 | accErr_ = 0; | 
| ohdoyoel | 1:fa0730bf53ef | 107 | prevCV_ = 0; | 
| ohdoyoel | 1:fa0730bf53ef | 108 | |
| ohdoyoel | 1:fa0730bf53ef | 109 | prevVelocity_=0; // speed control | 
| ohdoyoel | 1:fa0730bf53ef | 110 | |
| ohdoyoel | 1:fa0730bf53ef | 111 | TV_ = 0; | 
| ohdoyoel | 1:fa0730bf53ef | 112 | } | 
| ohdoyoel | 1:fa0730bf53ef | 113 | |
| ohdoyoel | 1:fa0730bf53ef | 114 | void PID::ResetError(void) | 
| ohdoyoel | 1:fa0730bf53ef | 115 | { | 
| ohdoyoel | 1:fa0730bf53ef | 116 | accErr_ = 0; | 
| ohdoyoel | 1:fa0730bf53ef | 117 | } | 
| ohdoyoel | 1:fa0730bf53ef | 118 |