#define DEAD_BAND 50//死区控制值
#define PID_OUT_MAX 200 //PID输出上限
#define PID_OUT_MAX 200 //PID输出上限
#include "math.h"
//PID结构体
typedef struct
{
volatile float Proportion; // 比例常数 Proportional Const
volatile float Integral; // 积分常数 Integral Const
volatile float Derivative; // 微分常数 Derivative Const
volatile int Error1; // Error[n-1]
volatile int Error2; // Error[n-2]
volatile int iError; // Error[n]
volatile int Error_sum;
} PID
/****************************************************************************************/ // 位置式PID
// //pwm=Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)]
/****************************************************************************************/
float PID_Postion (float set_point,,float now_point,PID* sptr)
{
float iIncpid=0;
sptr->iError=now_point-set_point; // 计算当前误差
//死区控制算法
if(fabs(sptr->iError)>DEAD_BAND)
{
sptr->Error_sum+=sptr->iError;//积分项
iIncpid=sptr->Proportion * sptr->iError // P
+sptr->Integral * sptr->Error_sum // I
+sptr->Derivative * (sptr->iError-sptr->Error1); // D
sptr->Error1=sptr->iError ; // 存储误差,用于下次计算
}
else
{
iIncpid=0;
//sptr->Error_sum+=sptr->iError;//积分项
sptr->Error1=sptr->iError; // 存储误差,用于下次计算
}
return(iIncpid); // 返回计算值
}
/****************************************************************************************/ //增量式PID
// pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)] //
/****************************************************************************************/
float PID_increase(int iError,PID* sptr)
{
float iIncpid=0;
sptr->iError=iError;//直接检测当前偏差
if(fabs(sptr->iError)>DEAD_BAND)
{
iIncpid=sptr->Proportion * (sptr->iError-sptr->Error1) // P
+sptr->Integral * sptr->iError // I
+sptr->Derivative * (sptr->iError-2*sptr->Error1+sptr->Error2); // D
sptr->Error2=sptr->Error1; // 存储误差,用于下次计算
sptr->Error1=sptr->iError;
}
else
{
iIncpid=0;//输出增量值为0
sptr->Error2=sptr->Error1; // 存储误差,用于下次计算
sptr->Error1=sptr->iError;
}
return(iIncpid); // 返回增量值
}
|