PID控制(下)

本文轉(zhuǎn)載自微信公眾號“電子搬磚師”,原文鏈接

這篇文章是PID控制的進階說明,如果沒有看過PID控制(上)的讀者,請先看看PID控制(上),以便更容易看懂這篇文章。

一、PID算法優(yōu)化

先講PID算法優(yōu)化。奉上最經(jīng)典的角度PID算法:

float inteAngle, lastErrorAnglel; //角度積分,上一次的角度誤差

//函數(shù)功能:角度PID算法
//輸入?yún)?shù):Angle,傳感器測量得到的角度
//返回參數(shù):PID算法輸出值
float PID_cal(float angle)
{
    float errorAngle;                                        //角度誤差
    float diffAngle;                                         //角度微分
    errorAngle = expectAngle - angle;                        //比例:角度誤差 = 期望角度 - 傳感器測的角度
    inteAngle = inteAngle + errorAngle;                      //積分:角度誤差積分 = 角度誤差積分 + 本次角度誤差
    diffAngle = errorAngle - lastErrorAnglel;                // 微分:角度微分 = 本次角度誤差 - 上次角度誤差
    lastErrorAnglel = errorAngle;                            //記錄本次角度誤差
    return (P * errorAngle + I * inteAngle + D * diffAngle); //返回PID計算結(jié)果
}

以上PID算法是不是很簡單?只要5行代碼,只要調(diào)節(jié)P、I、D這3個系數(shù),這個算法就可以讓平衡車立起來!

我們開始對這簡單算法做優(yōu)化。

1

如果輸入角度Angle是一個噪聲比較大的值,可以對Angle做一個簡單濾波,比如做個平滑濾波:

errorAngle = K * (expectAngle - angle) + (1 - K) * lastErrorAngle;

當(dāng)然角度數(shù)據(jù)最好能在輸入PID算法前就先做濾波了。

2

某些控制模型的誤差絕對值大于一定值時可能需要停止運行,比如說平衡車倒地了,這時平衡車可能就不要再轉(zhuǎn)輪了,不然可能產(chǎn)生意外。這時我們就可以判斷平衡車角度誤差絕對值是否大于限定值,如果大于的話我們就直接返回0,停止車輪滾動。如下:

if ((abs)errorAngle > limitAngle1) { return 0; }

3

如果誤差絕對值大于一定值,積分項就會累積到很大的積分值,太大的積分值會使得系統(tǒng)更難控制,所以我們可以判斷誤差絕對值是否超標(biāo),過大的話就不積分,合規(guī)的話就可以積分,如下:

if ((abs)errorAngle < limitAngle2) { inteAngle += errorAngle; }

4

以上還有一種處理積分的方式叫積分分離法,它指的是如果誤差絕對值大于一定值,積分項干脆直接清零。這樣做的好處是可以使控制模型更快回復(fù)到平衡狀態(tài),或者避免加劇控制模型的失控,如下:

if ((abs)errorAngle > limitAngle2) {inteAngle = 0; }

5

由于過大的積分值會使系統(tǒng)難以控制或者回歸穩(wěn)定太慢,我們需要對積分做限制幅度處理,如下:

if (inteAngle > limitInteAngle) { inteAngle = limitInteAngle; }
if (inteAngle < -limitInteAngle) { inteAngle = -limitInteAngle; }

6

微分項往往是噪聲比較大的項,如果微分噪聲大我們也最好加個平滑濾波。本例中的角度微分項其實就是角速度,它可以用本次角度誤差減去上次角度誤差獲得,也可以直接用陀螺儀測量得到的角速度。假設(shè)我們用的是前者,那對前者微分濾波如下:

diffAngle = J * (errorAngle - lastErrorAngle) + (1 - J) * lastDiffAngle;

7

執(zhí)行機構(gòu)的死區(qū)指的是PID算法給出一個控制數(shù)值到執(zhí)行機構(gòu),執(zhí)行機構(gòu)可能會因為輸入值較小而沒反應(yīng)。比如你給電機1V的電壓,可能電機根本不會動,直到你給3V電壓時,它才會動。這個3V電壓就是該電機的死區(qū)。
死區(qū)通??梢杂肞ID的積分項消除掉,但是有的地方不想用積分累積那么久才越過死區(qū)值,就可以在PID輸出值上直接加上死區(qū),如下:

PID_Out = P * errorAngle + I * inteAngle + D * diffAngle;
if (PID_Out > 0) { PID_Out += deadValue; }
else if (PID_Out < 0) { PID_Out += -deadValue; }

8

