Fabien Lepoutre / Mbed 2 deprecated PID

Dependencies:   mbed

Committer:
fabienlepoutre
Date:
Mon Feb 06 16:07:15 2012 +0000
Revision:
1:272a4f7a8f56
Parent:
0:d5568d657b0c

        

Who changed what in which revision?

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