假设现在有一个场景:加热棒将一杯水加热到70℃
- 可以将控制量带到目标值附近
- 可以“预见”该控制量的变化趋势
- 可以消除因为余热,散热等因素引起的误差
P、I、D是三种不同的调节作用,既可以单独使用,也可以两两组合使用,也可以三个一起使用。
先来说说PID的三个参数:kP,kI,kD
①kP:比例系数
还是那个场景:
当水温差距很大时,狠狠加热一下;差距很小时,慢慢加热一下;
这就是P的作用
②kD:微分时间常数
有了上述P的控制,水温维持的晃晃悠悠,所以此时我们需要稳定一下,给它一个“阻尼”,让控制量的变化速度趋于0
③kI:积分时间常数
同样的场景,不同的地方,现在到北极了,需要加热到70℃,在P的作用下,加热到了66℃,此时水散热的速度和加热速度一样,P在慢慢加热,D觉得已经很稳定了,于是水温永远是66℃。
此时就需要I的作用:设置一个积分量,只要没达到目标,就一直积分。也就是增加加热功率
专业来讲:
PID控制其实就是对偏差的控制过程;如果偏差为 0, 则比例环节不起作用,只有存在偏差时,比例环节才起作用;积分环节主要是用来消除静差,所谓静差,就是系统稳定后输出值和设定值之间的差值,积分环节实际上就是偏差累计的过程,把累计的误差加到原有系统上以抵消系统造成的静差;而微分信号则反应了偏差信号的变化规律,也可以说是变化趋势,根据偏差信号的变化趋势来进行超前调节,从而增加了系统的预知性。
PID结构体初始化:
typedef struct
{
float target_val; //目标值
float actual_val; //实际值
float err; //定义偏差值
float err_last; //定义上一个偏差值
float Kp,Ki,Kd; //定义比例、积分、微分系数
float integral; //定义积分值
}pid;
位置式PID算法:
float PID_realize(float temp_val)
{
/*计算目标值与实际值的误差*/
pid.err=pid.target_val-temp_val;
/*误差累积*/
pid.integral+=pid.err;
/*PID算法实现*/
pid.actual_val=pid.Kp*pid.err+pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);
/*误差传递*/
pid.err_last=pid.err;
/*返回当前实际值*/
return pid.actual_val;
}
增量式PID算法
float PID_realize(float temp_val)
{
/*传入目标值*/
pid.target_val = temp_val;
/*计算目标值与实际值的误差*/
pid.err=pid.target_val-pid.actual_val;
/*PID算法实现*/
float increment_val = pid.Kp*(pid.err - pid.err_next) + pid.Ki*pid.err + pid.Kd*(pid.err - 2 * pid.err_next + pid.err_last);
/*累加*/
pid.actual_val += increment_val;
/*传递误差*/
pid.err_last = pid.err_next;
pid.err_next = pid.err;
/*返回当前实际值*/
return pid.actual_val;
}
增量式与位置式区别:
1 增量式算法不需要做累加,控制量增量的确定仅与最近几次偏差采样值有关,计算误差对控制 量计算的影响较小。而位置式算法要用到过去偏差的累加值,容易产生较大的累加误差。2 增量式算法得出的是控制量的增量,例如在阀门控制中,只输出阀门开度的变化部分,误动作影响小,必要时还可通过逻辑判断限制或禁止本次输出,不会严重影响系统的工作。而位置式的输出直接对应对象的输出,因此对系统影响较大。3 增量式 PID 控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等,而位置式 PID 适用于执行机构不带积分部件的对象,如电液伺服阀。4 在进行 PID 控制时,位置式 PID 需要有积分限幅和输出限幅,而增量式 PID 只需输出限幅
优点:①位置式 PID 是一种非递推式算法,可直接控制执行机构(如平衡小车),u(k)的值和执行机构的实际位置(如小车当前角度)是一一对应的,因此在执行机构不带积分部件的对象中可以很好应用缺点:①每次输出均与过去的状态有关,计算时要对 e(k)进行累加,运算工作量大。
优点:①误动作时影响小,必要时可用逻辑判断的方法去掉出错数据。②手动/自动切换时冲击小,便于实现无扰动切换。当计算机故障时,仍能保持原值。③算式中不需要累加。控制增量Δu(k)的确定仅与最近 3 次的采样值有关。缺点:①积分截断效应大,有稳态误差;②溢出的影响大。有的被控对象用增量式则不太好;