void PIDInit (PID *pp)
{
memset ( pp,0,sizeof(PID));
sPID.SetPoint = 0;
sPID.Proportion = 10;
sPID.Integral = 0;
sPID.Derivative = 20;
}
float PIDCalc( PID *pp, float NextPoint )
{
float dError, Error;
if(mode == 1)
{
sPID.Proportion = P_Val;
sPID.Integral = I_Val;
sPID.Derivative = D_Val;
}
if(mode == 0)
{
sPID.Proportion = 10;
sPID.Integral = 0;
sPID.Derivative = 20;
}
sPID.SetPoint = Desired_temp;
Error = pp->SetPoint - NextPoint;
pp->SumError += Error;
dError = pp->LastError - pp->PrevError;
pp->PrevError = pp->LastError;
pp->LastError = Error;
if(pp->SumError>1000) pp->SumError=1000;
else if(pp->SumError<-1000) pp->SumError=-1000;
return (pp->Proportion * Error + pp->Integral * pp->SumError + pp->Derivative * dError);
}
typedef struct PID
{
float SetPoint;
float Proportion;
float Integral;
float Derivative;
float LastError;
float PrevError;
float SumError;
} PID;