增量式PID:u(k) = Kp * (e(k)-e(k-1))+Ki *e(t) +Kd *(e(k)-2e(k-1)+e(k-2));
typedef struct{
float kp ; //比例系数
float ki ; //积分系数
float kd ; //微分系数
float error; //误差值 e(k)
float lastError; //上一个误差值 e(k-1)
float dError; //上次误差和这次误差的变化值 e(k)-e(k-1)
float ddError; //上次误差变化值和这次误差的变化值的变化值 e(k)-2e(k-1)+e(k-2)
float dError_last; //上上次误差和上次次误差的变化值
float output; //输出值 u(k)
float output_last; //上次的输出值 u(k-1)
float output_new;
}pid_info;
void reset_pid(pid_info *pid,float kp,float ki,float kd)
{
pid->kp = kp;
pid->ki = ki;
pid->kd = kd;
pid->error = 0;
pid->lastError = 0;
pid->dError = 0 ;
pid->ddError = 0;
pid->dError_last = 0;
pid->output = 0 ;
pid->output_last = 0;
}
float increment_pid(float error,pid_info *pid)//增量式PID
{
pid->error = error;//e(k)
pid->dError = error - pid->lastError;//e(k)-e(k-1)
pid->ddError = pid->dError - pid->dError_last;//[e(k)-e(k-1)]-[e(k-1)-e(k-2)]
pid->lastError = error;
pid->dError_last = pid->dError;
pid->output =(pid->kp*pid->dError)+(pid->ki*error)+(pid->kd*pid->ddError) + pid->output_last;
pid->output_last = pid->output;
// int32_t pidoutput= (int32_t)pid->output;
return pid->output;
}
笔记-pid增量式
最新推荐文章于 2025-04-14 16:45:31 发布
9222

被折叠的 条评论
为什么被折叠?



