copia12092018

Dependencies:   mbed

Committer:
root@developer-sjc-indigo-compiler.local.mbed.org
Date:
Fri Nov 16 10:55:45 2018 +0000
Revision:
13:4d6114864f2d
Parent:
0:b0a79a3a9da8
Added tag fine for changeset dde73cf20353

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nerit 0:b0a79a3a9da8 1 /**
nerit 0:b0a79a3a9da8 2 * @author Aaron Berk
nerit 0:b0a79a3a9da8 3 *
nerit 0:b0a79a3a9da8 4 * @section LICENSE
nerit 0:b0a79a3a9da8 5 *
nerit 0:b0a79a3a9da8 6 * Copyright (c) 2010 ARM Limited
nerit 0:b0a79a3a9da8 7 *
nerit 0:b0a79a3a9da8 8 * Permission is hereby granted, free of charge, to any person obtaining a copy
nerit 0:b0a79a3a9da8 9 * of this software and associated documentation files (the "Software"), to deal
nerit 0:b0a79a3a9da8 10 * in the Software without restriction, including without limitation the rights
nerit 0:b0a79a3a9da8 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
nerit 0:b0a79a3a9da8 12 * copies of the Software, and to permit persons to whom the Software is
nerit 0:b0a79a3a9da8 13 * furnished to do so, subject to the following conditions:
nerit 0:b0a79a3a9da8 14 *
nerit 0:b0a79a3a9da8 15 * The above copyright notice and this permission notice shall be included in
nerit 0:b0a79a3a9da8 16 * all copies or substantial portions of the Software.
nerit 0:b0a79a3a9da8 17 *
nerit 0:b0a79a3a9da8 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
nerit 0:b0a79a3a9da8 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
nerit 0:b0a79a3a9da8 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
nerit 0:b0a79a3a9da8 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
nerit 0:b0a79a3a9da8 22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
nerit 0:b0a79a3a9da8 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
nerit 0:b0a79a3a9da8 24 * THE SOFTWARE.
nerit 0:b0a79a3a9da8 25 *
nerit 0:b0a79a3a9da8 26 * @section DESCRIPTION
nerit 0:b0a79a3a9da8 27 *
nerit 0:b0a79a3a9da8 28 * A PID controller is a widely used feedback controller commonly found in
nerit 0:b0a79a3a9da8 29 * industry.
nerit 0:b0a79a3a9da8 30 *
nerit 0:b0a79a3a9da8 31 * This library is a port of Brett Beauregard's Arduino PID library:
nerit 0:b0a79a3a9da8 32 *
nerit 0:b0a79a3a9da8 33 * http://www.arduino.cc/playground/Code/PIDLibrary
nerit 0:b0a79a3a9da8 34 *
nerit 0:b0a79a3a9da8 35 * The wikipedia article on PID controllers is a good place to start on
nerit 0:b0a79a3a9da8 36 * understanding how they work:
nerit 0:b0a79a3a9da8 37 *
nerit 0:b0a79a3a9da8 38 * http://en.wikipedia.org/wiki/PID_controller
nerit 0:b0a79a3a9da8 39 *
nerit 0:b0a79a3a9da8 40 * For a clear and elegant explanation of how to implement and tune a
nerit 0:b0a79a3a9da8 41 * controller, the controlguru website by Douglas J. Cooper (who also happened
nerit 0:b0a79a3a9da8 42 * to be Brett's controls professor) is an excellent reference:
nerit 0:b0a79a3a9da8 43 *
nerit 0:b0a79a3a9da8 44 * http://www.controlguru.com/
nerit 0:b0a79a3a9da8 45 */
nerit 0:b0a79a3a9da8 46
nerit 0:b0a79a3a9da8 47 #ifndef PID_H
nerit 0:b0a79a3a9da8 48 #define PID_H
nerit 0:b0a79a3a9da8 49
nerit 0:b0a79a3a9da8 50 /**
nerit 0:b0a79a3a9da8 51 * Includes
nerit 0:b0a79a3a9da8 52 */
nerit 0:b0a79a3a9da8 53 #include "mbed.h"
nerit 0:b0a79a3a9da8 54
nerit 0:b0a79a3a9da8 55 /**
nerit 0:b0a79a3a9da8 56 * Defines
nerit 0:b0a79a3a9da8 57 */
nerit 0:b0a79a3a9da8 58 #define MANUAL_MODE 0
nerit 0:b0a79a3a9da8 59 #define AUTO_MODE 1
nerit 0:b0a79a3a9da8 60
nerit 0:b0a79a3a9da8 61 /**
nerit 0:b0a79a3a9da8 62 * Proportional-integral-derivative controller.
nerit 0:b0a79a3a9da8 63 */
nerit 0:b0a79a3a9da8 64 class PID {
nerit 0:b0a79a3a9da8 65
nerit 0:b0a79a3a9da8 66 public:
nerit 0:b0a79a3a9da8 67
nerit 0:b0a79a3a9da8 68 /**
nerit 0:b0a79a3a9da8 69 * Constructor.
nerit 0:b0a79a3a9da8 70 *
nerit 0:b0a79a3a9da8 71 * Sets default limits [0-3.3V], calculates tuning parameters, and sets
nerit 0:b0a79a3a9da8 72 * manual mode with no bias.
nerit 0:b0a79a3a9da8 73 *
nerit 0:b0a79a3a9da8 74 * @param Kc - Tuning parameter
nerit 0:b0a79a3a9da8 75 * @param tauI - Tuning parameter
nerit 0:b0a79a3a9da8 76 * @param tauD - Tuning parameter
nerit 0:b0a79a3a9da8 77 * @param interval PID calculation performed every interval seconds.
nerit 0:b0a79a3a9da8 78 */
nerit 0:b0a79a3a9da8 79 PID(float Kc, float tauI, float tauD, float interval);
nerit 0:b0a79a3a9da8 80
nerit 0:b0a79a3a9da8 81 /**
nerit 0:b0a79a3a9da8 82 * Scale from inputs to 0-100%.
nerit 0:b0a79a3a9da8 83 *
nerit 0:b0a79a3a9da8 84 * @param InMin The real world value corresponding to 0%.
nerit 0:b0a79a3a9da8 85 * @param InMax The real world value corresponding to 100%.
nerit 0:b0a79a3a9da8 86 */
nerit 0:b0a79a3a9da8 87 void setInputLimits(float inMin , float inMax);
nerit 0:b0a79a3a9da8 88
nerit 0:b0a79a3a9da8 89 /**
nerit 0:b0a79a3a9da8 90 * Scale from outputs to 0-100%.
nerit 0:b0a79a3a9da8 91 *
nerit 0:b0a79a3a9da8 92 * @param outMin The real world value corresponding to 0%.
nerit 0:b0a79a3a9da8 93 * @param outMax The real world value corresponding to 100%.
nerit 0:b0a79a3a9da8 94 */
nerit 0:b0a79a3a9da8 95 void setOutputLimits(float outMin, float outMax);
nerit 0:b0a79a3a9da8 96
nerit 0:b0a79a3a9da8 97 /**
nerit 0:b0a79a3a9da8 98 * Calculate PID constants.
nerit 0:b0a79a3a9da8 99 *
nerit 0:b0a79a3a9da8 100 * Allows parameters to be changed on the fly without ruining calculations.
nerit 0:b0a79a3a9da8 101 *
nerit 0:b0a79a3a9da8 102 * @param Kc - Tuning parameter
nerit 0:b0a79a3a9da8 103 * @param tauI - Tuning parameter
nerit 0:b0a79a3a9da8 104 * @param tauD - Tuning parameter
nerit 0:b0a79a3a9da8 105 */
nerit 0:b0a79a3a9da8 106 void setTunings(float Kc, float tauI, float tauD);
nerit 0:b0a79a3a9da8 107
nerit 0:b0a79a3a9da8 108 /**
nerit 0:b0a79a3a9da8 109 * Reinitializes controller internals. Automatically
nerit 0:b0a79a3a9da8 110 * called on a manual to auto transition.
nerit 0:b0a79a3a9da8 111 */
nerit 0:b0a79a3a9da8 112 void reset(void);
nerit 0:b0a79a3a9da8 113
nerit 0:b0a79a3a9da8 114 /**
nerit 0:b0a79a3a9da8 115 * Set PID to manual or auto mode.
nerit 0:b0a79a3a9da8 116 *
nerit 0:b0a79a3a9da8 117 * @param mode 0 -> Manual
nerit 0:b0a79a3a9da8 118 * Non-zero -> Auto
nerit 0:b0a79a3a9da8 119 */
nerit 0:b0a79a3a9da8 120 void setMode(int mode);
nerit 0:b0a79a3a9da8 121
nerit 0:b0a79a3a9da8 122 /**
nerit 0:b0a79a3a9da8 123 * Set how fast the PID loop is run.
nerit 0:b0a79a3a9da8 124 *
nerit 0:b0a79a3a9da8 125 * @param interval PID calculation peformed every interval seconds.
nerit 0:b0a79a3a9da8 126 */
nerit 0:b0a79a3a9da8 127 void setInterval(float interval);
nerit 0:b0a79a3a9da8 128
nerit 0:b0a79a3a9da8 129 /**
nerit 0:b0a79a3a9da8 130 * Set the set point.
nerit 0:b0a79a3a9da8 131 *
nerit 0:b0a79a3a9da8 132 * @param sp The set point as a real world value.
nerit 0:b0a79a3a9da8 133 */
nerit 0:b0a79a3a9da8 134 void setSetPoint(float sp);
nerit 0:b0a79a3a9da8 135
nerit 0:b0a79a3a9da8 136 /**
nerit 0:b0a79a3a9da8 137 * Set the process value.
nerit 0:b0a79a3a9da8 138 *
nerit 0:b0a79a3a9da8 139 * @param pv The process value as a real world value.
nerit 0:b0a79a3a9da8 140 */
nerit 0:b0a79a3a9da8 141 void setProcessValue(float pv);
nerit 0:b0a79a3a9da8 142
nerit 0:b0a79a3a9da8 143 /**
nerit 0:b0a79a3a9da8 144 * Set the bias.
nerit 0:b0a79a3a9da8 145 *
nerit 0:b0a79a3a9da8 146 * @param bias The bias for the controller output.
nerit 0:b0a79a3a9da8 147 */
nerit 0:b0a79a3a9da8 148 void setBias(float bias);
nerit 0:b0a79a3a9da8 149
nerit 0:b0a79a3a9da8 150 /**
nerit 0:b0a79a3a9da8 151 * PID calculation.
nerit 0:b0a79a3a9da8 152 *
nerit 0:b0a79a3a9da8 153 * @return The controller output as a float between outMin and outMax.
nerit 0:b0a79a3a9da8 154 */
nerit 0:b0a79a3a9da8 155 float compute(void);
nerit 0:b0a79a3a9da8 156
nerit 0:b0a79a3a9da8 157 //Getters.
nerit 0:b0a79a3a9da8 158 float getInMin();
nerit 0:b0a79a3a9da8 159 float getInMax();
nerit 0:b0a79a3a9da8 160 float getOutMin();
nerit 0:b0a79a3a9da8 161 float getOutMax();
nerit 0:b0a79a3a9da8 162 float getInterval();
nerit 0:b0a79a3a9da8 163 float getPParam();
nerit 0:b0a79a3a9da8 164 float getIParam();
nerit 0:b0a79a3a9da8 165 float getDParam();
nerit 0:b0a79a3a9da8 166
nerit 0:b0a79a3a9da8 167 private:
nerit 0:b0a79a3a9da8 168
nerit 0:b0a79a3a9da8 169 bool usingFeedForward;
nerit 0:b0a79a3a9da8 170 bool inAuto;
nerit 0:b0a79a3a9da8 171
nerit 0:b0a79a3a9da8 172 //Actual tuning parameters used in PID calculation.
nerit 0:b0a79a3a9da8 173 float Kc_;
nerit 0:b0a79a3a9da8 174 float tauR_;
nerit 0:b0a79a3a9da8 175 float tauD_;
nerit 0:b0a79a3a9da8 176
nerit 0:b0a79a3a9da8 177 //Raw tuning parameters.
nerit 0:b0a79a3a9da8 178 float pParam_;
nerit 0:b0a79a3a9da8 179 float iParam_;
nerit 0:b0a79a3a9da8 180 float dParam_;
nerit 0:b0a79a3a9da8 181
nerit 0:b0a79a3a9da8 182 //The point we want to reach.
nerit 0:b0a79a3a9da8 183 float setPoint_;
nerit 0:b0a79a3a9da8 184 //The thing we measure.
nerit 0:b0a79a3a9da8 185 float processVariable_;
nerit 0:b0a79a3a9da8 186 float prevProcessVariable_;
nerit 0:b0a79a3a9da8 187 //The output that affects the process variable.
nerit 0:b0a79a3a9da8 188 float controllerOutput_;
nerit 0:b0a79a3a9da8 189 float prevControllerOutput_;
nerit 0:b0a79a3a9da8 190
nerit 0:b0a79a3a9da8 191 //We work in % for calculations so these will scale from
nerit 0:b0a79a3a9da8 192 //real world values to 0-100% and back again.
nerit 0:b0a79a3a9da8 193 float inMin_;
nerit 0:b0a79a3a9da8 194 float inMax_;
nerit 0:b0a79a3a9da8 195 float inSpan_;
nerit 0:b0a79a3a9da8 196 float outMin_;
nerit 0:b0a79a3a9da8 197 float outMax_;
nerit 0:b0a79a3a9da8 198 float outSpan_;
nerit 0:b0a79a3a9da8 199
nerit 0:b0a79a3a9da8 200 //The accumulated error, i.e. integral.
nerit 0:b0a79a3a9da8 201 float accError_;
nerit 0:b0a79a3a9da8 202 //The controller output bias.
nerit 0:b0a79a3a9da8 203 float bias_;
nerit 0:b0a79a3a9da8 204
nerit 0:b0a79a3a9da8 205 //The interval between samples.
nerit 0:b0a79a3a9da8 206 float tSample_;
nerit 0:b0a79a3a9da8 207
nerit 0:b0a79a3a9da8 208 //Controller output as a real world value.
nerit 0:b0a79a3a9da8 209 volatile float realOutput_;
nerit 0:b0a79a3a9da8 210
nerit 0:b0a79a3a9da8 211 };
nerit 0:b0a79a3a9da8 212
nerit 0:b0a79a3a9da8 213 #endif /* PID_H */