PID基础——学习笔记
开环控制和闭环控制
**开环控制系统:**不将控制的结果反馈回来影响当前控制的系统。
举例:打开灯的开关——按下开关后的一瞬间,控制活动已经结束,灯是否亮起已对按开关的这个活动没有影响。
**闭环控制系统:**可以将控制的结果反馈回来与希望值比较,并根据它们的误差调整控制作用的系统。
举例:调节水龙头——首先在头脑中对水流有一个期望的流量,水龙头打开后由眼睛观察现有的流量大小与期望值进行比较,并不断的用手进行调节形成一个反馈闭环控制。
二者的主要区别在于是否在控制过程中产生了反馈。
相较于开环控制系统,闭环控制系统因为有反馈值的产生,可以使系统的输出长时间保持在设定值,应用场景更为广泛。
PID算法
PID算法是实现闭环控制的核心算法。PID是指“proportion integration differentiation",即比例、积分、微分控制,三者共同作用完成对执行器的控制。工作原理如下图:
如图,我们可以写出PID算法的公式:
比例调节:
当单纯使用比例调节来进行控制时,u(k)=kp×e(k),当没有外部干扰时,可以成功完成对输出的控制。
例如水位控制,假设要使水位到达1,现有水位为0.2,Kp=0.5。
k=1时进行第一次控制:u(k)=0.8*0.5=0.4;此时输出为0.6;
k=2时进行第二次控制:u(k)=0.4*0.5=0.2;此时输出为0.8;
…
最后一定能到达设定值。
但是单一的比例控制存在一定的局限性,以上面为例,假如水池漏水,每次加水都会漏掉0.1,当水位为0.8时,输出的水位为0.2*0.5=0.1,与漏水相等,水位便不会接着上升。
积分调节:
由于单一比例调节控制有局限,因此加入积分调节,即u(k)=kp*e(k)+ki ∫ e(k)dk。此时除了比例调节还有积分调节,可以有效消除上述情况所产生的误差的影响。
微分调节:
在PID控制中起到减小震荡的作用,当反馈值逐渐接近设定值时,微分项的绝对值变大,阻碍u(k)变化。
PID算法控制代码:
/*定义PID数据结构体*/
typedef struct PI
{
float P;
float I;
float OutputMax;
float OutputMin;
float LastError;
float Output;
}PI;
/*PID数据初始化*/
void PI_Init(PI *pid,float Kp,float Ki,float max,float min)
{
pid->P=Kp;
pid->I=Ki;
pid->OutputMax=max;
pid->OutputMin=min;
}
/*数据请除*/
void PI_clc(PI *pid)
{
pid->P=0;
pid->I=0;
pid->OutputMax=0;
pid->OutputMin=0;
pid->LastError=0;
pid->Output=0;
}
float IncPIDCal(PI *pid, float NowValue, float AimValue)
{
float iError;
float cal;
iError =AimValue -NowValue;
cal = (pid->P * (iError-pid->LastError) )
+(pid->I * iError) ;
pid->LastError = iError;
pid->Output+=cal;
pid->Output = pid->Output > pid->OutputMax?pid->OutputMax:pid->Output;
pid->Output = pid->Output <pid->OutputMin?pid->OutputMin:pid->Output;
return pid->Output;
}
参考文章: