PID算法

一.什么是PID算法?

  • Proportional(比例)   
  • IIntegral(积分算法) 
  • Derivative(微分算法)

        PID算法是闭环控制算法的一种。设定的目标值与当前值的差是误差。通过对误差进行乘Kp,对误差积分后乘Ki,对误差微分后乘Kd,将信息送给执行器(电机)。P算法有一个比例系数Kp,I算法有一个积分系数Ki,D算法有一个微分系数Kd。我们常说的PID调参就是调这三个系数。通过调整这三个参数使系统的整个响应过程和执行结果符合任务要求。

        设定的目标值与传感器返回的当前值的差是误差。通过对误差进行乘Kp,对误差积分后乘Ki,对误差微分后乘Kd,将三者代数之和送给执行器(电机)。对于是否需要I算法,D算法,要结合实际情况来选择。

以下举例说明:

现在需要完成这样一个任务:一个无人机需要从地面飞到100米的目标高度。目标值在整个过程中是一直不变的。

假设无人机升力与高度差之间存在线性比例那么F=Kp*h。

当设置Kp=0.1时:首先无人机的传感器将返回现在所处高度,与设定好的目标高度做差。发现还差100米,100m*Kp=10N>无人机自重,那么无人机将上升。无人机传感器再次返回当前所在高度,与目标高度100m做差,发现还差90m,90*Kp=9N>无人机自重,那么无人机将继续上升。以此类推。

注意:因为Kp总是与(目标值-当前值)相乘得到向上运动的升力,所以当升力等于无人机自重时,无人机会悬停在空中,无法到达目标位置。

由此可知,P算法只是实现了从初始状态到目标状态的大致简单的比例过程,且总是有稳态误差,所以,在P算法的基础上,使用I算法。

I算法在起始状态开始一直积累误差。当P算法有稳态误差难以消除时,I算法将持续不断累积误差,为无人机提供升力以消除误差,从而达到目标状态。但是在无人机上升过程中,I和P算法的叠加作用有时候使得无人机会飞出设定高度,然后又下落回来,产生震荡,最后稳定在设定高度上。

为了解决震荡的问题,使用D算法。D算法是对误差进行求导,得到的参数是速度。当速度过快时,D算法将会抵消掉由P算法计算出来的升力从而减小震荡。

注意:Kd逐渐增大,系统逐渐稳定。但是Kd不能设置得过大,否则会过冲,出现反效果。

其余控制知识:

  • 积分限幅:当系统遇到外部阻力,误差一直不变,I项将一直线性增长;当某一时刻阻力突然消失,系统将会以很大的速度运动。为了防止这种现象发生,使用积分限幅,将积分值控制在一定范围内。
  • 积分分离:当目标值突变(导致误差突变),导致积分突变,可能会导致震荡或者超调。虽然P项也会工作,但是当误差突变很大的时候,I项也会变得很大,导致超调。使用积分分离,对误差做一个条件判断,不能超过一定范围,如果超过一定范围就不适用I项。在只有P项的作用下,误差逐渐减小到一定范围时,再使用I项。
  • 微分先行:将系统输出直接给到D项。目标值突变时,信号先影响到P和I,不会马上给到D项。消除了输入突变的影响。

二.适用性

适用性:线性系统,准确地说是二阶以内线性系统(满足齐次性和叠加性)

RL电路:一阶系统

RLC电路:二阶系统

如果高阶系统可以简化为二阶线性系统,或者非线性系统线性化为线性系统,PID也可以适用。

三.位置环

位置环又叫做位置式PID,位置环是根据编码器的脉冲累加,测量电机的位置信息,并与目标值进行比较得到的偏差,然后对偏差进行比例,微分,积分,使偏差趋于0的一个过程。

定义一个pid函数,入口参数是位置测量值x,和位置目标值x0,返回值的PWM波。将返回值赋给电机驱动函数。在这个pid函数体中,需要有当前位置测量值x,和上一位置测量值x_last,由这两个值来计算error。经过pid算法之后会得到一个准确值,以PWM的形式作为实际值,让实际值去靠近目标值。位置环的积分项使用限幅。最后的PWM也需要限幅。

