Proportional, integral, derivative controller library. Ported from the Arduino PID library by Brett Beauregard.

Fork of PID by Aaron Berk

Committer:
zatakon
Date:
Tue Aug 11 13:05:25 2015 +0000
Revision:
1:c67f4f763c45
Parent:
0:6e12a3e5af19
?????????????; ????????????????????; ????????????????????; ????????????????????

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;
zatakon 1:c67f4f763c45 77
zatakon 1:c67f4f763c45 78 for (int i = 0; i < 15; i++ )
zatakon 1:c67f4f763c45 79 accErrorArray[i] = 0;
zatakon 1:c67f4f763c45 80 accPosition = 0;
aberk 0:6e12a3e5af19 81
aberk 0:6e12a3e5af19 82 }
aberk 0:6e12a3e5af19 83
aberk 0:6e12a3e5af19 84 void PID::setInputLimits(float inMin, float inMax) {
aberk 0:6e12a3e5af19 85
aberk 0:6e12a3e5af19 86 //Make sure we haven't been given impossible values.
aberk 0:6e12a3e5af19 87 if (inMin >= inMax) {
aberk 0:6e12a3e5af19 88 return;
aberk 0:6e12a3e5af19 89 }
aberk 0:6e12a3e5af19 90
aberk 0:6e12a3e5af19 91 //Rescale the working variables to reflect the changes.
aberk 0:6e12a3e5af19 92 prevProcessVariable_ *= (inMax - inMin) / inSpan_;
aberk 0:6e12a3e5af19 93 accError_ *= (inMax - inMin) / inSpan_;
aberk 0:6e12a3e5af19 94
aberk 0:6e12a3e5af19 95 //Make sure the working variables are within the new limits.
aberk 0:6e12a3e5af19 96 if (prevProcessVariable_ > 1) {
aberk 0:6e12a3e5af19 97 prevProcessVariable_ = 1;
aberk 0:6e12a3e5af19 98 } else if (prevProcessVariable_ < 0) {
aberk 0:6e12a3e5af19 99 prevProcessVariable_ = 0;
aberk 0:6e12a3e5af19 100 }
aberk 0:6e12a3e5af19 101
aberk 0:6e12a3e5af19 102 inMin_ = inMin;
aberk 0:6e12a3e5af19 103 inMax_ = inMax;
aberk 0:6e12a3e5af19 104 inSpan_ = inMax - inMin;
aberk 0:6e12a3e5af19 105
aberk 0:6e12a3e5af19 106 }
aberk 0:6e12a3e5af19 107
aberk 0:6e12a3e5af19 108 void PID::setOutputLimits(float outMin, float outMax) {
aberk 0:6e12a3e5af19 109
aberk 0:6e12a3e5af19 110 //Make sure we haven't been given impossible values.
aberk 0:6e12a3e5af19 111 if (outMin >= outMax) {
aberk 0:6e12a3e5af19 112 return;
aberk 0:6e12a3e5af19 113 }
aberk 0:6e12a3e5af19 114
aberk 0:6e12a3e5af19 115 //Rescale the working variables to reflect the changes.
aberk 0:6e12a3e5af19 116 prevControllerOutput_ *= (outMax - outMin) / outSpan_;
aberk 0:6e12a3e5af19 117
aberk 0:6e12a3e5af19 118 //Make sure the working variables are within the new limits.
aberk 0:6e12a3e5af19 119 if (prevControllerOutput_ > 1) {
aberk 0:6e12a3e5af19 120 prevControllerOutput_ = 1;
aberk 0:6e12a3e5af19 121 } else if (prevControllerOutput_ < 0) {
aberk 0:6e12a3e5af19 122 prevControllerOutput_ = 0;
aberk 0:6e12a3e5af19 123 }
aberk 0:6e12a3e5af19 124
aberk 0:6e12a3e5af19 125 outMin_ = outMin;
aberk 0:6e12a3e5af19 126 outMax_ = outMax;
aberk 0:6e12a3e5af19 127 outSpan_ = outMax - outMin;
aberk 0:6e12a3e5af19 128
aberk 0:6e12a3e5af19 129 }
aberk 0:6e12a3e5af19 130
aberk 0:6e12a3e5af19 131 void PID::setTunings(float Kc, float tauI, float tauD) {
aberk 0:6e12a3e5af19 132 //Verify that the tunings make sense.
aberk 0:6e12a3e5af19 133 if (Kc == 0.0 || tauI < 0.0 || tauD < 0.0) {
aberk 0:6e12a3e5af19 134 return;
aberk 0:6e12a3e5af19 135 }
aberk 0:6e12a3e5af19 136
zatakon 1:c67f4f763c45 137 //Store raw values to hand back to user on request.
aberk 0:6e12a3e5af19 138 pParam_ = Kc;
aberk 0:6e12a3e5af19 139 iParam_ = tauI;
aberk 0:6e12a3e5af19 140 dParam_ = tauD;
aberk 0:6e12a3e5af19 141
aberk 0:6e12a3e5af19 142 float tempTauR;
aberk 0:6e12a3e5af19 143
aberk 0:6e12a3e5af19 144 if (tauI == 0.0) {
aberk 0:6e12a3e5af19 145 tempTauR = 0.0;
aberk 0:6e12a3e5af19 146 } else {
aberk 0:6e12a3e5af19 147 tempTauR = (1.0 / tauI) * tSample_;
aberk 0:6e12a3e5af19 148 }
aberk 0:6e12a3e5af19 149
aberk 0:6e12a3e5af19 150 //For "bumpless transfer" we need to rescale the accumulated error.
aberk 0:6e12a3e5af19 151 if (inAuto) {
aberk 0:6e12a3e5af19 152 if (tempTauR == 0.0) {
aberk 0:6e12a3e5af19 153 accError_ = 0.0;
aberk 0:6e12a3e5af19 154 } else {
aberk 0:6e12a3e5af19 155 accError_ *= (Kc_ * tauR_) / (Kc * tempTauR);
aberk 0:6e12a3e5af19 156 }
aberk 0:6e12a3e5af19 157 }
aberk 0:6e12a3e5af19 158
aberk 0:6e12a3e5af19 159 Kc_ = Kc;
aberk 0:6e12a3e5af19 160 tauR_ = tempTauR;
aberk 0:6e12a3e5af19 161 tauD_ = tauD / tSample_;
zatakon 1:c67f4f763c45 162 }
aberk 0:6e12a3e5af19 163
zatakon 1:c67f4f763c45 164
zatakon 1:c67f4f763c45 165 void PID::setTunings(int id, float data) {
zatakon 1:c67f4f763c45 166 //Verify that the tunings make sense.
zatakon 1:c67f4f763c45 167 if ((id == 1 && data == 0.0) || data < 0.0) {
zatakon 1:c67f4f763c45 168 return;
zatakon 1:c67f4f763c45 169 }
zatakon 1:c67f4f763c45 170
zatakon 1:c67f4f763c45 171 //Store raw values to hand back to user on request.
zatakon 1:c67f4f763c45 172 switch (id)
zatakon 1:c67f4f763c45 173 {
zatakon 1:c67f4f763c45 174 case 1:
zatakon 1:c67f4f763c45 175 pParam_ = data;
zatakon 1:c67f4f763c45 176 break;
zatakon 1:c67f4f763c45 177 case 2:
zatakon 1:c67f4f763c45 178 iParam_ = data;
zatakon 1:c67f4f763c45 179 break;
zatakon 1:c67f4f763c45 180 case 3:
zatakon 1:c67f4f763c45 181 dParam_ = data;
zatakon 1:c67f4f763c45 182 break;
zatakon 1:c67f4f763c45 183 }
zatakon 1:c67f4f763c45 184
zatakon 1:c67f4f763c45 185 /*
zatakon 1:c67f4f763c45 186 float tempTauR;
zatakon 1:c67f4f763c45 187
zatakon 1:c67f4f763c45 188 if (tauI == 0.0) {
zatakon 1:c67f4f763c45 189 tempTauR = 0.0;
zatakon 1:c67f4f763c45 190 } else {
zatakon 1:c67f4f763c45 191 tempTauR = (1.0 / tauI) * tSample_;
zatakon 1:c67f4f763c45 192 }
zatakon 1:c67f4f763c45 193
zatakon 1:c67f4f763c45 194 //For "bumpless transfer" we need to rescale the accumulated error.
zatakon 1:c67f4f763c45 195 if (inAuto) {
zatakon 1:c67f4f763c45 196 if (tempTauR == 0.0) {
zatakon 1:c67f4f763c45 197 accError_ = 0.0;
zatakon 1:c67f4f763c45 198 } else {
zatakon 1:c67f4f763c45 199 accError_ *= (Kc_ * tauR_) / (Kc * tempTauR);
zatakon 1:c67f4f763c45 200 }
zatakon 1:c67f4f763c45 201 }
zatakon 1:c67f4f763c45 202
zatakon 1:c67f4f763c45 203 Kc_ = Kc;
zatakon 1:c67f4f763c45 204 tauR_ = tempTauR;
zatakon 1:c67f4f763c45 205 tauD_ = tauD / tSample_;
zatakon 1:c67f4f763c45 206 */
aberk 0:6e12a3e5af19 207 }
aberk 0:6e12a3e5af19 208
aberk 0:6e12a3e5af19 209 void PID::reset(void) {
aberk 0:6e12a3e5af19 210
aberk 0:6e12a3e5af19 211 float scaledBias = 0.0;
aberk 0:6e12a3e5af19 212
aberk 0:6e12a3e5af19 213 if (usingFeedForward) {
aberk 0:6e12a3e5af19 214 scaledBias = (bias_ - outMin_) / outSpan_;
aberk 0:6e12a3e5af19 215 } else {
aberk 0:6e12a3e5af19 216 scaledBias = (realOutput_ - outMin_) / outSpan_;
aberk 0:6e12a3e5af19 217 }
aberk 0:6e12a3e5af19 218
aberk 0:6e12a3e5af19 219 prevControllerOutput_ = scaledBias;
aberk 0:6e12a3e5af19 220 prevProcessVariable_ = (processVariable_ - inMin_) / inSpan_;
aberk 0:6e12a3e5af19 221
aberk 0:6e12a3e5af19 222 //Clear any error in the integral.
aberk 0:6e12a3e5af19 223 accError_ = 0;
aberk 0:6e12a3e5af19 224
aberk 0:6e12a3e5af19 225 }
aberk 0:6e12a3e5af19 226
aberk 0:6e12a3e5af19 227 void PID::setMode(int mode) {
aberk 0:6e12a3e5af19 228
aberk 0:6e12a3e5af19 229 //We were in manual, and we just got set to auto.
aberk 0:6e12a3e5af19 230 //Reset the controller internals.
aberk 0:6e12a3e5af19 231 if (mode != 0 && !inAuto) {
aberk 0:6e12a3e5af19 232 reset();
aberk 0:6e12a3e5af19 233 }
aberk 0:6e12a3e5af19 234
aberk 0:6e12a3e5af19 235 inAuto = (mode != 0);
aberk 0:6e12a3e5af19 236
aberk 0:6e12a3e5af19 237 }
aberk 0:6e12a3e5af19 238
aberk 0:6e12a3e5af19 239 void PID::setInterval(float interval) {
aberk 0:6e12a3e5af19 240
aberk 0:6e12a3e5af19 241 if (interval > 0) {
aberk 0:6e12a3e5af19 242 //Convert the time-based tunings to reflect this change.
aberk 0:6e12a3e5af19 243 tauR_ *= (interval / tSample_);
aberk 0:6e12a3e5af19 244 accError_ *= (tSample_ / interval);
aberk 0:6e12a3e5af19 245 tauD_ *= (interval / tSample_);
aberk 0:6e12a3e5af19 246 tSample_ = interval;
aberk 0:6e12a3e5af19 247 }
aberk 0:6e12a3e5af19 248
aberk 0:6e12a3e5af19 249 }
aberk 0:6e12a3e5af19 250
aberk 0:6e12a3e5af19 251 void PID::setSetPoint(float sp) {
aberk 0:6e12a3e5af19 252
aberk 0:6e12a3e5af19 253 setPoint_ = sp;
aberk 0:6e12a3e5af19 254
aberk 0:6e12a3e5af19 255 }
aberk 0:6e12a3e5af19 256
aberk 0:6e12a3e5af19 257 void PID::setProcessValue(float pv) {
aberk 0:6e12a3e5af19 258
aberk 0:6e12a3e5af19 259 processVariable_ = pv;
aberk 0:6e12a3e5af19 260
aberk 0:6e12a3e5af19 261 }
aberk 0:6e12a3e5af19 262
aberk 0:6e12a3e5af19 263 void PID::setBias(float bias){
aberk 0:6e12a3e5af19 264
aberk 0:6e12a3e5af19 265 bias_ = bias;
aberk 0:6e12a3e5af19 266 usingFeedForward = 1;
aberk 0:6e12a3e5af19 267
aberk 0:6e12a3e5af19 268 }
aberk 0:6e12a3e5af19 269
aberk 0:6e12a3e5af19 270 float PID::compute() {
aberk 0:6e12a3e5af19 271
aberk 0:6e12a3e5af19 272 //Pull in the input and setpoint, and scale them into percent span.
aberk 0:6e12a3e5af19 273 float scaledPV = (processVariable_ - inMin_) / inSpan_;
aberk 0:6e12a3e5af19 274
aberk 0:6e12a3e5af19 275 if (scaledPV > 1.0) {
aberk 0:6e12a3e5af19 276 scaledPV = 1.0;
aberk 0:6e12a3e5af19 277 } else if (scaledPV < 0.0) {
aberk 0:6e12a3e5af19 278 scaledPV = 0.0;
aberk 0:6e12a3e5af19 279 }
aberk 0:6e12a3e5af19 280
aberk 0:6e12a3e5af19 281 float scaledSP = (setPoint_ - inMin_) / inSpan_;
aberk 0:6e12a3e5af19 282 if (scaledSP > 1.0) {
aberk 0:6e12a3e5af19 283 scaledSP = 1;
aberk 0:6e12a3e5af19 284 } else if (scaledSP < 0.0) {
aberk 0:6e12a3e5af19 285 scaledSP = 0;
aberk 0:6e12a3e5af19 286 }
aberk 0:6e12a3e5af19 287
aberk 0:6e12a3e5af19 288 float error = scaledSP - scaledPV;
aberk 0:6e12a3e5af19 289
aberk 0:6e12a3e5af19 290 //Check and see if the output is pegged at a limit and only
aberk 0:6e12a3e5af19 291 //integrate if it is not. This is to prevent reset-windup.
aberk 0:6e12a3e5af19 292 if (!(prevControllerOutput_ >= 1 && error > 0) && !(prevControllerOutput_ <= 0 && error < 0)) {
zatakon 1:c67f4f763c45 293 accPosition = ( accPosition == 49 ) ? 0 : accPosition + 1;
zatakon 1:c67f4f763c45 294 accErrorArray[accPosition] = error;
zatakon 1:c67f4f763c45 295 accError_ = 0;
zatakon 1:c67f4f763c45 296 for (int i = 0; i < 50; i++)
zatakon 1:c67f4f763c45 297 accError_ += accErrorArray[i] * tSample_;
aberk 0:6e12a3e5af19 298 }
aberk 0:6e12a3e5af19 299
aberk 0:6e12a3e5af19 300 //Compute the current slope of the input signal.
aberk 0:6e12a3e5af19 301 float dMeas = (scaledPV - prevProcessVariable_) / tSample_;
aberk 0:6e12a3e5af19 302
aberk 0:6e12a3e5af19 303 float scaledBias = 0.0;
aberk 0:6e12a3e5af19 304
aberk 0:6e12a3e5af19 305 if (usingFeedForward) {
aberk 0:6e12a3e5af19 306 scaledBias = (bias_ - outMin_) / outSpan_;
aberk 0:6e12a3e5af19 307 }
aberk 0:6e12a3e5af19 308
aberk 0:6e12a3e5af19 309 //Perform the PID calculation.
aberk 0:6e12a3e5af19 310 controllerOutput_ = scaledBias + Kc_ * (error + (tauR_ * accError_) - (tauD_ * dMeas));
aberk 0:6e12a3e5af19 311
aberk 0:6e12a3e5af19 312 //Make sure the computed output is within output constraints.
aberk 0:6e12a3e5af19 313 if (controllerOutput_ < 0.0) {
aberk 0:6e12a3e5af19 314 controllerOutput_ = 0.0;
aberk 0:6e12a3e5af19 315 } else if (controllerOutput_ > 1.0) {
aberk 0:6e12a3e5af19 316 controllerOutput_ = 1.0;
aberk 0:6e12a3e5af19 317 }
aberk 0:6e12a3e5af19 318
zatakon 1:c67f4f763c45 319 if (controllerOutput_ - prevControllerOutput_ > 0.1)
zatakon 1:c67f4f763c45 320 controllerOutput_ = prevControllerOutput_ + 0.1;
zatakon 1:c67f4f763c45 321 else if ( prevControllerOutput_ - controllerOutput_ > 0.1)
zatakon 1:c67f4f763c45 322 controllerOutput_ = prevControllerOutput_ - 0.1;
zatakon 1:c67f4f763c45 323
aberk 0:6e12a3e5af19 324 //Remember this output for the windup check next time.
aberk 0:6e12a3e5af19 325 prevControllerOutput_ = controllerOutput_;
aberk 0:6e12a3e5af19 326 //Remember the input for the derivative calculation next time.
aberk 0:6e12a3e5af19 327 prevProcessVariable_ = scaledPV;
aberk 0:6e12a3e5af19 328
aberk 0:6e12a3e5af19 329 //Scale the output from percent span back out to a real world number.
aberk 0:6e12a3e5af19 330 return ((controllerOutput_ * outSpan_) + outMin_);
aberk 0:6e12a3e5af19 331
aberk 0:6e12a3e5af19 332 }
aberk 0:6e12a3e5af19 333
aberk 0:6e12a3e5af19 334 float PID::getInMin() {
aberk 0:6e12a3e5af19 335
aberk 0:6e12a3e5af19 336 return inMin_;
aberk 0:6e12a3e5af19 337
aberk 0:6e12a3e5af19 338 }
aberk 0:6e12a3e5af19 339
aberk 0:6e12a3e5af19 340 float PID::getInMax() {
aberk 0:6e12a3e5af19 341
aberk 0:6e12a3e5af19 342 return inMax_;
aberk 0:6e12a3e5af19 343
aberk 0:6e12a3e5af19 344 }
aberk 0:6e12a3e5af19 345
aberk 0:6e12a3e5af19 346 float PID::getOutMin() {
aberk 0:6e12a3e5af19 347
aberk 0:6e12a3e5af19 348 return outMin_;
aberk 0:6e12a3e5af19 349
aberk 0:6e12a3e5af19 350 }
aberk 0:6e12a3e5af19 351
aberk 0:6e12a3e5af19 352 float PID::getOutMax() {
aberk 0:6e12a3e5af19 353
aberk 0:6e12a3e5af19 354 return outMax_;
aberk 0:6e12a3e5af19 355
aberk 0:6e12a3e5af19 356 }
aberk 0:6e12a3e5af19 357
aberk 0:6e12a3e5af19 358 float PID::getInterval() {
aberk 0:6e12a3e5af19 359
aberk 0:6e12a3e5af19 360 return tSample_;
aberk 0:6e12a3e5af19 361
aberk 0:6e12a3e5af19 362 }
aberk 0:6e12a3e5af19 363
aberk 0:6e12a3e5af19 364 float PID::getPParam() {
aberk 0:6e12a3e5af19 365
aberk 0:6e12a3e5af19 366 return pParam_;
aberk 0:6e12a3e5af19 367
aberk 0:6e12a3e5af19 368 }
aberk 0:6e12a3e5af19 369
aberk 0:6e12a3e5af19 370 float PID::getIParam() {
aberk 0:6e12a3e5af19 371
aberk 0:6e12a3e5af19 372 return iParam_;
aberk 0:6e12a3e5af19 373
aberk 0:6e12a3e5af19 374 }
aberk 0:6e12a3e5af19 375
aberk 0:6e12a3e5af19 376 float PID::getDParam() {
aberk 0:6e12a3e5af19 377
aberk 0:6e12a3e5af19 378 return dParam_;
aberk 0:6e12a3e5af19 379
aberk 0:6e12a3e5af19 380 }