a quadcopter code
Dependencies: Pulse RangeFinder mbed
Diff: PID.cpp
- Revision:
- 0:4a55d0a21ea9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PID.cpp Tue Nov 24 19:57:06 2015 +0000 @@ -0,0 +1,103 @@ +#include <PID.h> +#include <stdlib.h> +#include <math.h> +/*Constructor (...)********************************************************* + * The parameters specified here are those for for which we can't set up + * reliable defaults, so we need to have the user set them. + ***************************************************************************/ +PID::PID(float* Input, float* Output, float* Setpoint, + float Kp, float Ki, float Kd) +{ + + myOutput = Output; + myInput = Input; + mySetpoint = Setpoint; + + + PID::SetOutputLimits(-1000,1000); //default output limit corresponds to + //the arduino pwm limits + PID::SetTunings(Kp, Ki, Kd); + //PID::SetIntegratorLimits(399); + + + +} + + +/* Compute() ********************************************************************** + * This, as they say, is where the magic happens. this function should be called + * every time "void loop()" executes. the function will decide for itself whether a new + * pid Output needs to be computed. returns true when the output is computed, + * false when nothing has been done. + **********************************************************************************/ +void PID::Compute() +{ + + float input = *myInput; + float error =(*mySetpoint)-input; + + ITerm+= (error+lasterror)/2; + /* + if(!ki==0){ + + if(ITerm < (-abs(max/ki))){ + ITerm= (-abs(max/ki)); + } + else if(ITerm > abs(max/ki)){ + ITerm= abs(max/ki); + } + } + */ + float dInput = (error - lasterror); + + + /*Compute PID Output*/ + float output = (kp * error )+(ki * (ITerm))+(kd * (dInput)); + if(output > outMax) output = outMax; + else if(output < outMin) output = outMin; + *myOutput =output; + + /*Remember some variables for next time*/ + lasterror=error; + + +} + + +/* SetTunings(...)************************************************************* + * This function allows the controller's dynamic performance to be adjusted. + * it's called automatically from the constructor, but tunings can also + * be adjusted on the fly during normal operation + ******************************************************************************/ +void PID::SetTunings(float Kp, float Ki, float Kd) +{ + kp = Kp; + ki = Ki; + kd = Kd; +//lasterror=0; +//ITerm=0; + +} + +/* SetOutputLimits(...)**************************************************** + * This function will be used far more often than SetInputLimits. while + * the input to the controller will generally be in the 0-1023 range (which is + * the default already,) the output will be a little different. maybe they'll + * be doing a time window and will need 0-8000 or something. or maybe they'll + * want to clamp it from 0-125. who knows. at any rate, that can all be done + * here. + **************************************************************************/ +void PID::SetOutputLimits(float Min, float Max) +{ + if(Min >= Max) return; + outMin = Min; + outMax = Max; + + } +/****************SetIntegratorLimits**********/ +void PID::SetIntegratorLimits(float Max) +{ +max=Max; +} + +