int PID(float x,float x_goal)//测量得到的位置,和目标位置作为参数
{
  float PWM;
  float err,x_last,I_err;

  err=x_goal-x;//计算误差
  I_err+=err;//积分项
  I_err=xianfu(I_err,x_goal);
  PWM=Kp*err+Ki*I_err+Kd*(err-err_last);
  err_last=err;

if(PWM>10000)PWM=10000;
if(PWM<-10000)PWM=-10000;
 
  return PWM;
}

四.速度环

速度环也叫增量环。速度环是编码器根据单位时间获取的脉冲数,测量电机的速度(编码器中的是脉冲数,速度需要由脉冲数来转化),并与目标值比较,计算出偏差。然后进行比例,微分,积分进行控制,使得偏差趋近于0的过程。在速度环里,只用PI控制。

int PID(float v,float v_goal)//入口参数是测量速度值和目标速度值
{
  
   int PWM;
   float v_last,err,err_last,err_next;
   err=v_goal-v;
   PWM=Kp*(err-err_last)+Ki*err+Kd*(err-2err_last+err_next);
  
   err_next=err_last;
   err_last=err;
xianfu(PWM,100);
   return PWM;
}

速度环的入口参数是速度测量值和目标速度值。在PWM计算式中,这里的PWM其实是增量。

什么时候用位置环,什么时候用速度环?

当执行机构的控制量是固定值,我们用位置环;当我需要控制一个增量时,用速度环。

五.速度-位置串级PID

串级PID也就是双环控制,用指定的速度去达到指定的位置。

六.PID调参

1.PI系统调参

一般先调P参数,由小到大依次调节。当P偏大一点点时,曲线响应较快,但出现过冲,最终值会基本接近目标值。当P偏小一点点时,曲线响应较慢,最终值小于目标值。如果P选取偏大一点点的值,优点是响应快,但是会出现过冲,最后稳定在目标值附近。如果P选取偏小一点点的,那么响应不够快且与目标值有偏差。偏差可以用I项消除,但是响应过慢这个缺点却无法明显改善。所以选取P偏大一点点的值较好。

在调I参数时,如果值偏小,那么误差消除不够;如果值较大,那么曲线会出现抖动,难稳定。所以,I值要选取适中值,使得曲线最终值可以与目标值基本重合。

2.PD系统调参

(PD系统适合用在大惯性系统中,如电机)

先调P值。同理,将P从小到大开始调,调到稍有过冲的状态。

再调D值。从0开始慢慢增加。在合适的D值下,曲线过冲消失,更快到达目标值。当D值过大时,系统会出现振荡,难稳定。

3.PID系统调参

先按照PI系统的方式调P,I参数。使系统在出现一定过冲之后稳定在目标值。然后调D值,补偿过冲,直到系统稳定。所以,P其实负责“快”,影响响应速度;I负责“准”,消除误差;D负责“稳”,消除震荡和过冲。

PID处理上的一些常用的方法

在数据采集时,将最大值和最小值剔除后,在计算平均值,这样做有利于抗干扰。

运算将会占用较长的时间,这是相对于一个基本定时周期来讲的。一个系统定时周期内,我们的系统还要处理很多事情。运算时间长会导致在一个系统定时周期内无法完成。解决办法是,将运算部分放到主程序中进行。像常规的刷新扫描等放在定时器中断中处理。如果主程序有更重要的事情要办,只能放在定时器中,时间不够用怎么办呢?我们对PID运算进行任务分割,把运算分成几个部分进行,每一次进入运算程序只计算其中的一小部分,经过多次调用才完成一次完整的PID,这样就不会影响系统的工作。这是面对一个比较大的系统的一般处理方法,对其它任务也可以采用分割的方式进行细分。比如液晶屏的分片刷新的处理办法使每次刷新的时间减到最短。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值