在前面的文章中,我們學(xué)習(xí)了如何實(shí)現(xiàn)基本的pid控制器。但是,實(shí)際問題往往不那么簡單,有時我們需要考慮一些特殊情況,比如死區(qū)。本篇文章將介紹如何實(shí)現(xiàn)帶死區(qū)的pid控制器。
什么是死區(qū)?
死區(qū)實(shí)際上是指一個范圍內(nèi)的輸入信號都不會產(chǎn)生輸出。在控制系統(tǒng)中,死區(qū)通常指在系統(tǒng)輸出的一段范圍內(nèi),輸入變化不會引起輸出的變化。
在pid控制器中,死區(qū)可能會出現(xiàn)在輸入和輸出之間的轉(zhuǎn)換函數(shù)中,或者在傳感器或執(zhí)行器上。如果我們不考慮死區(qū),可能會導(dǎo)致控制器不靈敏,甚至失效。
帶死區(qū)的pid控制器是如何工作的?
在帶死區(qū)的pid控制器中,我們需要添加一個死區(qū)處理部分來處理輸入信號。如果控制器輸入信號處于死區(qū)內(nèi),輸出將為零。如果控制器輸入信號超出了死區(qū),輸出將按照pid控制器的計(jì)算方法進(jìn)行計(jì)算。
我們可以在計(jì)算pid控制器的p、i、d部分后,將結(jié)果輸入到死區(qū)處理函數(shù)中進(jìn)行處理。死區(qū)處理函數(shù)需要判斷輸入信號是否處于死區(qū)內(nèi),如果是,則輸出為零,如果不是,則輸出按照pid計(jì)算的結(jié)果。
實(shí)現(xiàn)帶死區(qū)的pid控制器
我們可以使用以下偽代碼實(shí)現(xiàn)帶死區(qū)的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變量來存儲死區(qū)的大小。在每次計(jì)算輸出時,我們檢查輸出是否處于死區(qū)內(nèi),如果是,則將輸出設(shè)置為零。
總結(jié):
帶死區(qū)的pid控制器是比較常見的控制器類型,能夠解決一些實(shí)際問題中出現(xiàn)的不靈敏和魯棒性問題。在實(shí)際工作中,我們需要注意死區(qū)的大小和位置,以及合適的pid參數(shù)來保證控制系統(tǒng)的性能。