【2021电设经验总结】在血与泪中总结出的PID工程调试经验
作者:互联网
PID工程调试经验
【写在前面】
2021年全国大学生电子设计竞赛又因为疫情推迟了,让人欲哭无泪。暑假集训期间做了三个控制类的模拟题,其中平衡小车和球形小车都用到了PID控制算法,调试过程中遇到了很多奇奇怪怪的问题。不得不说,PID对于不了解它的人就是这样残酷,而对熟练掌握的人则是一把利器,对于我来说,也不能说已经能够熟练运用,只是略窥其中奥妙,现在把血与泪过程中得出的经验总结如下。
接触PID的第一个项目是国赛题目风力摆,那时候对PID算法的含义理解还停留在表面,我印象中到最后调的也不是很好,能在一定时间内等幅,很快就产生振荡。第二个PID项目做的是平衡小车,角度环和速度环分别用了PD和PI,角度环调的效果很不错,但是加上速度环之后整个人都懵了,小车开始大幅度低频振荡,立不起来,那个时候很害怕,因为担心小车机械结构散架,所以速度环一直不敢调大,现在想来还是很蠢的(相当于阻尼效果不够)。
【调试经验】
一般来说参数整定按照以下顺序:
1.KP的整定
-
一般来说先调P,把其他参数都置零的方法,确定P的极性,然后从小到大增大P,直到系统出现等幅振荡。
-
增加P会增加系统响应速度,但是过大的P会使系统稳定性不佳,且存在较大误差
2.KI的整定
-
积分环节的调节作用是消除静态误差。积分常数Ti越大,积分的积累作用越弱(一开始十分不理解,其实可以解释为
积分常数越大累计次数越少,累加几次就达到上限了)。
-
增大I可以使系统在过渡时不会产生振荡,减少超调量,提高系统的稳定性; 但是会减慢静态误差的消除过程。
3.KD的整定
-
微分的作用就是使系统能够**根据偏差的变化趋势预先给出适当的纠正** ,将有助于减小超调量, 克服振荡, 使系统趋
于稳定, 特别对髙阶系统非常有利, 它加快了系统的跟踪速度。
-
微分的作用对输入信号的噪声很敏感,对那些噪声较大的系统一般不用微分, 或在微分起作用之前先对输入信号进行滤波。
小总结
用一张表格来总结:
调整方式 | 上升时间 | 超调量 | 安定时间 | 稳态误差 | 稳定性 |
---|---|---|---|---|---|
KP增大 | 减少 | 增加 | 小幅增加 | 减少 | 变差 |
KI增大 | 小幅减少 | 增加 | 增加 | 大幅减少 | 变差 |
KD增大 | 小幅减少 | 减少 | 减少 | 基本不变 | 变好 |
另外还需要注意以下几点:
- 单独整定参数得时候,必须注意每个参数得极性必须正确,判断标准就是以上表格。
- 根据工程经验,KP和KI的关系是KP=KI * 200,当然公式是死的,要根据实际调。
【位置式PID】
1.公式
位置式PID是当前系统的实际位置,与你想要达到的预期位置的偏差,进行PID控制,当前的输出u(k)与过去的所有状态都有关系,输出的
u(k)对应的是执行机构的实际位置。
2.注意事项
1.需要加上积分限幅和输出限幅
2.适用于执行机构不带积分部件的对象,如舵机、平衡小车的直立、温控系统的控制、自动巡线等等
3.典型代码
typedef struct
{
float Kp; //比例系数Proportional
float Ki; //积分系数Integral
float Kd; //微分系数Derivative
float Ek; //当前误差
float Ek1; //前一次误差 e(k-1)
float Ek2; //再前一次误差 e(k-2)
float LocSum; //累计积分位置
}PID_LocTypeDef;
float PID_Loc(float SetValue, float ActualValue, PID_LocTypeDef *PID)
{
float PIDLoc; //位置
PID->Ek = SetValue - ActualValue;
PID->LocSum += PID->Ek; //累计误差
PIDLoc = PID->Kp * PID->Ek + (PID->Ki * PID->LocSum) + PID->Kd * (PID->Ek1 - PID->Ek);
PID->Ek1 = PID->Ek; return PIDLoc;
}
【增量式PID】
1.公式
控制增量Δu(k)的确定仅与最近3次的采样值有关,是对位置型 PID 取增量,这时控制器输出的是相邻两次采样时刻所计算的位置值之
差,得到的结果是增量,即在上一次的控制量的基础上需要增加(负值意味减少)控制量。 容易通过加权处理获得比较好的控制效果,并且
在系统发生问题时,增量式不会严重影响系统的工作。
2.注意事项
1.适用于 适用于执行机构带积分部件的对象,如步进电机等
2.增量式PID只需输出限幅
3.典型代码
typedef struct
{
float Kp; //比例系数Proportional
float Ki; //积分系数Integral
float Kd; //微分系数Derivative
float Ek; //当前误差
float Ek1; //前一次误差 e(k-1)
float Ek2; //再前一次误差 e(k-2)
}PID_IncTypeDef;
float PID_Inc(float SetValue, float ActualValue, PID_IncTypeDef *PID)
{
float PIDInc; //增量
PID->Ek = SetValue - ActualValue;
PIDInc = (PID->Kp * PID->Ek) - (PID->Ki * PID->Ek1) + (PID->Kd * PID->Ek2);
PID->Ek2 = PID->Ek1;
PID->Ek1 = PID->Ek; return PIDInc;
}
标签:误差,电设,整定,Ek,float,PID,2021,Ek1 来源: https://blog.csdn.net/hdu_master/article/details/120373221