笔记-pid增量式


增量式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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值