ADRC自抗擾控制基本思想要點:函數
1.標準型與總擾動,擴張狀態與擾動總體辨識,微分信號生成與安排過渡過程以及擾動的消減與控制量產生。性能
ADRC主要構成:學習
1)跟蹤微分器(TD)---the tracking differentiator –跟蹤微分器ui
解決由不連續或帶隨機噪聲的量測信號,合理提取連續信號(跟蹤給定)及微分信號的問題。spa
根據微分輸出與最速綜合函數,能夠安排閉環系統的過渡過程。.net
以單位階躍信號爲例,通過跟蹤微分器的過渡,產生的輸出效果爲:3d
特色:1>使偏差反饋增益和偏差微分增益選取範圍擴大code
2>使給定的反饋增益所適應的對象參數範圍擴大,提升魯棒性server
2)擴張狀態觀測器(ESO)--extended state observer –擴展狀態觀測器xml
狀態觀測器將影響被控對象輸出的擾動做用擴張成新的狀態變量,經過特殊的反饋機制觀測被擴張的總擾動信號
經過輸入,輸出構建總擾動爲一個狀態變量,二階的系統,他的擴張觀測器達到三階,加入了總擾動的狀態。
總擾動中包含系統內部擾動和外部高頻噪聲干擾,
擴張狀態觀測器的輸出爲:Z1=y ,Z2=dy ,Z3(觀測到的系統總擾動)‘
3)非線性狀態偏差反饋控制律(NLSEF)--nonlinear state error feedback –非線性狀態偏差反饋
根據跟蹤微分器(TD)得出的給定信號和給定信號的微分與狀態觀測器觀測到的系統輸出和輸出的導數的偏差,進而進行控制和擾動補償,非線性控制方法由fal或最速控制綜合函數Fhan構造。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
優勢 :
1.僅由偏差來決定控制
2.運算量低,能夠以極高的速率運行
缺點:
1.偏差函數採用
e=v−y
的形式不太合理,好比輸入階躍信號的時候,會致使偏差函數也是一個階躍信號,對控制的穩定性有影響
2.在經典PID裏面須要計算偏差信號的微分,可是根本沒法嚴格的計算微分信號,只能使用近似計算
3.經典PID的比例、偏差、積分項是線性組合輸出最後的控制量的,線性組合並非一個最優的組合方案
4.嚴格上來講,積分項雖然消除了靜態固有偏差,可是會大大影響控制的穩定性能
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 僅爲學習使用!
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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); }