Hello

PID.cpp

Committer:
ChengHan
Date:
2018-11-22
Revision:
0:004c04a30fce

File content as of revision 0:004c04a30fce:

#include "PID.h"

PID::PID(float setKp, float setKi, float setKd,  float setSampletime){
    
    Kp = 0.0;
    Ki = 0.0;
    Kd = 0.0;
    error[0] = 0.0;
    error[1] = 0.0;
    error[2] = 0.0;
    output = 0.0;
    reference = 0.0;
    sampletime = 0.0;
    Outputlimit_bool = false;
    Inputlimit_bool = false;
    AntiWindUp_bool = false;
    outputLimits_H = 0.0;
    outputLimits_L = 0.0;
    inputLimits_H = 0.0;
    inputLimits_L = 0.0; 
    feedbackvalue = 0.0;   
    
    Kp = setKp;
    Ki = setKi*setSampletime;
    Kd = setKd/setSampletime;
    sampletime = setSampletime;   
}

void PID::SetOutputLimits(float setoutputLimits_H, float setoutputLimits_L){
    Outputlimit_bool = true;
    outputLimits_H = setoutputLimits_H;
    outputLimits_L = setoutputLimits_L;    
}

void PID::SetInputLimits(float setinputLimits_H, float setinputLimits_L){
    Inputlimit_bool = true;
    inputLimits_H = setinputLimits_H;
    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){
        if( setreference >= inputLimits_H){
            reference = inputLimits_H;
        }else if( setreference <= inputLimits_L){
            reference = inputLimits_L;
        }
    }else{
        reference = setreference;
    }
    
    feedbackvalue = setfeedbackvalue;
    
    error[0] = reference - feedbackvalue;
    output = output + ( Kp + Ki + Kd )*error[0] + ( -Kp - 2.0*Kd )*error[1] + Kd*error[2];
    error[2] = error[1];
    error[1] = error[0];    
    
    if(Outputlimit_bool == true && AntiWindUp_bool == true){
        if( output >= outputLimits_H){
            output = output - (output - outputLimits_H)*Ka;
            //output = outputLimits_H;
        }else if( output <= outputLimits_L){
            output =output - (output - outputLimits_L)*Ka;
            //output = outputLimits_L;
            
        }
    }else{
        output = output;
    }
            
}