ADRC-active disturbance rejection control-自抗擾控制器
ADRC自抗擾控制基本思想要點:
1.標準型與總擾動,擴張狀態與擾動整體辨識,微分訊號生成與安排過渡過程以及擾動的消減與控制量產生。
ADRC主要構成:
1)跟蹤微分器(TD)---the tracking differentiator –跟蹤微分器
解決由不連續或帶隨機噪聲的量測訊號,合理提取連續訊號(跟蹤給定)及微分訊號的問題。
根據微分輸出與最速綜合函式,可以安排閉環系統的過渡過程。
以單位階躍訊號為例,經過跟蹤微分器的過渡,產生的輸出效果為:
特點:1>使誤差反饋增益和誤差微分增益選取範圍擴大
2>使給定的反饋增益所適應的物件引數
2)擴張狀態觀測器(ESO)--extended state observer –擴充套件狀態觀測器
狀態觀測器將影響被控物件輸出的擾動作用擴張成新的狀態變數,通過特殊的反饋機制觀測被擴張的總擾動訊號
通過輸入,輸出構建總擾動為一個狀態變數,二階的系統,他的擴張觀測器達到三階,加入了總擾動的狀態。
總擾動中包含系統內部擾動和外部高頻噪聲干擾,
擴張狀態觀測器的輸出為:Z1=y ,Z2=dy ,Z3(觀測到的系統總擾動)‘
3)非線性狀態誤差反饋控制律(NLSEF)--nonlinear state error feedback –非線性狀態誤差反饋
根據跟蹤微分器(TD)得出的給定訊號和給定訊號的微分與狀態觀測器觀測到的系統輸出和輸出的導數的誤差,進而進行控制和擾動補償,非線性控制方法由fal或最速控制綜合函式Fhan構造。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
經典PID
優點 :
1.僅由誤差來決定控制
2.運算量低,可以以極高的速率執行
缺點:
1.誤差函式採用
e=v−y
的形式不太合理,比如輸入階躍訊號的時候,會導致誤差函式也是一個階躍訊號,對控制的穩定性有影響
2.在經典PID裡面需要計算誤差訊號的微分,但是根本無法嚴格的計算微分訊號,只能使用近似計算
3.經典PID的比例、誤差、積分項是線性組合輸出最後的控制量的,線性組合並不是一個最優的組合方案
4.嚴格上來說,積分項雖然消除了靜態固有誤差,但是會大大影響控制的穩定效能
針對上面的四個缺點,ADRC分別提出了改進方法,如下:
1》transient profile generator–經典微分器
為了防止跳變訊號,對訊號作如下處理,其實也就是下面的跟蹤微分器:
如下圖所示,使用這種變換實際上是模仿最短時間到達一個點的概念,在到達平衡位置處前恆定加速運動,過平衡位置後恆定減速運動,使目標點在規定的加速度下以最短的時間到達目標點,並且到達速度為零,其中v是當前位置
此外在計算機中或者模擬中只能使用離散時間的解決方案,因此,解決方案可以表示為
其中,
1》--1)跟蹤微分器(TD)---the tracking differentiator –跟蹤微分器
這裡解釋為什麼要改進經典的微分器,實際上,使用經典PID裡面的微分器會很大的放大訊號噪聲。如果使用經典的微分器,當附加上噪聲n(t)的時候
即:取樣週期越短,噪聲被放大越大,因此採用如下改進:
nonlinear weighted sum--非線性加權和
在使用了跟蹤微分器之後,一個輸入實際上變成了兩個輸入e1=v1−x1,e2=v2−x2,為訊號的誤差和訊號誤差的微分,這裡利用這兩個訊號來組合得到控制輸出,ADRC裡面採用非線性的組合方式,使用了一個函式如下所示
fal函式具有小誤差,大增益;大誤差,小增益的特性,十分適合用於控制,可以減少控制誤差,最後的非線性PID可以寫作
這是跟蹤微分控制器的離散方程,看方程其實就很直接。
h:為時間尺度 MATLAB的模擬步長為0.001 所以 h = 0.001
Simulink 模型裡的TD 有一個輸入狀態,經過TD安排過渡時間,計算fst(快速控制最優綜合函式)後,會得到兩個輸出v1 目標狀態,v2系統的微分。
這是TD的內部結構,和公式裡面的一樣,就是跟蹤微分的階躍響應公式。fst 輸入的第一個引數為
v1(t) - v0(t).在結構圖裡,就是v1-v,之後的結構對照公式即可看明白。
這裡看一下對TD的模擬波形圖:
基本上很好的跟蹤上了正弦波。
這裡提示一下TD模型裡的引數修改的地方。在這個模型裡只有兩個引數r,h.
雙擊1,再選擇2的地方就可以了。然後設定3處的兩個引數;
2)擴張狀態觀測器(ESO)--extended state observer –擴充套件狀態觀測器
最後的擴張狀態觀測器也是最重要的一個模組,此處不需要誤差積分模組了,ESO給出了系統未知狀態和未知干擾的估計和補償。假設外部的干擾為f(x1,x2,ω,t)控制訊號為u,系統可以被表示為
之後增加一個新的狀態x3用於表示干擾,最後ESO可以被寫作
其中引數一個例子是β01=1,β02=1/2h0.5,β03=2/25*h1.2.輸入輸出如下圖所示
最終整個系統函式和框圖如下圖所示
ADRC系統函式表示
整個ADRC系統框圖表示
這裡綜合參考資料裡面的結論,提煉幾點:
1. ADRC系統的系統階數由系統的相對階數決定
2. 安排過渡過程解決快速控制和超調的矛盾
3. 不適用積分項也可以消除靜態誤差,避免積分副作用
4. ADRC的關鍵創新點其實在與ESO模組,也就是擴充套件狀態觀測器模組,他將所有不知道的影響歸納為一箇中間控制量加入系統之中,可以很好的提高系統的抗干擾性能
5. ADRC中系統分類,不是按照線性、非線性、時變和時不變來分,而是按照系統的”時間尺度”來分類
參考資料:
1.韓京清.從PID技術到“自抗擾控制”技術[J].控制工程,2002,9(3):13-18
2.韓京清. 非線性PID控制器[J]. 自動化學報, 1994, 20(4):487-490.
3.韓京清. 自抗擾控制技術[J]. 前沿科學,2007,1(1):24-31
轉載自:https://blog.csdn.net/mrhcat/article/details/71424198,https://blog.csdn.net/qq_34445388/article/details/79705968 僅為學習使用!
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
產品化ADRC:SpinTAC Motion Control Suite (Featuring ADRC)
SpinTAC使用了自抗擾控制器(ADRC,Active Disturbance Rejection Control),自抗擾控制器能夠對系統擾動進行實時估算並補償,其所要整定的引數只有一個即頻寬,一旦整定,控制器可以工作在較寬的轉速和負載範圍內。
觀察TI提供的Demo程式,可以發現,ADC中斷中,在FOC執行之前運行了SpinTAC控制。
// Run the SpinTAC Components if(stCnt++ >= ISR_TICKS_PER_SPINTAC_TICK) { ST_runVelCtl(stHandle, ctrlHandle); stCnt = 1; } // run the controller CTRL_run(ctrlHandle,halHandle,&gAdcData,&gPwmData);
進入ST_runVelCtl()函式,可以發現其輸出就是轉矩參考值,即Iq參考值,作為q軸電流PI調節器的輸入。
void ST_runVelCtl(ST_Handle handle, CTRL_Handle ctrlHandle) { _iq speedFeedback, iqReference; ST_Obj *stObj = (ST_Obj *)handle; CTRL_Obj *ctrlObj = (CTRL_Obj *)ctrlHandle; // Get the mechanical speed in pu speedFeedback = EST_getFm_pu(ctrlObj->estHandle); // Run the SpinTAC Controller // Note that the library internal ramp generator is used to set the speed reference STVELCTL_setVelocityReference(stObj->velCtlHandle, TRAJ_getIntValue(ctrlObj->trajHandle_spd)); STVELCTL_setAccelerationReference(stObj->velCtlHandle, _IQ(0.0)); STVELCTL_setVelocityFeedback(stObj->velCtlHandle, speedFeedback); STVELCTL_run(stObj->velCtlHandle); // select SpinTAC Velocity Controller iqReference = STVELCTL_getTorqueReference(stObj->velCtlHandle); // Set the Iq reference that came out of SpinTAC Velocity Control CTRL_setIq_ref_pu(ctrlHandle, iqReference); }