updated for quadcopter

Dependents:   Autonomous_quadcopter

Fork of PID by Aaron Berk

Committer:
edy05
Date:
Tue May 22 19:37:34 2018 +0000
Revision:
7:8ee2f9ba6ac3
Parent:
6:02717c0e74ce
Changed zero error, added stabalize functions, setLandingPoint()

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aberk 0:6e12a3e5af19 1 /**
aberk 0:6e12a3e5af19 2 * @author Aaron Berk
aberk 0:6e12a3e5af19 3 *
aberk 0:6e12a3e5af19 4 * @section LICENSE
aberk 0:6e12a3e5af19 5 *
aberk 0:6e12a3e5af19 6 * Copyright (c) 2010 ARM Limited
aberk 0:6e12a3e5af19 7 *
aberk 0:6e12a3e5af19 8 * Permission is hereby granted, free of charge, to any person obtaining a copy
aberk 0:6e12a3e5af19 9 * of this software and associated documentation files (the "Software"), to deal
aberk 0:6e12a3e5af19 10 * in the Software without restriction, including without limitation the rights
aberk 0:6e12a3e5af19 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
aberk 0:6e12a3e5af19 12 * copies of the Software, and to permit persons to whom the Software is
aberk 0:6e12a3e5af19 13 * furnished to do so, subject to the following conditions:
aberk 0:6e12a3e5af19 14 *
aberk 0:6e12a3e5af19 15 * The above copyright notice and this permission notice shall be included in
aberk 0:6e12a3e5af19 16 * all copies or substantial portions of the Software.
aberk 0:6e12a3e5af19 17 *
aberk 0:6e12a3e5af19 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
aberk 0:6e12a3e5af19 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
aberk 0:6e12a3e5af19 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
aberk 0:6e12a3e5af19 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
aberk 0:6e12a3e5af19 22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
aberk 0:6e12a3e5af19 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
aberk 0:6e12a3e5af19 24 * THE SOFTWARE.
aberk 0:6e12a3e5af19 25 *
aberk 0:6e12a3e5af19 26 * @section DESCRIPTION
aberk 0:6e12a3e5af19 27 *
aberk 0:6e12a3e5af19 28 * A PID controller is a widely used feedback controller commonly found in
aberk 0:6e12a3e5af19 29 * industry.
aberk 0:6e12a3e5af19 30 *
aberk 0:6e12a3e5af19 31 * This library is a port of Brett Beauregard's Arduino PID library:
aberk 0:6e12a3e5af19 32 *
aberk 0:6e12a3e5af19 33 * http://www.arduino.cc/playground/Code/PIDLibrary
aberk 0:6e12a3e5af19 34 *
aberk 0:6e12a3e5af19 35 * The wikipedia article on PID controllers is a good place to start on
aberk 0:6e12a3e5af19 36 * understanding how they work:
aberk 0:6e12a3e5af19 37 *
aberk 0:6e12a3e5af19 38 * http://en.wikipedia.org/wiki/PID_controller
aberk 0:6e12a3e5af19 39 *
aberk 0:6e12a3e5af19 40 * For a clear and elegant explanation of how to implement and tune a
aberk 0:6e12a3e5af19 41 * controller, the controlguru website by Douglas J. Cooper (who also happened
aberk 0:6e12a3e5af19 42 * to be Brett's controls professor) is an excellent reference:
aberk 0:6e12a3e5af19 43 *
aberk 0:6e12a3e5af19 44 * http://www.controlguru.com/
aberk 0:6e12a3e5af19 45 */
aberk 0:6e12a3e5af19 46
aberk 0:6e12a3e5af19 47 /**
aberk 0:6e12a3e5af19 48 * Includes
aberk 0:6e12a3e5af19 49 */
aberk 0:6e12a3e5af19 50 #include "PID.h"
aberk 0:6e12a3e5af19 51
aberk 0:6e12a3e5af19 52 PID::PID(float Kc, float tauI, float tauD, float interval) {
aberk 0:6e12a3e5af19 53
aberk 0:6e12a3e5af19 54 usingFeedForward = false;
aberk 0:6e12a3e5af19 55 inAuto = false;
aberk 0:6e12a3e5af19 56
aberk 0:6e12a3e5af19 57 //Default the limits to the full range of I/O: 3.3V
aberk 0:6e12a3e5af19 58 //Make sure to set these to more appropriate limits for
aberk 0:6e12a3e5af19 59 //your application.
aberk 0:6e12a3e5af19 60 setInputLimits(0.0, 3.3);
aberk 0:6e12a3e5af19 61 setOutputLimits(0.0, 3.3);
aberk 0:6e12a3e5af19 62
aberk 0:6e12a3e5af19 63 tSample_ = interval;
aberk 0:6e12a3e5af19 64
aberk 0:6e12a3e5af19 65 setTunings(Kc, tauI, tauD);
aberk 0:6e12a3e5af19 66
aberk 0:6e12a3e5af19 67 setPoint_ = 0.0;
aberk 0:6e12a3e5af19 68 processVariable_ = 0.0;
aberk 0:6e12a3e5af19 69 prevProcessVariable_ = 0.0;
aberk 0:6e12a3e5af19 70 controllerOutput_ = 0.0;
aberk 0:6e12a3e5af19 71 prevControllerOutput_ = 0.0;
aberk 0:6e12a3e5af19 72
aberk 0:6e12a3e5af19 73 accError_ = 0.0;
aberk 0:6e12a3e5af19 74 bias_ = 0.0;
aberk 0:6e12a3e5af19 75
aberk 0:6e12a3e5af19 76 realOutput_ = 0.0;
edy05 4:3f9903757639 77
edy05 4:3f9903757639 78 stabelized_ = false;
aberk 0:6e12a3e5af19 79
aberk 0:6e12a3e5af19 80 }
aberk 0:6e12a3e5af19 81
aberk 0:6e12a3e5af19 82 void PID::setInputLimits(float inMin, float inMax) {
aberk 0:6e12a3e5af19 83
aberk 0:6e12a3e5af19 84 //Make sure we haven't been given impossible values.
aberk 0:6e12a3e5af19 85 if (inMin >= inMax) {
aberk 0:6e12a3e5af19 86 return;
aberk 0:6e12a3e5af19 87 }
aberk 0:6e12a3e5af19 88
aberk 0:6e12a3e5af19 89 //Rescale the working variables to reflect the changes.
aberk 0:6e12a3e5af19 90 prevProcessVariable_ *= (inMax - inMin) / inSpan_;
aberk 0:6e12a3e5af19 91 accError_ *= (inMax - inMin) / inSpan_;
aberk 0:6e12a3e5af19 92
aberk 0:6e12a3e5af19 93 //Make sure the working variables are within the new limits.
aberk 0:6e12a3e5af19 94 if (prevProcessVariable_ > 1) {
aberk 0:6e12a3e5af19 95 prevProcessVariable_ = 1;
aberk 0:6e12a3e5af19 96 } else if (prevProcessVariable_ < 0) {
aberk 0:6e12a3e5af19 97 prevProcessVariable_ = 0;
aberk 0:6e12a3e5af19 98 }
aberk 0:6e12a3e5af19 99
aberk 0:6e12a3e5af19 100 inMin_ = inMin;
aberk 0:6e12a3e5af19 101 inMax_ = inMax;
aberk 0:6e12a3e5af19 102 inSpan_ = inMax - inMin;
aberk 0:6e12a3e5af19 103
aberk 0:6e12a3e5af19 104 }
aberk 0:6e12a3e5af19 105
aberk 0:6e12a3e5af19 106 void PID::setOutputLimits(float outMin, float outMax) {
aberk 0:6e12a3e5af19 107
aberk 0:6e12a3e5af19 108 //Make sure we haven't been given impossible values.
aberk 0:6e12a3e5af19 109 if (outMin >= outMax) {
aberk 0:6e12a3e5af19 110 return;
aberk 0:6e12a3e5af19 111 }
aberk 0:6e12a3e5af19 112
aberk 0:6e12a3e5af19 113 //Rescale the working variables to reflect the changes.
aberk 0:6e12a3e5af19 114 prevControllerOutput_ *= (outMax - outMin) / outSpan_;
aberk 0:6e12a3e5af19 115
aberk 0:6e12a3e5af19 116 //Make sure the working variables are within the new limits.
aberk 0:6e12a3e5af19 117 if (prevControllerOutput_ > 1) {
aberk 0:6e12a3e5af19 118 prevControllerOutput_ = 1;
aberk 0:6e12a3e5af19 119 } else if (prevControllerOutput_ < 0) {
aberk 0:6e12a3e5af19 120 prevControllerOutput_ = 0;
aberk 0:6e12a3e5af19 121 }
aberk 0:6e12a3e5af19 122
aberk 0:6e12a3e5af19 123 outMin_ = outMin;
aberk 0:6e12a3e5af19 124 outMax_ = outMax;
aberk 0:6e12a3e5af19 125 outSpan_ = outMax - outMin;
aberk 0:6e12a3e5af19 126
aberk 0:6e12a3e5af19 127 }
aberk 0:6e12a3e5af19 128
aberk 0:6e12a3e5af19 129 void PID::setTunings(float Kc, float tauI, float tauD) {
aberk 0:6e12a3e5af19 130
aberk 0:6e12a3e5af19 131 //Verify that the tunings make sense.
aberk 0:6e12a3e5af19 132 if (Kc == 0.0 || tauI < 0.0 || tauD < 0.0) {
aberk 0:6e12a3e5af19 133 return;
aberk 0:6e12a3e5af19 134 }
aberk 0:6e12a3e5af19 135
aberk 0:6e12a3e5af19 136 //Store raw values to hand back to user on request.
aberk 0:6e12a3e5af19 137 pParam_ = Kc;
aberk 0:6e12a3e5af19 138 iParam_ = tauI;
aberk 0:6e12a3e5af19 139 dParam_ = tauD;
aberk 0:6e12a3e5af19 140
aberk 0:6e12a3e5af19 141 float tempTauR;
aberk 0:6e12a3e5af19 142
aberk 0:6e12a3e5af19 143 if (tauI == 0.0) {
aberk 0:6e12a3e5af19 144 tempTauR = 0.0;
aberk 0:6e12a3e5af19 145 } else {
aberk 0:6e12a3e5af19 146 tempTauR = (1.0 / tauI) * tSample_;
aberk 0:6e12a3e5af19 147 }
aberk 0:6e12a3e5af19 148
aberk 0:6e12a3e5af19 149 //For "bumpless transfer" we need to rescale the accumulated error.
aberk 0:6e12a3e5af19 150 if (inAuto) {
aberk 0:6e12a3e5af19 151 if (tempTauR == 0.0) {
aberk 0:6e12a3e5af19 152 accError_ = 0.0;
aberk 0:6e12a3e5af19 153 } else {
aberk 0:6e12a3e5af19 154 accError_ *= (Kc_ * tauR_) / (Kc * tempTauR);
aberk 0:6e12a3e5af19 155 }
aberk 0:6e12a3e5af19 156 }
aberk 0:6e12a3e5af19 157
aberk 0:6e12a3e5af19 158 Kc_ = Kc;
aberk 0:6e12a3e5af19 159 tauR_ = tempTauR;
edy05 4:3f9903757639 160 firstTauR_ = tempTauR;
aberk 0:6e12a3e5af19 161 tauD_ = tauD / tSample_;
aberk 0:6e12a3e5af19 162
aberk 0:6e12a3e5af19 163 }
aberk 0:6e12a3e5af19 164
aberk 0:6e12a3e5af19 165 void PID::reset(void) {
aberk 0:6e12a3e5af19 166
aberk 0:6e12a3e5af19 167 float scaledBias = 0.0;
aberk 0:6e12a3e5af19 168
aberk 0:6e12a3e5af19 169 if (usingFeedForward) {
aberk 0:6e12a3e5af19 170 scaledBias = (bias_ - outMin_) / outSpan_;
aberk 0:6e12a3e5af19 171 } else {
aberk 0:6e12a3e5af19 172 scaledBias = (realOutput_ - outMin_) / outSpan_;
aberk 0:6e12a3e5af19 173 }
aberk 0:6e12a3e5af19 174
aberk 0:6e12a3e5af19 175 prevControllerOutput_ = scaledBias;
aberk 0:6e12a3e5af19 176 prevProcessVariable_ = (processVariable_ - inMin_) / inSpan_;
aberk 0:6e12a3e5af19 177
aberk 0:6e12a3e5af19 178 //Clear any error in the integral.
aberk 0:6e12a3e5af19 179 accError_ = 0;
aberk 0:6e12a3e5af19 180
aberk 0:6e12a3e5af19 181 }
aberk 0:6e12a3e5af19 182
edy05 1:a36e49dac330 183 void PID::resetError(void){
edy05 1:a36e49dac330 184 //Clear any error in the integral.
edy05 1:a36e49dac330 185 accError_ = 0;
edy05 1:a36e49dac330 186 }
edy05 1:a36e49dac330 187
aberk 0:6e12a3e5af19 188 void PID::setMode(int mode) {
aberk 0:6e12a3e5af19 189
aberk 0:6e12a3e5af19 190 //We were in manual, and we just got set to auto.
aberk 0:6e12a3e5af19 191 //Reset the controller internals.
aberk 0:6e12a3e5af19 192 if (mode != 0 && !inAuto) {
aberk 0:6e12a3e5af19 193 reset();
aberk 0:6e12a3e5af19 194 }
aberk 0:6e12a3e5af19 195
aberk 0:6e12a3e5af19 196 inAuto = (mode != 0);
aberk 0:6e12a3e5af19 197
aberk 0:6e12a3e5af19 198 }
aberk 0:6e12a3e5af19 199
aberk 0:6e12a3e5af19 200 void PID::setInterval(float interval) {
aberk 0:6e12a3e5af19 201
aberk 0:6e12a3e5af19 202 if (interval > 0) {
aberk 0:6e12a3e5af19 203 //Convert the time-based tunings to reflect this change.
aberk 0:6e12a3e5af19 204 tauR_ *= (interval / tSample_);
aberk 0:6e12a3e5af19 205 accError_ *= (tSample_ / interval);
aberk 0:6e12a3e5af19 206 tauD_ *= (interval / tSample_);
aberk 0:6e12a3e5af19 207 tSample_ = interval;
aberk 0:6e12a3e5af19 208 }
aberk 0:6e12a3e5af19 209
aberk 0:6e12a3e5af19 210 }
aberk 0:6e12a3e5af19 211
aberk 0:6e12a3e5af19 212 void PID::setSetPoint(float sp) {
edy05 5:9bc7a51e97ba 213 if(stabelized_ == true){
edy05 5:9bc7a51e97ba 214 tauR_ = firstTauR_;
edy05 4:3f9903757639 215 stabelized_ = false;
edy05 5:9bc7a51e97ba 216 }
aberk 0:6e12a3e5af19 217 setPoint_ = sp;
aberk 0:6e12a3e5af19 218
aberk 0:6e12a3e5af19 219 }
aberk 0:6e12a3e5af19 220
edy05 7:8ee2f9ba6ac3 221 void PID::setLandingPoint(float sp) {
edy05 7:8ee2f9ba6ac3 222 setPoint_ = sp;
edy05 7:8ee2f9ba6ac3 223
edy05 7:8ee2f9ba6ac3 224 }
edy05 7:8ee2f9ba6ac3 225
aberk 0:6e12a3e5af19 226 void PID::setProcessValue(float pv) {
aberk 0:6e12a3e5af19 227
aberk 0:6e12a3e5af19 228 processVariable_ = pv;
aberk 0:6e12a3e5af19 229
aberk 0:6e12a3e5af19 230 }
aberk 0:6e12a3e5af19 231
aberk 0:6e12a3e5af19 232 void PID::setBias(float bias){
aberk 0:6e12a3e5af19 233
aberk 0:6e12a3e5af19 234 bias_ = bias;
aberk 0:6e12a3e5af19 235 usingFeedForward = 1;
aberk 0:6e12a3e5af19 236
aberk 0:6e12a3e5af19 237 }
aberk 0:6e12a3e5af19 238
aberk 0:6e12a3e5af19 239 float PID::compute() {
aberk 0:6e12a3e5af19 240
aberk 0:6e12a3e5af19 241 //Pull in the input and setpoint, and scale them into percent span.
aberk 0:6e12a3e5af19 242 float scaledPV = (processVariable_ - inMin_) / inSpan_;
edy05 2:b03de6191e60 243
aberk 0:6e12a3e5af19 244 if (scaledPV > 1.0) {
aberk 0:6e12a3e5af19 245 scaledPV = 1.0;
aberk 0:6e12a3e5af19 246 } else if (scaledPV < 0.0) {
aberk 0:6e12a3e5af19 247 scaledPV = 0.0;
aberk 0:6e12a3e5af19 248 }
aberk 0:6e12a3e5af19 249
aberk 0:6e12a3e5af19 250 float scaledSP = (setPoint_ - inMin_) / inSpan_;
edy05 2:b03de6191e60 251
aberk 0:6e12a3e5af19 252 if (scaledSP > 1.0) {
aberk 0:6e12a3e5af19 253 scaledSP = 1;
aberk 0:6e12a3e5af19 254 } else if (scaledSP < 0.0) {
aberk 0:6e12a3e5af19 255 scaledSP = 0;
aberk 0:6e12a3e5af19 256 }
aberk 0:6e12a3e5af19 257
aberk 0:6e12a3e5af19 258 float error = scaledSP - scaledPV;
edy05 7:8ee2f9ba6ac3 259 if(error < 0.002 && error > -0.001){
edy05 3:1a8e62899e55 260 error = 0;
edy05 4:3f9903757639 261 if(stabelized_ == false){
edy05 5:9bc7a51e97ba 262 printf("stabelized \n\r");
edy05 4:3f9903757639 263 stabelized_ = true;
edy05 5:9bc7a51e97ba 264 float newTauR = 0.02;
edy05 4:3f9903757639 265 float newError = (accError_ * tauR_) / newTauR;
edy05 4:3f9903757639 266 accError_ = newError;
edy05 4:3f9903757639 267 tauR_ = newTauR;
edy05 4:3f9903757639 268 }
edy05 4:3f9903757639 269
edy05 3:1a8e62899e55 270 }
aberk 0:6e12a3e5af19 271
aberk 0:6e12a3e5af19 272 //Check and see if the output is pegged at a limit and only
aberk 0:6e12a3e5af19 273 //integrate if it is not. This is to prevent reset-windup.
aberk 0:6e12a3e5af19 274 if (!(prevControllerOutput_ >= 1 && error > 0) && !(prevControllerOutput_ <= 0 && error < 0)) {
aberk 0:6e12a3e5af19 275 accError_ += error;
aberk 0:6e12a3e5af19 276 }
aberk 0:6e12a3e5af19 277
aberk 0:6e12a3e5af19 278 //Compute the current slope of the input signal.
edy05 6:02717c0e74ce 279 float dMeas = (scaledPV - prevProcessVariable_);
edy05 2:b03de6191e60 280
aberk 0:6e12a3e5af19 281 float scaledBias = 0.0;
aberk 0:6e12a3e5af19 282 if (usingFeedForward) {
aberk 0:6e12a3e5af19 283 scaledBias = (bias_ - outMin_) / outSpan_;
aberk 0:6e12a3e5af19 284 }
aberk 0:6e12a3e5af19 285
aberk 0:6e12a3e5af19 286 //Perform the PID calculation.
aberk 0:6e12a3e5af19 287 controllerOutput_ = scaledBias + Kc_ * (error + (tauR_ * accError_) - (tauD_ * dMeas));
edy05 2:b03de6191e60 288
aberk 0:6e12a3e5af19 289
aberk 0:6e12a3e5af19 290 //Make sure the computed output is within output constraints.
aberk 0:6e12a3e5af19 291 if (controllerOutput_ < 0.0) {
aberk 0:6e12a3e5af19 292 controllerOutput_ = 0.0;
aberk 0:6e12a3e5af19 293 } else if (controllerOutput_ > 1.0) {
aberk 0:6e12a3e5af19 294 controllerOutput_ = 1.0;
aberk 0:6e12a3e5af19 295 }
aberk 0:6e12a3e5af19 296
aberk 0:6e12a3e5af19 297 //Remember this output for the windup check next time.
aberk 0:6e12a3e5af19 298 prevControllerOutput_ = controllerOutput_;
edy05 2:b03de6191e60 299
aberk 0:6e12a3e5af19 300 //Remember the input for the derivative calculation next time.
aberk 0:6e12a3e5af19 301 prevProcessVariable_ = scaledPV;
edy05 2:b03de6191e60 302
edy05 2:b03de6191e60 303 //printf("processVariable_ %f\n\r", processVariable_);
edy05 2:b03de6191e60 304 //printf("ScaledPV %f\n\r", scaledPV);
edy05 2:b03de6191e60 305 //printf("setPoint_ %f\n\r", setPoint_);
edy05 2:b03de6191e60 306 //printf("scaledSP %f\n\r", scaledSP);
edy05 2:b03de6191e60 307 //printf("error %f\n\r", error);
edy05 2:b03de6191e60 308 //printf("accError_ %f\n\r", accError_);
edy05 2:b03de6191e60 309 //printf("tSample_ %f\n\r", tSample_);
edy05 2:b03de6191e60 310 //printf("dMeas %f\n\r", dMeas);
edy05 2:b03de6191e60 311 //printf("controller output %f \n\r", controllerOutput_);
edy05 2:b03de6191e60 312 //printf("Kc_ output %f \n\r", Kc_);
edy05 2:b03de6191e60 313 //printf("tauR_ output %f \n\r", tauR_);
edy05 2:b03de6191e60 314 //printf("tauD_ output %f \n\r", tauD_);
edy05 2:b03de6191e60 315 //printf("dMeas output %f \n\r", dMeas);
edy05 2:b03de6191e60 316 //printf("prevControllerOutput_ %f\n\r", prevControllerOutput_);
edy05 2:b03de6191e60 317 //printf("prevProcessVariable_ %f\n\r", prevProcessVariable_);
aberk 0:6e12a3e5af19 318
aberk 0:6e12a3e5af19 319 //Scale the output from percent span back out to a real world number.
aberk 0:6e12a3e5af19 320 return ((controllerOutput_ * outSpan_) + outMin_);
aberk 0:6e12a3e5af19 321
aberk 0:6e12a3e5af19 322 }
aberk 0:6e12a3e5af19 323
edy05 6:02717c0e74ce 324 bool PID::quadStabilized(){
edy05 6:02717c0e74ce 325 return stabelized_;
edy05 6:02717c0e74ce 326 }
edy05 6:02717c0e74ce 327
edy05 7:8ee2f9ba6ac3 328 void PID::setNotStabelized(){
edy05 7:8ee2f9ba6ac3 329 stabelized_ = false;
edy05 7:8ee2f9ba6ac3 330 }
edy05 7:8ee2f9ba6ac3 331
aberk 0:6e12a3e5af19 332 float PID::getInMin() {
aberk 0:6e12a3e5af19 333
aberk 0:6e12a3e5af19 334 return inMin_;
aberk 0:6e12a3e5af19 335
aberk 0:6e12a3e5af19 336 }
aberk 0:6e12a3e5af19 337
aberk 0:6e12a3e5af19 338 float PID::getInMax() {
aberk 0:6e12a3e5af19 339
aberk 0:6e12a3e5af19 340 return inMax_;
aberk 0:6e12a3e5af19 341
aberk 0:6e12a3e5af19 342 }
aberk 0:6e12a3e5af19 343
aberk 0:6e12a3e5af19 344 float PID::getOutMin() {
aberk 0:6e12a3e5af19 345
aberk 0:6e12a3e5af19 346 return outMin_;
aberk 0:6e12a3e5af19 347
aberk 0:6e12a3e5af19 348 }
aberk 0:6e12a3e5af19 349
aberk 0:6e12a3e5af19 350 float PID::getOutMax() {
aberk 0:6e12a3e5af19 351
aberk 0:6e12a3e5af19 352 return outMax_;
aberk 0:6e12a3e5af19 353
aberk 0:6e12a3e5af19 354 }
aberk 0:6e12a3e5af19 355
aberk 0:6e12a3e5af19 356 float PID::getInterval() {
aberk 0:6e12a3e5af19 357
aberk 0:6e12a3e5af19 358 return tSample_;
aberk 0:6e12a3e5af19 359
aberk 0:6e12a3e5af19 360 }
aberk 0:6e12a3e5af19 361
aberk 0:6e12a3e5af19 362 float PID::getPParam() {
aberk 0:6e12a3e5af19 363
aberk 0:6e12a3e5af19 364 return pParam_;
aberk 0:6e12a3e5af19 365
aberk 0:6e12a3e5af19 366 }
aberk 0:6e12a3e5af19 367
aberk 0:6e12a3e5af19 368 float PID::getIParam() {
aberk 0:6e12a3e5af19 369
aberk 0:6e12a3e5af19 370 return iParam_;
aberk 0:6e12a3e5af19 371
aberk 0:6e12a3e5af19 372 }
aberk 0:6e12a3e5af19 373
aberk 0:6e12a3e5af19 374 float PID::getDParam() {
aberk 0:6e12a3e5af19 375
aberk 0:6e12a3e5af19 376 return dParam_;
aberk 0:6e12a3e5af19 377
aberk 0:6e12a3e5af19 378 }