PID控制器開發筆記之五 變積分PID控制器的實現

2021-08-20 07:10:39 字數 2683 閱讀 7342

在普通的pid控制演算法中,由於積分係數ki是常數,所以在整個控制過程中,積分增量是不變的。然而,系統對於積分項的要求是,系統偏差大時,積分作用應該減弱甚至是全無,而在偏差小時,則應該加強。積分係數取大了會產生超調,甚至積分飽和,取小了又不能短時間內消除靜差。因此,如何根據系統的偏差大小改變積分速度,對提高系統的品質是有必要的。變積分pid演算法正好可以滿足這一要求。

變積分pid的基本思想是設法改變積分項的累加速度,使其與偏差大小相對應:偏差越大,積分越慢; 偏差越小,積分越快。設定係數為f(err(k)),它是err(k)的函式。當|err(k)|增大時,f減小,反之增大。變積分的pid積分項表示式為:

其中f(err(k))與|err(k)|的函式關係可根據具體情況設定,可以是線性的也可以是非線性的,通常比較簡單的設定如下:

由以上公式可知,f(err(k))的值在[0,1]區間變化,當偏差值|err(k)|大於分離區間a+b時,不對當前偏差err(k)進行累加;當偏差值|err(k)|小於b時,加入當前偏差err(k)進行累加;介於b和a+b的區間時,按一定函式關係隨err(k)變化。於是變積分pid演算法可以表示為:

上述的f(err(k))函式只是我們列舉的一種,事實上可以採取任何可行的方式,甚至是非線性函式,只要更符合控制物件的特性。

對於用增量型pid演算法的變積分表示如下:

看到這個公式,很多人可能會發覺與前面的積分分離演算法的公式很象。特別是在增量型演算法中,它們的形式確實是一樣的,但表達的意思確是有一定區別,那麼我們來看看有什麼不同呢?在後面我們再作總結。

變積分實際上是通過對偏差的判斷,讓積分以不同的速度累計。這一係數介於0-1之間,可以通過多種方式實現,在這裡我們按線性方式實現。變積分的控制流程圖如下:

首先實現乙個處理f(e(k))的函式,有前面的函式關係表示式,實現為響應的編碼就很簡單了:    

/* 變積分係數處理函式,實現乙個輸出0和1之間的分段線性函式           */

/* 當偏差的絕對值小於最小值時,輸出為1;當偏差的絕對值大於最大值時,輸出為0   */

/* 當偏差的絕對值介於最大值和最小值之間時,輸出在0和1之間現行變化    */

/* float error,當前輸入的偏差值                                         */

/* float absmax,偏差絕對值的最大值                                      */

/* float absmin,偏差絕對值的最小值                                      */

static float variableintegralcoefficient(floaterror,float absmax,float absmin)

elseif(abs(error)>absmax)

else

returnfactor;

}

變積分基於位置型pid的實現就是更具偏差絕對值的大小獲取變積分的係數。然後再實現pid演算法,同樣首先定義pid物件的結構體:

/*定義結構體和公用體*/

typedef struct

pid;

接下來實現pid控制器:

void pidregulation(pid *vpid, float processvalue)

同樣變積分基於增量型pid的實現也是一樣的。首先定義pid物件的結構體:

/*定義結構體和公用體*/

typedef struct

pid;

接下來實現pid控制器:

void pidregulation(pid *vpid, float processvalue)

變積分實際上有一定的專家經驗在裡面,因為限值的選取以及採用什麼樣的函式計算係數,有很大的靈活性。

我們在前面做了積分分離的演算法,這次又說了變積分的演算法。他們有相通的地方,也有不同的地方,下面對他們進行一些說明。

首先這兩種演算法的設計思想是有區別的。積分分離的思想是偏差較大時,取消積分;而偏差較小時引入積分。變積分的實現是想是設法改變積分項的累加速度,偏差大時減弱積分;而偏差小時強化積分。有些所謂改進型的積分分離演算法實際已經脫離了積分分離的基本思想,而是動態改變積分係數。就這一點而言,特別是在增量型演算法中,已經屬於變積分的思想了。

其次,對於積分分離來說,該操作是針對整個積分項操作,這一點在位置型pid演算法中,表現的尤為明顯。而對於變積分來說,是針對當前偏差的積分累計,就是說只影響當前這次的積分部分。再者,具體的實現方式也存在區別,特別是在位置型pid方式下尤為明顯。

我們在這裡討論它們的區別原因,佷顯然就是我們沒辦法同時採用這兩種優化方式,只能分別實現,在後面我們將實現基於積分項的優化。

PID控制器開發筆記之一 PID演算法原理及基本實現

在自動控制中,pid及其衍生出來的演算法是應用最廣的演算法之一。各個做自動控制的廠家基本都有會實現這一經典演算法。我們在做專案的過程中,也時常會遇到類似的需求,所以就想實現這一演算法以適用於更多的應用場景。1 pid演算法基本原理 pid演算法是控制行業最經典 最簡單 而又最能體現反饋控制思想的演算...

數字式梯形積分pid控制器matlab實現

前言 pid中積分的作用是消除穩態誤差,所以他很重要,為了提高他的運算精度,於是引入梯形積分。梯形積分公式 說明 普通pid的積分就是將誤差累加起來,而梯形積分就是將相鄰兩個差值的中值累加起來 注意梯形積分第乙個中值是第乙個差值的一半,因為公式中i從0開始 clear all close all 獲...

控制器開發 積分的使用方法

連續域的積分傳遞函式是1 s,而控制器是乙個離散的系統,所以須將連續的傳遞函式離散化,當然有公式推算,對於我這種基礎不大好的人理解起來費勁,所以使用matlab來解決這一問題。lcfun tf 0,1 1,0 連續函式1 s的分子是 0,1 分母是 1,0 ldfun c2d lcfun,1e 3,...