论坛元老
 
- 积分
- 3347
- 金钱
- 3347
- 注册时间
- 2013-4-10
- 在线时间
- 333 小时
|
发表于 2016-2-25 14:45:46
|
显示全部楼层
本帖最后由 likunxue 于 2016-2-26 02:31 编辑
程序算法比较简单,关建你的参数要设置正确,这个要根据你的工程来决定,如下程序是PID的基本算法C函数
typedef struct
{
s32 SumError;
s32 LastError; //error[-1]
s32 PrevError; //error[-2]
s32 SetPoint; //目标值
s32 P; //比例常数
s32 I; //积分常数
s32 D; //微分常数
}WeiZhiSiFu_PID;
/********************************************************************************************
函数名: PID核心计算(增量式)
调 用: PID_Init(void)
参 数: 无(增量)
********************************************************************************************/
int IncPIDCalc(WeiZhiSiFu_PID *P,int NextPoint)
{
int error, iIncpid;
error = P->SetPoint - NextPoint; //当前误差
iIncpid = P->P * error //计算比例
- P->I * P->LastError //计算微分
+ P->D * P->PrevError; //计算枳分
P->PrevError = P->LastError; //保存前一次的误差
P->LastError = error; //保存当前误差
return iIncpid;
}
/********************************************************************************************
函数名: PID核心计算(位置式)
调 用: PID_Init(void)
参 数: 无(增量)
********************************************************************************************/
int LocPIDCalc(WeiZhiSiFu_PID *P,int NextPoint)
{
int error,d_error;
error = P->SetPoint - NextPoint; //当前误差
P->SumError += error; //积分
d_error = error - P->LastError; //微分
P->LastError = error; //保存当前偏差
return(P->P *error //比例项
+ P->I * P->SumError //积分项
+ P->D * d_error); //微分项
}
|
|