PID算法类型
工程上PID算法有两种形式
首先定义一个结构体
typedef struct PID
{
float Proportion;//P
float Integral; //I
float Derivative;//D
float PrevError;//上上一次误差
float LastError;//上一次误差
float Error; //当前误差
float DError;
float SumError; //历史误差累积和
float Integralmax;
float output; //输出
float outputmax;
float errormax;
u8 first_flag;
float deadzone; //死区
}PID;
- 位置式
void PID_position_PID_calculation(PID *pp, float CurrentPoint, float NextPoint)
{
if(pp->first_flag == 1)
{
pp->LastError = NextPoint - CurrentPoint;
pp->PrevError = NextPoint - CurrentPoint;
pp->first_flag = 0;
}
pp->Error = NextPoint - CurrentPoint;
pp->SumError += pp->Error;
pp->DError = pp->Error - pp->LastError;
pp->output = pp->Proportion * pp->Error + PID_abs_limit(pp->Integral * pp->SumError, pp->Integralmax ) + pp->Derivative * pp->DError ;
//输出限幅
if(pp->output > pp->outputmax ) pp->output = pp->outputmax;
if(pp->output < - pp->outputmax ) pp->output = -pp->outputmax;
pp->LastError = pp->Error;
if(float_abs(pp->Error) < pp->deadzone)
{
pp->output = 0;
}
}
- 增量式
void PID_incremental_PID_calculation(PID *pp, float CurrentPoint, float NextPoint)
{
//误差计算
pp->Error = NextPoint - CurrentPoint;
pp->DError = pp->Error - pp->LastError;
//PID算法
pp->output += pp->Proportion * (pp->DError)+ PID_abs_limit(pp->Integral * pp->Error, pp->Integralmax ) + pp->Derivative * ( pp->Error + pp->PrevError - 2*pp->LastError);
//输出限幅
if(pp->output > pp->outputmax ) pp->output = pp->outputmax;
if(pp->output < - pp->outputmax ) pp->output = -pp->outputmax;
pp->PrevError = pp->LastError;
pp->LastError = pp->Error;
//死区
if(float_abs(pp->Error) < pp->deadzone)
{
pp->output = 0;
}
}
增量式和位置式的区别
-
增量式算法不需要做累加,控制量增量的确定仅与最近几次偏差采样值有关,计算误差对控制 量计算的影响较小;
而位置式算法要用到过去偏差的累加值,容易产生较大的累加误差。
-
增量式算法得出的是控制量的增量,例如在阀门控制中,只输出阀门开度的变化部分,误动作 影响小,必要时还可通过逻辑判断限制或禁止本次输出,不会严重影响系统的工作;
而位置式的输出直接对应对象的输出,因此对系统影响较大。
-
增量式PID控制输出的是控制量增量,并无积分作用,因此该方法适用于执行机构带积分部件的对象,如步进电机等;
而位置式PID适用于执行机构不带积分部件的对象,如电液伺服阀。
-
在进行PID控制时,位置式PID需要有积分限幅和输出限幅;
而增量式PID只需输出限幅。
位置式PID优缺点
- 优点:位置式PID是一种非递推式算法,可直接控制执行机构(如平衡小车),u(k)的值和执行机构的实际位置(如小车当前角度)是一一对应的,因此在执行机构不带积分部件的对象中可以很好应用。
- 缺点:每次输出均与过去的状态有关,计算时要对e(k)进行累加,运算工作量大。
增量式PID优缺点
- 优点:
- 误动作时影响小,必要时可用逻辑判断的方法去掉出错数据
- 手动/自动切换时冲击小,便于实现无扰动切换。当计算机故障时,仍能保持原值。
- 算式中不需要累加。控制增量Δu(k)的确定仅与最近3次的采样值有关。
- 缺点:
- 积分截断效应大,有稳态误差;
- 溢出的影响大,有的被控对象用增量式则不太好。
简述
PID算法的目的是尽量缩小误差,使实际值尽可能的达到期望值。
然而系统内总是存在误差,因此在没有PID调控时实际值会低于或高于期望值。此时如果加入P环调控即输出值与误差与Kp乘积有关,且与误差大小有直接关系,故系统刚启动时输出极大,接近期望时输出逐渐减小,但仍然有输出,造成超调。因此Kp的选择很有讲究,太大则震荡幅度过大,太小则震荡时间较长。
若加入I环调控,I即积分乃误差的累计,在系统过冲之后误差符号改变使积分减小甚至为负值,此时抑制系统的输出,使输出减小,从而使系统快速稳定。
而D环调控,D为微分乃误差变化的斜率,即变化的快慢。其作用为提高响应速度。对误差无变化的系统不起作用,对误差变化剧烈的系统容易超调。
总结就是P让误差可以为0,I让误差更快更平缓的为0,D让系统反应更快。