在前面的文章中,我们学习了如何实现基本的pid控制器。但是,实际问题往往不那么简单,有时我们需要考虑一些特殊情况,比如死区。本篇文章将介绍如何实现带死区的pid控制器。
什么是死区?
死区实际上是指一个范围内的输入信号都不会产生输出。在控制系统中,死区通常指在系统输出的一段范围内,输入变化不会引起输出的变化。
在pid控制器中,死区可能会出现在输入和输出之间的转换函数中,或者在传感器或执行器上。如果我们不考虑死区,可能会导致控制器不灵敏,甚至失效。
带死区的pid控制器是如何工作的?
在带死区的pid控制器中,我们需要添加一个死区处理部分来处理输入信号。如果控制器输入信号处于死区内,输出将为零。如果控制器输入信号超出了死区,输出将按照pid控制器的计算方法进行计算。
我们可以在计算pid控制器的p、i、d部分后,将结果输入到死区处理函数中进行处理。死区处理函数需要判断输入信号是否处于死区内,如果是,则输出为零,如果不是,则输出按照pid计算的结果。
实现带死区的pid控制器
我们可以使用以下伪代码实现带死区的pid控制器:
// initialize pid parameters
double setpoint, kp, ki, kd;
double integralterm, lasterror, output;
// initialize deadzone
double deadzone;
// pid loop
while (true)
{
// measure process variable
double processvariable = measureprocessvariable();
// compute error
double error = setpoint - processvariable;
// compute p-term
double proportionalterm = kp * error;
// compute i-term
integralterm += ki * error;
// apply windup guard
if (integralterm > maximumoutput)
integralterm = maximumoutput;
else if (integralterm < minimumoutput)
integralterm = minimumoutput;
// compute d-term
double derivativeterm = kd * (error - lasterror);
// compute total output
output = proportionalterm + integralterm + derivativeterm;
// apply deadzone
if (abs(output) maximumoutput)
output = maximumoutput;
else if (output < minimumoutput)
output = minimumoutput;
// send output to controller
sendoutput(output);
// update last error
lasterror = error;
}
在上面的代码中,我们添加了一个deadzone变量来存储死区的大小。在每次计算输出时,我们检查输出是否处于死区内,如果是,则将输出设置为零。
总结:
带死区的pid控制器是比较常见的控制器类型,能够解决一些实际问题中出现的不灵敏和鲁棒性问题。在实际工作中,我们需要注意死区的大小和位置,以及合适的pid参数来保证控制系统的性能。