手把手教你看懂并理解Arduino PID控制库——采样时间

引子

在《手把手教你看懂并理解Arduino PID控制库》中已经简单介绍过Brett Beauregard大神所提供的ArduinoPID控制库,此库不单单能够在Arduino使用,稍做简单的修改便可移植到别的平台。那么下面针对7个问题的第一个问题进行说明。算法

问题定义

通常来讲,PID控制都是周期性调用(也就是意味着,每次计算的间隔都是固定的常量),但或多或少,因为各类需求会被奇葩的非周期调用。若是非得修改采样时间,对PID控制进行非周期调用,那么这样会致使如下问题:函数

观察这个“可恶”的方程ui

若是采样时间变化了,那么对于积分项和微分项(也就是KI和KD对应的项),这两项是和采样时间间隔有关的,那么则须要进行额外的微积分运算(不能再按照原来写好的代码进行运算,必须对时间参数进行调整)。spa

解决方案

若是算法被固定的周期间隔调用,那么运算将会变得很简单,而且也可以周期性的获取到精确的运算结果。那么朝着这个思路。须要想办法将已经被改变的采样周期让PID控制器认为没有改变,依旧沿用原来的运算过程。.net

代码

/*working variables*/
unsigned long lastTime;
double Input, Output, Setpoint;
double errSum, lastErr;
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;
      errSum += error;
      double dErr = (error - lastErr);
 
      /*Compute PID Output*/
      Output = kp * error + ki * errSum + kd * dErr;
 
      /*Remember some variables for next time*/
      lastErr = error;
      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;
   }
}

观察SetTunings和SetSampleTime两个函数,这两个函数完成了适应采样间隔改变功能。其中SetSampleTime在采样间隔改变后,按照比例放大/缩小了与采样间隔改变相同的倍数。在SetTunings作归一化处理。为何这里只对Ki和Kd进行处理在前面已经说过了,那么你们可能又会存在这样的疑问:code

若是Ki变化了,那么和经典的PID控制公式结果不是会差很大吗?答案是差异不大!!blog

观察积分项,并改写为离散形式:get

若是在调节过程当中,Ki是一个常量的话,那么能够进一步改写为:io

上式的第一项分别观察Ki 及 e(t),改变采样间隔后,e(t)受采样间隔影响会产生对应时间内的变化,而ki等比例反向放大/缩小,效果至关,证必。ast

结论

不管调用PID算法多么频繁,此算法仍是仅仅会周期性的计算。这样的好处是,PID控制器能够按照它熟悉的路子走到底。

这里须要说明的是,系统必须在timechange溢出前进行维护。或者 说,能够增长一个简单的保护机制,在越界后,将时间计数从新计数。固然unsigned int 为32位整型,已经可以容忍差很少50天运行,足够啦。

NOTE:若有不足之处请告知‘

下一章节将分析设定值的变化对微分项的影响^.^

NEXT

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

相关文章
相关标签/搜索