手把手教你看懂并理解Arduino PID控制库——开启或关闭PID控制的影响

引子

本文将分析《手把手教你看懂并理解Arduino PID控制库》中第四个问题:突然开启或者关闭PID控制对系统的影响。

问题定义

先看问题的图示:

图中,蓝色的竖虚线表示在时间轴上,PID控制由开启状态转为关闭的状态。如果我们对于关闭PID采取的操作是强制设定输出为“PID由开启转关闭对应的输出值或更小或为0”。由于输出被设为定值,由于输出的“力度”不够,那么被控量会缓慢减少。但对于PID控制器来说,他会不知道PID已经关闭了,由于被控量见笑了,他就会努力增加输出,以求改变这种态势。但现实是残酷的,为何我“放肆”增加输出,被控量却没有按照我设定的方向发展。此时,若突然又将PID打开了,将会有一个极大的输出对系统作用,稳定性降低。

解决方案

上述问题,并不是一个大问题,其实在关闭PID控制的时候,仅需要退出PID计算循环,让各控制参量仍保持原样即可。if(!inAuto) return; 和 setMode函数完成了上述功能。

/*working variables*/
unsigned long lastTime;
double Input, Output, Setpoint;
double ITerm, lastInput;
double kp, ki, kd;
int SampleTime = 1000; //1 sec
double outMin, outMax;
bool inAuto = false;
 
#define MANUAL 0
#define AUTOMATIC 1
 
void Compute()
{
   if(!inAuto) return;
   unsigned long now = millis();
   int timeChange = (now - lastTime);
   if(timeChange>=SampleTime)
   {
      /*Compute all the working error variables*/
      double error = Setpoint - Input;
      ITerm+= (ki * error);
      if(ITerm> outMax) ITerm= outMax;
      else if(ITerm< outMin) ITerm= outMin;
      double dInput = (Input - lastInput);
 
      /*Compute PID Output*/
      Output = kp * error + ITerm- kd * dInput;
      if(Output > outMax) Output = outMax;
      else if(Output < outMin) Output = outMin;
 
      /*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;
   }
}
 
void SetOutputLimits(double Min, double Max)
{
   if(Min > Max) return;
   outMin = Min;
   outMax = Max;
    
   if(Output > outMax) Output = outMax;
   else if(Output < outMin) Output = outMin;
 
   if(ITerm> outMax) ITerm= outMax;
   else if(ITerm< outMin) ITerm= outMin;
}
 
void SetMode(int Mode)
{
  inAuto = (Mode == AUTOMATIC);
}

结论

NOTE:如有不足之处请告知。^.^

下一章将介绍如果在系统运行过程中,突然改变PID控制参数对系统的影响

NEXT

PS:转载请注明出处:欧阳天华

猜你喜欢

转载自my.oschina.net/u/3162997/blog/827553