PID结构体
typedef struct{
volatile int SetPoint; //设定目标值 Desired Value
volatile long SumError; //误差累计
volatile double Proportion; //比例常数 Proportional Const
volatile double Integral; //积分常数 Integral Const
volatile double Derivative; //微分常数 Derivative Const
volatile int LastError; //Error[-1]
volatile int PervError; //Error[-2]
}PID;
位置式PID结构体比增量式PID结构体多了一个SumError成员,用于记录当前量与目标值的累积误差,位置式PID是不需要PrevError成员的。
LocPIDCalc函数
unsigned int LocPIDCalc(int NextPoint)
{
int iError;
int dError;
iError = sptr->SetPoint - NextPoint; //偏差
sptr->SumError += iError; //积分
//最好进行积分限幅
dError = iError - sptr->LastError; //微分
sptr->LastError = iError;
return(sptr->Proportion*iError //比例项
+sptr->Integral*sptr->SumError//积分项
+sptr->Derivative*dError); //微分项
}
上述函数是位置式PID算法实现方法。首先求出目标值与当前量的偏差保存在iError变量中,这个偏差量将作为位置式PID运算的比例项因子。把这个偏差值加到PID结构体成员SumError计算累积误差,这个累积误差将作为PID运算的积分项因子。把偏差值减去上次偏差值的结果作为PID运算的微分项因子。
int main(void)
{
count = 当前值;
PWM_Duty = LocPIDCalc(count);
//输出限幅
if(PWM_Duty>899)
PWM_Duty = 899;
return 0;
}