Buggy bois / Mbed 2 deprecated WORKING_TRIAL

Dependencies:   mbed

Committer:
mazdo25
Date:
Sun Mar 03 00:55:10 2019 +0000
Revision:
2:730ccfbf08d5
buggy project;

Who changed what in which revision?

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