|
#include "System_init.h"
extern int U_Set;
extern u16 CCR1_Val;
/*==========================================================================================*/
typedef struct PID {
float SetPoint; // 設(shè)定目標(biāo)Desired value
float Proportion; // 比例常數(shù)Proportional Const
float Integral; // 積分常數(shù)Integral Const
float Derivative; // 微分常數(shù)Derivative Const
float LastError; // Error[-1]
float PrevError; // Error[-2]
float SumError; // Sums of Errors
} PID;
/*====================================================================================================/
PID計(jì)算部分
=====================================================================================================*/
PID vPID={0,0.1,0.001,0.001,0,0,0};
float PIDCalc( PID *pp, float NextPoint )
{
float dError,
Error;
Error = pp->SetPoint - NextPoint; // 偏差
pp->SumError += Error; // 積分
dError = pp->LastError - pp->PrevError; // 當(dāng)前微分
pp->PrevError = pp->LastError;
pp->LastError = Error;
if(pp->SumError>900) pp->SumError=900;
else if(pp->SumError<-900) pp->SumError=-900;
return (pp->Proportion * Error // 比例項(xiàng)
+ pp->Integral * pp->SumError // 積分項(xiàng)
+ pp->Derivative * dError // 微分項(xiàng)
);
}
float Vol(int vSet,int v3){
float vOut; // PID Response (Output)
float vIn; // PID Feedback (Input)
vPID.SetPoint = vSet; // Set PID Setpoint
vIn = (float)v3; // Read Input
vOut = PIDCalc ( &vPID,vIn ); // Perform PID Interation
return vOut;
}
|
|