PID控制算法学习笔记

一、简述

        pid控制算法核心有三个参数控制,分别是Kp、Ki、Kd,分别代表着比例环节、积分环节、微分环节。

        具体实现时表示为输出设备将实际数值传输回输出端,输出端拿到数据计算实际值和理想数据的差距,使用该差距进行比例环节、积分环节、微分环节后得到一个数值给输出端,随后输出端就使用该值控制设备改变状态。

        该控制算法的最简表示是一个单闭环的系统,但是也可以优化成一个多闭环结合的串行pid。 

二、三个具体参数的含义

        1、Kp,p就是比例(Proportional)的英文首字母,可以根据当前误差的大小来调整系统的输出。比例系数越大,系统对于误差的响应就越灵敏。举例如对电机转速进行调节,如果理想为100转每分(后文忽略单位),而目前为0,则计算差值为100,使用Kp*100得到的数值就可以输出给电机让电机转的更快,随后再返回实际值如50.那么差值就是50,再和p相乘那对电机转速的提高就减弱,如此反复。

       2、Ki,i就是积分(Integral)的首字母,可以根据过去误差的大小和方向来调整系统的输出,主要用于消除稳态误差,提高系统的无差度。从上述使用p对系统调节就可以发现,当电机转速到达与理想值极小差距时,比例环节产生的输出值会很小,在某些需要输出值与某些固定变量抵抗时,就会出现无法到达目标值的稳定状态,比如电机必须10数值的力才能保持不减速,那么当kp*差值=10的时候,虽然还有误差但是差距再也无法减小,这就是静态误差的产生原因。

        因此积分环节就是将从一开始p环节产生的力不断累加进行积分,最后在遇到阻力时加上积分环节的力就有机会到达预设值,i环节的积分就会等于环境中的阻力,例如电机问题中需要的10的力。

        3、Kd,d是微分(Derivative)。根据误差的变化趋势来调整系统的输出,对系统有一个阻尼作用,加快系统的响应速度。因为pi环节每次输出后再接受反馈是有一定时间间隔的,如果p值太大,比如kp等于100,那么电机第一次被输出10000的力,可能在下一次反馈是电机速度已经到了150,那么又要施加反向的力,如此反复趋于理想值。

        而d环节就是对反馈回来计算后的差值随时间变化的微分,如果差值有减小的趋势,微分得出的值就是负值,用来减小前两个环节算出的值,达到阻力作用,可以让电机转速更快更稳定的到达预设值。

三、参数调节

        一般在pid调参时会先调p,然后i,最后d,同时也有系统会出现pi控制和pd控制的情况,但都会先调节p值,因为这是一般情况下输出值的主要构成,先得出p就能根据输出反馈在进行后续微调。一般来说kp值太大会导致变化过大超过某些限定值,可以从较小值慢慢调大,需要适中调节;ki太小消除静差的效果会不明显,所以可以尽量给大值;kd则不能给太大,若太大对数据差值太敏感会震荡很久才稳定,阻尼效果变差。

 四、部分代码实现

        控制电机输出时的单环pid控制算法简单代码

motor_pid[i].speedpid.current = motor_chassis[i].speed_rpm;

void pid_calc(_pid* pid)
{
    pid->cha = pid->target - pid->current;
    
    pid->pout = (int32_t)(pid->Kp * pid->cha);
    //p环节
    pid->iout += (int32_t)(pid->Ki * pid->cha);
    //i环节
    pid->dout = (int32_t)(pid->Ki * (pid->cha - pid->last->cha));
    //d环节    
    pid->out = pid->pout + pid->iout + pid->dout;  //计算最终输出


    pid->last->cha = pid->cha;
}

以上就是目前为止对pid算法学习的一些简略收获。
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值