#include "PID.h"
typedef struct _pid {
signed long vi_Ref; //PID 设定值
signed long vi_FeedBack; //PID 测量值
signed long vi_PreError; // e(k-1)
signed long vi_PreDerrror; // e(k-1)-e(k-2)
int v_Kp; //比例系数
int V_Ki; //积分常数
int v_Kd; //微分常数
signed long vl_PreU; //PID 算法输出值, 以此来设定 PWM 波
} PID;
void PIDInit () //PID 初始化
{
sPID.vi_Ref = 0 ; //设定值
sPID.vi_FeedBack = 0 ; //测量值,相减可得 e(k)
sPID.vi_PreError = 0 ; //e(k-1)
sPID.vi_PreDerror = 0 ; //e(k-1)-e(k-2)
sPID.v_Kp = VV_KPVALUE;
sPID.v_Ki = VV_KIVALUE;
sPID.v_Kd = VV_KDVALUE;
sPID.vl_PreU = 0;
}
signed long v_PIDCalc( PID *pp )
{
signed longerror,d_error,dd_error; //相当于公式中的 e(k),e(k)-e(k-1),e(k-1)-e(k-2)
error = (signed long)(pp->vi_Ref - pp->vi_FeedBack); //求 e(k)
d_error = error - pp->vi_PreError; //求 e(k)-e(k-1)
dd_error = d_error - pp->vi_PreDerror; //求{e(k)-e(k-1)}-{e(k-1)-e(k-2)}
pp->vi_PreError = error; //保存当前 e(k)
pp->vi_PreDerror = d_error; //保存这次的 e(k)-e(k-1)
/*-------if(error < VV_DEADLINE && error >0 )pp->vl_PreU+=6;
else if(error > -VV_DEADLINE)pp->vl_PreU-=6;
else
评论5