本文将分析《手把手教你看懂并理解Arduino PID控制库》中第三个问题:PID控制参数突变对系统的影响。算法
在PID控制实际的应用过程当中,可能会存在须要忽然改变PID调谐参数Kp、Ki、Kd的情形,那么若是忽然改变调谐参数,会有什么影响呢?首先先看一张图:ui
若是在系统运行的过程当中,对调谐参数进行较大的改变,那么Output会产生一个突变,有点略微像“坑”。下图给出了一个改变PID参数对输出影响的量化分析:spa
上述现象描述了在系统进入稳态后,忽然改变PID参数致使的变化,起主要引发输出较大变化的因子为I参数,因为进入稳态P参数相乘因子E变化不大,D参数一样不大,可是I参数相乘因子是关于时间的积分(能够想象若是一开始被控量与设定值相距较远,而积分表示的是带方向的面积和,因此必然存在一个方向会有较大面积,见下图),因此,会引发较大的变化。.net
先看一组算式,又要感谢伟大的数学家了。code
第一个等式在KI是常数的时候没问题,不是常数的时候须要评估,尽管不彻底成立,但若是在稳态时E很是小,那么,也是能够接受。这彷佛和经典的PID等式不同。换个角度,经典的PID控制I项,也仅仅是为了消除静态偏差而肯定的,若是在这个大前提下,换一种方式消除静态偏差也是能够的,仅仅是牺牲了”力度”。blog
/*working variables*/ unsigned long lastTime; double Input, Output, Setpoint; double ITerm, lastInput; double kp, ki, kd; int SampleTime = 1000; //1 sec void Compute() { unsigned long now = millis(); int timeChange = (now - lastTime); if(timeChange>=SampleTime) { /*Compute all the working error variables*/ double error = Setpoint - Input; ITerm += (ki * error); double dInput = (Input - lastInput); /*Compute PID Output*/ Output = kp * error + ITerm - kd * dInput; /*Remember some variables for next time*/ lastInput = Input; lastTime = now; } } void SetTunings(double Kp, double Ki, double Kd) { double SampleTimeInSec = ((double)SampleTime)/1000; kp = Kp; ki = Ki * SampleTimeInSec; kd = Kd / SampleTimeInSec; } void SetSampleTime(int NewSampleTime) { if (NewSampleTime > 0) { double ratio = (double)NewSampleTime / (double)SampleTime; ki *= ratio; kd /= ratio; SampleTime = (unsigned long)NewSampleTime; } }
变量Iterm用于完成上述算法。get
图示数学
量化结果io
从图表中能够看出,尽管PID参数发生了较大的改变,但输出仍然变得连续。在上述过程当中,牺牲了系统的响应的“灵敏度”增长了控制的稳定性,系统的灵敏度每每能够经过增长计算频率来改善,大幅提升采样频率能够起到较快的更新积分项的做用。ast
目前这种作法在温度控制中,有较好的控制效果。
NOTE:若有不足之处请告知。^.^
下一章将介绍若是在系统运行过程当中,设定值忽然改变对系统的影响
PS:转载请注明出处:欧阳天华