Eurobot2012_Secondary

Fork of Eurobot_2012_Secondary by Shuto Naruse

Committer:
narshu
Date:
Wed Oct 17 22:25:31 2012 +0000
Revision:
1:cc2a9eb0bd55
Commit before publishing

Who changed what in which revision?

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