New PID library with digital anti-windup and process control
Fork of PID_modified by
Diff: PID.cpp
- Revision:
- 1:4df4895863cd
- Parent:
- 0:7f9b4ca968ae
- Child:
- 2:b9610a2d2ea0
--- a/PID.cpp Thu Feb 18 04:25:52 2016 +0000 +++ b/PID.cpp Fri Apr 22 09:38:38 2016 +0000 @@ -13,6 +13,7 @@ sampletime = 0.0; Outputlimit_bool = false; Inputlimit_bool = false; + AntiWindUp_bool = false; outputLimits_H = 0.0; outputLimits_L = 0.0; inputLimits_H = 0.0; @@ -20,8 +21,8 @@ feedbackvalue = 0.0; Kp = setKp; - Ki = setKi/setSampletime; - Kd = setKd*setSampletime; + Ki = setKi*setSampletime; + Kd = setKd/setSampletime; sampletime = setSampletime; } @@ -37,6 +38,12 @@ inputLimits_L = setinputLimits_L; } +void PID::EnableAntiWindUp(float Ka_) +{ + AntiWindUp_bool = true; + Ka = Ka_; +} + void PID::Compute(float setreference, float setfeedbackvalue){ if(Inputlimit_bool == true){ @@ -56,14 +63,18 @@ error[2] = error[1]; error[1] = error[0]; - if(Outputlimit_bool == true){ + if(Outputlimit_bool == true && AntiWindUp_bool == true){ if( output >= outputLimits_H){ - output = outputLimits_H; + output = output - (output - outputLimits_H)*Ka; + //output = outputLimits_H; }else if( output <= outputLimits_L){ - output = outputLimits_L; + output =output - (output - outputLimits_L)*Ka; + //output = outputLimits_L; + } }else{ output = output; } -} \ No newline at end of file +} +