1.不完全微分PID控制算法框图
2.不完全微分PID控制算法公式
3.不完全微分PID控制公式用C语言实现
微分先行的PID算法实现,包括位置型和增量型两种实现方式。
(1)位置型
void PIDRegulation(PID *vPID, float processValue)
{
float thisError;
float thisDev;
thisError=vPID->setpoint-processValue;
vPID->integral+=thisError;
thisDev= vPID->derivativegain*(1- vPID-> alpha)*(thisError-vPID->lasterror)+ vPID-> alpha* vPID-> lastdev;
vPID->result=vPID->proportiongain*thisError+vPID->integralgain*vPID->integral+ thisDev;
vPID->lasterror=thisError;
vPID->lastdev = thisDev;
}
/*定义结构体和公用体*/
typedef struct
{
float setpoint; //设定值
float proportiongain; //比例系数
float integralgain; //积分系数
float derivativegain; //微分系数
float lasterror; //前一拍偏差
float lastdev; //前一拍时的微分项值
float alpha; //不完全微分系数
float result; //输出值
float integral; //积分值
}PID;
(2)增量型
void PIDRegulation(PID *vPID, float processValue)
{
float thisError;
float increment;
float deltaDev;
float pError,dError,iError;
thisError=vPID->setpoint-processValue; //得到偏差值
pError=thisError-vPID->lasterror;
iError=thisError;
dError=thisError-2*(vPID->lasterror)+vPID->preerror;
deltaDev= vPID->derivativegain*(1- vPID-> alpha)*dError+ vPID-> alpha* vPID-> lastdeltadev;
increment=vPID->proportiongain*pError+vPID->integralgain*iError+ deltaDev; //增量计算
vPID->preerror=vPID->lasterror; //存放偏差用于下次运算
vPID->lasterror=thisError;
vPID-> lastdeltadev = deltaDev;
vPID->result+=increment;
}
/*定义结构体和公用体*/
typedef struct
{
float setpoint; //设定值
float proportiongain; //比例系数
float integralgain; //积分系数
float derivativegain; //微分系数
float lasterror; //前一拍偏差
float preerror; //前两拍偏差
float lastdeltadev; //前一拍时的微分项增量
float alpha; //不完全微分系数
float deadband; //死区
float result; //输出值
}PID;
虽然微分项可以提高控制系统的达到稳态的速度,但是高频干扰信号将会对系统影响比较大,从而影响 PID 对系统的调节效果。为了避免高频信号的干扰,又要保留微分环节的作用,在PID控制器的微分环节加入低通滤波器,构成不完全微分 PID 控制器。该控制器可以对微分信号进行过滤,消除高频信号干扰。