有的執(zhí)行機構(gòu)沒法接收過大的PID輸出值,比如PWM占空比最大只能100%,而如果PID輸出的值大于這個PWM上限,那就要將PID輸出值限幅,如下:

if (PID_Out > LimitPID) { PID_Out = LimitPID; }
if (PID_Out < LimitPID) { PID_Out = -LimitPID; }

9

高深點的PID的P、I、D三個系數(shù)還可以不是固定的,而是隨著誤差值的變化而變化的,這樣就可以實現(xiàn)將非線性控制模型給線性控制住。這種方式我也沒有用過,不過它的簡單實現(xiàn)方式可以列出,還是應(yīng)用本例,有:

P *f(ErrorAngle) * ErrorAngle + I *g(ErrorAngle) * InteAngle + D *h(ErrorAngle) * DiffAngle;

大概的PID算法優(yōu)化以上都已經(jīng)給出了,讀者不用把每一項優(yōu)化都添加到自己的算法中。畢竟每個控制模型都不一樣,都有自己各自需要優(yōu)化的地方,不要拘泥于此。

二、串級PID分析

奉上串級PID的框圖:

串級PID框圖

其中:

  • 圓圈帶+-號的是誤差比較機構(gòu)
  • E(S)是誤差
  • G(S)是被控對象
  • H(S)是反饋機構(gòu)
  • 左邊的PID屬于外環(huán)
  • 右邊的PID屬于內(nèi)環(huán)

回歸到上一篇PID控制(上)中,那篇文章里面提到推箱子,箱子距離目的地越遠就應(yīng)該用越大的力氣推,這個說法我當(dāng)時是為了簡單不繞提出的,但實際上是不對的。推力大會使得加速度大,如果摩擦力比較小,到達終點時推力為0只是說加速度為0,速度可能是非常大的,這個是不對的。真正正確的是距離和速度成比例,距離越遠,速度越大,距離為0,速度為0,即推箱子的人應(yīng)該控制的是速度而不是推力。

問:那速度要怎么控制呢?
答:可以靠串級PID算法控制。

串級PID在無人機上用得很多,它具有比單級PID控制更穩(wěn)定,更順滑的優(yōu)點。它和單級PID控制的區(qū)別是:無人機單級PID是直接計算輸入角度和反饋角度的誤差,然后利用PID算法直接算出PWM值控制電機轉(zhuǎn)動;而串級PID是先計算輸入角度和反饋角度的誤差,然后利用外環(huán)PID算法計算出在此角度誤差下無人機的角速度最應(yīng)該是多少,接著再計算外環(huán)PID輸出的角速度和無人機當(dāng)前角速度的誤差,將此誤差再送入控制角速度的內(nèi)環(huán)PID算法中計算,最終內(nèi)環(huán)PID輸出一個PWM值控制電機轉(zhuǎn)動。

串級PID中的內(nèi)環(huán)控制頻率可能會比外環(huán)控制頻率高,因為外環(huán)給內(nèi)環(huán)一個角速度值,內(nèi)環(huán)不可能瞬間達到這個角速度,它必須經(jīng)過幾個周期的調(diào)整才可能達到這個角速度值。但是很多無人機內(nèi)外環(huán)控制頻率是一致的,這個也沒什么問題,因為雖然內(nèi)環(huán)沒法及時達到外環(huán)的要求,但是卻是往外環(huán)要求的趨勢走的,最終無人機姿態(tài)還是會穩(wěn)定的。

前面提到積分是消除靜差用的,那這里無人機外環(huán)傳遞給內(nèi)環(huán)的只是一個角速度,而內(nèi)環(huán)利用自己的PID算法會負責(zé)將這個角速度實現(xiàn)出來,那這樣外環(huán)輸出的只是一個數(shù)字而已,哪怕是0.01度/秒,內(nèi)環(huán)也會幫它實現(xiàn),這就不該存在靜差了,為什么外環(huán)要加個積分呢?

這里要說明積分的另一個作用,就是減小調(diào)節(jié)時間。假設(shè)比例項是5,角度誤差是2度,純比例控制輸出的值會是10度/秒,但是如果有積分項存在,輸出就會是:52+I積分,這個值會使角速度得到更快的變化。如果將外環(huán)的P和I系數(shù)調(diào)到一個合適值,雖然被控對象達到設(shè)定值時會過沖,然后反沖,如此震蕩幾次再穩(wěn)定,但這個過程還是可以比僅有P系數(shù)的外環(huán)調(diào)節(jié)更快達到設(shè)定值。

拓展閱讀:淺談四軸PID調(diào)試心得

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容