凡科网做网站花多少钱,php做网站麻烦吗,公司内部 网站开发,制作一个网站需要注意什么最近看到了Brett Beauregard发表的有关PID的系列文章#xff0c;感觉对于理解PID算法很有帮助#xff0c;于是将系列文章翻译过来#xff01;在自我提高的过程中#xff0c;也希望对同道中人有所帮助。作者Brett Beauregard的原文网址#xff1a;http#xff1a;//brettb…最近看到了Brett Beauregard发表的有关PID的系列文章感觉对于理解PID算法很有帮助于是将系列文章翻译过来在自我提高的过程中也希望对同道中人有所帮助。作者Brett Beauregard的原文网址http//brettbeauregard.com/blog/2011/04/improving-the-beginner’s-pid-onoff/ 1、问题所在
有一个 PID 控制器虽然是很好的但你并不是什么时候都需要它。 假设在程序中的某个时刻您希望将输出强制为某个值 (例如 0)您当然可以在调用例程中执行此操作
void loop()
{Compute();Output0;
}
这样无论 PID 输出是什么您只需覆盖其值。然而这在实践中是一个可怕的想法。PID 会变得非常混乱“我一直发送输出但是什么都没有发生!到底发生了什么事? !我再发送一下。”因此当您停止覆盖输出并切换回 PID 时您可能会立即得到一个巨大的输出值改变。
2、解决方案
解决这个问题的办法是有办法关闭和打开 PID。这些状态的常用术语是 手动 (我将手动调整输出值) 和 自动 (PID 将自动调整输出)。让我们看看这是如何在代码中完成的。
3、代码
/*working variables*/
unsigned long lastTime;
double InputOutputSetpoint;
double ITermlastInput;
double kpkikd;
int SampleTime 1000; //1 sec
double outMinoutMax;
bool inAuto false;
#define MANUAL 0
#define AUTOMATIC 1
void Compute()
{if(!inAuto) return;unsigned long now millis();int timeChange (now - lastTime);if(timeChangeSampleTime){/*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 Kpdouble Kidouble 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 Mindouble 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);
}
一个相当简单的解决方案。如果您不在自动模式下请立即离开计算函数而不调整 输出 或任何内部变量。
4、最终结果 的确您可以通过不象例程那样调用计算来实现类似的效果但此解决方案保持PID所包含的工作原理这是我们所需要的。通过保持事物的内部过程我们可以跟踪处于哪种模式中更重要的是当我们改变模式时它让我们知道有哪些工作需要进行。这就引出了下一期.....。
欢迎关注