Listing 2: The CalculateGain function


double PidControl::CalculateGain( double position )
{
    double error = Setpoint - position;
    ErrorSum += error;
    ProportionalGain = KProportional * error;
    IntegralGain = KIntegral * ErrorSum;
    if( fabs( IntegralGain ) > IntegralLimit ) {
       if( IntegralGain > 0 )
           IntegralGain = IntegralLimit;
       else
           IntegralGain = -IntegralLimit;
       ErrorSum -= error;
       }
    if( ++DifferentialCycleCount >= DifferentialCycle ) {
       DifferentialGain =  KDifferential * ( error - LastError );
       DifferentialCycleCount = 0;
       }
    LastError = error;
    Gain = ProportionalGain + IntegralGain + DifferentialGain;
    return Gain;
}
//End of File