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); }