文章目录
- 0、概念
- 1、理解
- 2、实现
- 3、优化
- 4、引用
0、概念
PID算法是工业应用中最广泛算法之一,在闭环系统的控制中,可自动对控制系统进行准确且迅速的校正。PID控制,即Proportional §– Integral(I) – Derivative(D) Control, 实际上是三种反馈控制:比例控制,积分控制与微分控制的统称。根据控制对象和应用条件,可以采用这三种控制的部分组合,即P控制,PI控制,PD控制或者是三者的组合,即真正意义上的PID控制。我们可以笼统地去称呼他们为PID控制律。采取这种控制规律的控制器,我们称为PID控制器PID控制模型如下图所示
有其推导出公式(直接截图)
括号内第一项是比例项,第二项是积分项,第三项是微分项,前面仅仅是一个系数。很多情况下,仅仅需要在离散的时候使用,则控制可以化为
系数进一步统一:
再进一步的简化:
我觉得优点可以概括为:快速,精准,稳定。
1、理解
由上面的公式可以理解,在实际应用中主要是针对三个比例系数的调优:
有人这么理解pid控制算法: p是控制现在,i是纠正曾经,d是管控未来!只有不忘过往,把握当前,规划未来才能让人生的轨迹按照既定的目标前进。
比例系数:kp
比例环节的作用是对偏差瞬间作出反应。偏差一旦产生控制器立即产生控制作用, 使控制量向减少偏差的方向变化。 控制作用的强弱取决于比例系数Kp, 比例系数Kp越大,控制作用越强, 则过渡过程越快, 控制过程的静态偏差也就越小; 但是Kp越大,也越容易产生振荡, 破坏系统的稳定性。 故而, 比例系数Kp选择必须恰当, 才能过渡时间少, 静差小而又稳定的效果。
积分系数:ki
从积分部分的数学表达式可以知道, 只要存在偏差, 则它的控制作用就不断的增加; 只有在偏差e(t)=0时, 它的积分才能是一个常数,控制作用才是一个不会增加的常数。 可见,积分部分可以消除系统的偏差。
积分环节的调节作用虽然会消除静态误差,但也会降低系统的响应速度,增加系统的超调量。积分常数Ti越大,积分的积累作用越弱,这时系统在过渡时不会产生振荡; 但是增大积分常数Ti会减慢静态误差的消除过程,消除偏差所需的时间也较长, 但可以减少超调量,提高系统的稳定性。
微分系数:Kd
实际的控制系统除了希望消除静态误差外,还要求加快调节过程。在偏差出现的瞬间,或在偏差变化的瞬间, 不但要对偏差量做出立即响应(比例环节的作用), 而且要根据偏差的变化趋势预先给出适当的纠正。
举一个例子:汽车从0加速到100这个过程。
在理想的情况下只需要比例系数Kd,这里取0.5
t =1 速度为50,
t = 2 速度为 75,
…
时间上总会无限趋近与100
但是实际情况是地面有摩擦,空气有阻力,系统受外部环境和实际情况影响t=1秒,实际情况达不到50,这种情况下可能达不到给到100速度实际情况只有90多,这时候加上一个 ki,来弥补达不到的速度,那么问题又来了,系统的从0-100时间上又会被Ki影响,这里在引入一个Kd来加快调节整个系统时间。
2、实现
一个简单的C语言实现:
// 第一步:定义PID变量结构体,代码如下:
struct _pid{
float SetSpeed; //定义设定值
float ActualSpeed; //定义实际值
float err; //定义偏差值
float err_last; //定义上一个偏差值
float Kp,Ki,Kd; //定义比例、积分、微分系数
float voltage; //定义电压值(控制执行器的变量)
float integral; //定义积分值
}pid;
//第二部:初始化变量,代码如下:
void PID_init(){
pid.SetSpeed=0.0;
pid.ActualSpeed=0.0;
pid.err=0.0;
pid.err_last=0.0;
pid.voltage=0.0;
pid.integral=0.0;
pid.Kp=0.2;
pid.Ki=0.015;
pid.Kd=0.2;
}
//第三步 pid算法的实现
float PID_realize(float speed){
pid.SetSpeed=speed;
pid.err=pid.SetSpeed-pid.ActualSpeed;
pid.integral+=pid.err;
pid.voltage=pid.Kp*pid.err+pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);
pid.err_last=pid.err;
pid.ActualSpeed=pid.voltage*1.0;
return pid.ActualSpeed;
}
//测试代码
int main(){
printf("System begin \n");
PID_init();
int count=0;
while(count<1000)
{
float speed=PID_realize(200.0);
printf("%f\n",speed);
count++;
}
return 0;
}
3、优化
在实际应用过程中会对某个值做偏重,因为每个值都影响系统不同的反应:如稳定,灵敏度等,在实际工程考虑情况不一样,在引入各个参数的时机也不一样,具体优化见参考2.
4、引用
1、一文搞懂PID控制算法
2、PID控制算法的C语言实现