電流環(huán)實戰(zhàn)應(yīng)用)
1. 項目概述從PID到ADRC控制算法的“降維打擊”在工業(yè)控制、機(jī)器人、電力電子這些領(lǐng)域摸爬滾打久了你一定會對PID控制器又愛又恨。愛它的簡單直觀幾個參數(shù)調(diào)來調(diào)去大部分時候都能讓系統(tǒng)“動起來”恨它的“嬌氣”面對非線性、強耦合、大時滯或者外部擾動PID就像個經(jīng)驗不足的舵手要么反應(yīng)遲鈍要么劇烈震蕩調(diào)參調(diào)到懷疑人生是常有的事。我當(dāng)年調(diào)試一個伺服系統(tǒng)為了應(yīng)對負(fù)載突變PID參數(shù)前前后后改了不下五十版最后還是加了前饋和各種濾波才勉強能用過程極其痛苦。后來接觸到自抗擾控制ADRC感覺像是打開了一扇新世界的大門。它不像一些現(xiàn)代控制理論那樣需要精確的數(shù)學(xué)模型也不像模糊控制、神經(jīng)網(wǎng)絡(luò)那樣“黑箱”。ADRC的核心思想非?!鞍缘馈辈还芟到y(tǒng)內(nèi)部具體是什么結(jié)構(gòu)也不管外部來了什么妖魔鬼怪?jǐn)_動我統(tǒng)統(tǒng)把它們打包成一個“總擾動”然后實時估計并補償?shù)?。剩下的就是一個被我“馴化”好的、簡單的積分串聯(lián)型系統(tǒng)用最簡單的控制律就能搞定。這種“觀測-補償”的思路對于咱們這些一線工程師來說直觀又實用。最近在搞永磁同步電機(jī)的電流環(huán)控制傳統(tǒng)的PI調(diào)節(jié)器在高速弱磁區(qū)或者參數(shù)變化時性能下降明顯。換上ADRC后動態(tài)響應(yīng)和抗擾能力提升了一個檔次參數(shù)也更好整定。網(wǎng)上流傳的ADRC算法m文件我也研究過不少有的寫得很精妙有的則存在理解偏差。今天我就結(jié)合自己的實戰(zhàn)經(jīng)驗把ADRC從核心思想到代碼實現(xiàn)掰開揉碎了講清楚目標(biāo)是讓你看完就能理解原理并且能動手在自己的項目里嘗試應(yīng)用。2. ADRC核心思想與架構(gòu)拆解把復(fù)雜問題“打包”解決ADRC的發(fā)明者韓京清研究員提出這一理論時目標(biāo)很明確找到一種既不依賴精確模型又能實現(xiàn)高性能魯棒控制的方法。它的整體架構(gòu)可以概括為“三部分”跟蹤微分器TD、擴(kuò)張狀態(tài)觀測器ESO和非線性狀態(tài)誤差反饋NLSEF。咱們先拋開這些術(shù)語用個生活化的例子來理解。想象一下你在開車目標(biāo)是讓車速穩(wěn)定在100km/h。傳統(tǒng)的PID控制器就像是你只盯著速度表當(dāng)前誤差發(fā)現(xiàn)慢了就多踩點油門發(fā)現(xiàn)快了就松一點。但如果遇到上坡負(fù)載擾動、逆風(fēng)外部擾動或者車子本身發(fā)動機(jī)響應(yīng)特性變了模型不確定性你這個“只看速度表”的策略就會很被動容易產(chǎn)生超調(diào)或調(diào)節(jié)緩慢。ADRC的做法則像是一個經(jīng)驗豐富的老司機(jī)搭配一個智能副駕智能副駕TD他不滿足于當(dāng)前速度還會根據(jù)路況和你想要的速度規(guī)劃出一條平滑過渡的理想速度曲線。比如從80加速到100他不會讓你瞬間踩到底而是規(guī)劃一個既快速又平緩的加速過程避免沖擊。這就是TD的作用——安排過渡過程并提取出理想的系統(tǒng)狀態(tài)比如理想位置、理想速度。超級雷達(dá)ESO這是ADRC的靈魂。這個雷達(dá)不僅能看到車的實際速度和位置系統(tǒng)輸出還能實時“看見”并估算出所有影響車速的因素總和包括你踩的油門控制量、上坡的阻力、逆風(fēng)、發(fā)動機(jī)的損耗等等。它把這些亂七八糟的東西全部打包估算成一個叫做“總擾動”的信號。ESO的強大之處在于它不需要知道坡有多陡、風(fēng)有多大它只通過觀察車的實際運動就能把這個“總擾動”實時算出來。決策大腦NLSEF大腦拿到兩個信息一是智能副駕規(guī)劃的理想狀態(tài)來自TD二是超級雷達(dá)提供的實際狀態(tài)和總擾動估計來自ESO。大腦計算兩者的誤差并根據(jù)誤差的大小和變化率以一種非線性的方式比如誤差很大時增益大誤差很小時增益小避免高頻顫振計算出最初的控制力。但是這還沒完最關(guān)鍵的一步來了大腦會從初步控制力中減去雷達(dá)估算出的“總擾動”。這樣一來實際作用到車子上的控制指令就相當(dāng)于是在一個“無擾動”的理想環(huán)境下發(fā)出的指令。所以ADRC的流程就是規(guī)劃理想軌跡 - 觀測并估計所有內(nèi)外部擾動 - 基于理想軌跡和實際狀態(tài)的誤差計算控制量 - 補償?shù)艄烙嫷臄_動 - 得到最終控制指令。經(jīng)過這樣的處理無論系統(tǒng)本身多復(fù)雜外部環(huán)境多惡劣被控對象在控制器“眼”里都近似變成了一個簡單的、干凈的積分器串聯(lián)型系統(tǒng)自然就好控制了。這就是其“自抗擾”能力的根源——自己抵抗、補償擾動。2.1 核心組件一跟蹤微分器TD—— 柔化指令提取微分TD經(jīng)常被初學(xué)者忽略覺得它不就是給個設(shè)定值嗎其實它的作用至關(guān)重要。直接給系統(tǒng)一個階躍設(shè)定值相當(dāng)于要求輸出瞬間跳變這對于物理系統(tǒng)來說意味著需要無窮大的能量和控制力必然引起劇烈沖擊和超調(diào)。TD的核心作用是“安排過渡過程”。它接收一個跳變的指令信號v然后輸出一個平滑的跟蹤信號v1及其微分v2。最經(jīng)典的TD算法是韓老師提出的最速控制綜合函數(shù)fhan離散形式。它的內(nèi)部是一個離散差分方程通過非線性反饋使得v1能以最快速度無超調(diào)地跟蹤上v同時v2是v1的合理微分避免了直接數(shù)值微分的噪聲放大問題。在實際編程中比如寫那個ADRC算法m文件TD的代碼可能長這樣function [v1, v2] TD(v, v1, v2, h, r) % v: 當(dāng)前目標(biāo)值 % v1, v2: 上一時刻的跟蹤值及其微分 % h: 離散積分步長 % r: 速度因子決定跟蹤快慢 d r * h; d0 h * d; y v1 - v h * v2; a0 sqrt(d*d 8*r*abs(y)); a v2 (a0 - d)/2 * sign(y); if abs(y) d0 a v2 sign(y) * r; end v2 v2 h * fsg(a, d, r); % fsg是一個符號函數(shù) v1 v1 h * v2; end注意參數(shù)r非常關(guān)鍵。r越大跟蹤速度越快但會對噪聲更敏感。通常需要根據(jù)系統(tǒng)響應(yīng)能力和采樣頻率來調(diào)整。h就是你的控制周期。2.2 核心組件二擴(kuò)張狀態(tài)觀測器ESO—— 擾動估計的靈魂ESO是ADRC實現(xiàn)“抗擾”的核心。它的思想是將系統(tǒng)的總擾動包括未建模動態(tài)和外部擾動擴(kuò)張成一個新的狀態(tài)變量然后設(shè)計一個觀測器對這個新狀態(tài)即擾動進(jìn)行實時估計。假設(shè)我們有一個二階系統(tǒng)很多電機(jī)、位置控制都可以簡化成二階? f(y, ?, w, t) b*u其中f是未知的內(nèi)部動態(tài)和外部擾動w的總和b是控制增益通常可粗略估計。ESO把這個系統(tǒng)重新表述為?1 x2?2 x3 b*u?3 ?假設(shè)擾動變化率有界y x1這里x1是系統(tǒng)輸出yx2是輸出的微分?而x3就是我們擴(kuò)張出來的狀態(tài)用來代表總擾動f。然后我們設(shè)計一個龍伯格觀測器Luenberger Observer來估計這三個狀態(tài)e z1 - y觀測誤差?1 z2 - β01 * e?2 z3 - β02 * e b*u?3 -β03 * e其中z1, z2, z3分別是x1, x2, x3的估計值。β01, β02, β03是觀測器增益需要精心配置以保證觀測器穩(wěn)定且快速。觀測器收斂后z3就會實時跟蹤上總擾動f。這樣我們就“看見”了擾動。在實際的ADRC電流環(huán)設(shè)計中y就是反饋的電流值u是電壓指令z3估計的就是反電動勢、電阻電感參數(shù)變化、死區(qū)效應(yīng)等所有擾動之和。2.3 核心組件三非線性狀態(tài)誤差反饋NLSEF與擾動補償有了TD給出的理想狀態(tài)v1, v2和ESO給出的實際狀態(tài)估計z1, z2以及擾動估計z3我們就可以計算控制了。首先計算誤差e1 v1 - z1位置/電流誤差e2 v2 - z2速度/電流微分誤差然后NLSEF采用一個非線性函數(shù)來處理這些誤差經(jīng)典的是“fal”函數(shù)fal(e, α, δ) |e|^α * sign(e), 當(dāng) |e| δfal(e, α, δ) e / δ^(1-α), 當(dāng) |e| ≤ δ其中0 α 1δ 0。這個函數(shù)的特點是大誤差時增益大提高響應(yīng)速度小誤差時增益小避免高頻顫振和平滑控制。δ是一個線性區(qū)間防止在零點附近因函數(shù)不平滑導(dǎo)致的抖動。那么初步的控制量u0為u0 β1 * fal(e1, α1, δ) β2 * fal(e2, α2, δ)β1和β2是誤差增益。最后執(zhí)行關(guān)鍵的擾動補償u (u0 - z3) / b這里b就是ESO里那個粗略的控制增益估計。這個公式的意義在于計算出的理想控制力u0減去觀測到的擾動z3再除以增益b就得到了最終應(yīng)該施加的控制量u。經(jīng)過這樣的補償系統(tǒng)方程近似變成了? ≈ u0一個簡單的雙重積分器非常好控制。3. ADRC參數(shù)整定與工程化實踐理論很美但落到代碼上參數(shù)整定是逃不過的坎。ADRC參數(shù)看起來比PID多TD的rhESO的β01, β02, β03, bNLSEF的β1, β2, α1, α2, δ但其實有很強的物理意義和整定規(guī)律并非盲目調(diào)試。3.1 “帶寬法”參數(shù)整定化繁為簡這是工程上最常用、最有效的方法由高志強教授提出將觀測器和控制器的性能與“帶寬”這一概念掛鉤極大簡化了調(diào)參。ESO參數(shù)整定將ESO的特征多項式配置為(s ω_o)^3其中ω_o稱為觀測器帶寬。通過極點配置可以推導(dǎo)出β01 3ω_oβ02 3ω_o^2β03 ω_o^3這樣一來ESO的三個增益就由一個參數(shù)ω_o決定了。ω_o越大觀測器收斂越快對擾動的估計能力越強但同時對測量噪聲也越敏感。一般ω_o設(shè)為系統(tǒng)期望閉環(huán)帶寬的3~10倍。參數(shù)b需要大致估計它代表了控制量對輸出的增益比如在電流環(huán)中b ≈ 1/L電感倒數(shù)估不準(zhǔn)沒關(guān)系ESO有一定的魯棒性但偏差太大會影響性能??刂破鲄?shù)整定將誤差反饋律線性化即取α1α21δ設(shè)大點其閉環(huán)特征多項式可配置為(s ω_c)^2其中ω_c稱為控制器帶寬??梢酝茖?dǎo)出β1 ω_c^2β2 2ω_cω_c直接決定了系統(tǒng)的響應(yīng)速度。ω_c越大響應(yīng)越快但控制量會越大也可能激發(fā)未建模的高頻動態(tài)。通常ω_c應(yīng)小于ω_o的1/3到1/5以保證觀測器比控制器更快能及時提供準(zhǔn)確的擾動估計。TD參數(shù)整定速度因子r決定了跟蹤設(shè)定值的最大加速度。理論上r可以很大但受限于執(zhí)行機(jī)構(gòu)物理極限和采樣頻率。步長h就是控制周期。通常先設(shè)一個較大的r觀察v1的跟蹤曲線只要不超出執(zhí)行機(jī)構(gòu)能力且平滑即可。通過“帶寬法”我們將調(diào)參從8-9個減少到3個核心參數(shù)ω_o觀測器帶寬、ω_c控制器帶寬、b控制增益估計。r和h相對獨立。非線性參數(shù)α1, α2, δ在初步整定時可以先設(shè)為1即線性系統(tǒng)穩(wěn)定后再微調(diào)以優(yōu)化性能。α通常取0.5~0.75δ取采樣周期附近的值。3.2 工程實現(xiàn)要點與代碼結(jié)構(gòu)當(dāng)你動手寫那個ADRC算法m文件或C代碼時結(jié)構(gòu)應(yīng)該清晰。以下是一個面向?qū)ο蟮碾x散ADRC二階控制器偽代碼框架非常適合嵌入式實現(xiàn)classdef ADRC_2nd properties % TD 參數(shù) h, r; v1, v2; % TD狀態(tài) % ESO 參數(shù) beta01, beta02, beta03, b; z1, z2, z3; % ESO狀態(tài) % NLSEF 參數(shù) beta1, beta2, alpha1, alpha2, delta; % 其他 u_last; % 上一拍控制量用于補償 end methods function obj ADRC_2nd(h, r, wo, wc, b_est) % 初始化 obj.h h; obj.r r; obj.v1 0; obj.v2 0; % 帶寬法設(shè)置ESO增益 obj.beta01 3*wo; obj.beta02 3*wo^2; obj.beta03 wo^3; obj.b b_est; obj.z1 0; obj.z2 0; obj.z3 0; % 帶寬法設(shè)置控制器增益線性 obj.beta1 wc^2; obj.beta2 2*wc; obj.alpha1 1; obj.alpha2 1; % 先線性 obj.delta h; % 線性區(qū)間設(shè)為步長 obj.u_last 0; end function [u, states] update(obj, target, feedback) % 1. TD更新 [obj.v1, obj.v2] fhan(target, obj.v1, obj.v2, obj.h, obj.r); % 2. ESO更新 e_eso obj.z1 - feedback; obj.z1 obj.z1 obj.h * (obj.z2 - obj.beta01 * e_eso); obj.z2 obj.z2 obj.h * (obj.z3 - obj.beta02 * e_eso obj.b * obj.u_last); obj.z3 obj.z3 obj.h * (-obj.beta03 * e_eso); % 3. 計算誤差和非線性反饋 e1 obj.v1 - obj.z1; e2 obj.v2 - obj.z2; fe1 fal(e1, obj.alpha1, obj.delta); fe2 fal(e2, obj.alpha2, obj.delta); u0 obj.beta1 * fe1 obj.beta2 * fe2; % 4. 擾動補償 u (u0 - obj.z3) / obj.b; % 5. 限幅和保存 u saturate(u, umin, umax); % 執(zhí)行器飽和 obj.u_last u; states [obj.v1, obj.v2, obj.z1, obj.z2, obj.z3]; end end end這個框架在每個控制周期被調(diào)用一次輸入當(dāng)前目標(biāo)值和系統(tǒng)反饋輸出控制量。清晰的狀態(tài)更新和分離的模塊便于調(diào)試和監(jiān)控。4. 在電機(jī)電流環(huán)中的應(yīng)用與調(diào)試實錄將ADRC應(yīng)用于永磁同步電機(jī)PMSM的電流環(huán)是檢驗其性能的絕佳場景。電流環(huán)要求響應(yīng)快、抗擾強傳統(tǒng)的PI調(diào)節(jié)器在d-q軸解耦和反電動勢擾動上需要精細(xì)補償而ADRC可以將其視為總擾動一并估計補償。4.1 模型建立與參數(shù)設(shè)計PMSM在同步旋轉(zhuǎn)坐標(biāo)系下的電壓方程忽略磁飽和等為u_d R*i_d L_d*di_d/dt - ω_e*L_q*i_qu_q R*i_q L_q*di_q/dt ω_e*(L_d*i_d ψ_f)其中ω_e是電角速度ψ_f是永磁體磁鏈??梢钥吹絨軸電壓方程中包含了反電動勢項ω_e*ψ_f和耦合項ω_e*L_d*i_d這些都是PI控制器需要額外處理的前饋或解耦項。在ADRC框架下我們可以將每個電流環(huán)d軸和q軸獨立建模為一個一階系統(tǒng)因為電壓方程本身是一階微分方程di/dt ( -R*i 耦合項/反電動勢 擾動 b*u ) / L這里我們把-R*i/L作為部分已知動態(tài)可以歸入b*u或作為已知擾動補償而把耦合項、反電動勢、參數(shù)變化、測量噪聲等所有其他因素都打包進(jìn)“總擾動”f。于是模型簡化為di/dt f b*u其中b可以粗略取為1/L或1/L_d,1/L_q。因此我們需要為每個電流環(huán)設(shè)計一個一階ADRC因為系統(tǒng)是一階的。一階ADRC比二階更簡單TD安排電流指令的過渡過程輸出平滑的指令v1。ESO擴(kuò)張成一階觀測器估計電流z1和總擾動z2。NLSEF計算誤差e1 v1 - z1并生成u0。補償u (u0 - z2) / b。參數(shù)整定依然用帶寬法。對于電流環(huán)響應(yīng)要求很高假設(shè)期望電流環(huán)帶寬為f_c 1000 Hz則ω_c 2*π*f_c。觀測器帶寬ω_o可取(3~5)*ω_c。b取1/L的標(biāo)稱值。4.2 調(diào)試步驟與問題排查在實際電機(jī)平臺上調(diào)試ADRC電流環(huán)我建議遵循以下步驟準(zhǔn)備工作確保你的電流采樣、PWM驅(qū)動、Clark/Park變換等基礎(chǔ)環(huán)節(jié)正確無誤。先用一個非常保守的PI控制器讓電機(jī)轉(zhuǎn)起來作為基準(zhǔn)。初始化與參數(shù)注入將一階ADRC參數(shù)寫入代碼。開始時將ω_c和ω_o設(shè)小比如對應(yīng)100Hz帶寬b值給準(zhǔn)NLSEF先設(shè)為線性α1。TD的r先設(shè)一個中等值。開環(huán)測試ESO這是關(guān)鍵一步在電機(jī)靜止或低速空載下給一個很小的、恒定的電壓指令u同時讓ADRC算法運行但不使用其輸出的u而是用你給定的那個小電壓。觀察ESO估計的電流z1是否跟蹤實際反饋電流i估計的擾動z2是否穩(wěn)定在一個值附近。如果z1跟蹤良好說明ESO基本工作正常。你可以故意改變一點b值看ESO的z2如何變化來補償這個建模誤差。閉環(huán)測試與帶寬提升將ADRC的輸出u接入系統(tǒng)形成閉環(huán)。給定一個小的階躍電流指令。逐步增大ω_c控制器帶寬觀察電流響應(yīng)速度。同時按比例增大ω_o保持ω_o 3ω_c。你會看到電流響應(yīng)越來越快。注意監(jiān)控控制量u即電壓指令確保沒有飽和。也要觀察估計的擾動z2在負(fù)載突變時它應(yīng)該快速變化以抵消擾動。引入非線性與抗擾測試當(dāng)線性ADRC工作穩(wěn)定后可以嘗試引入非線性fal函數(shù)。將α設(shè)為0.5或0.75δ設(shè)為幾個采樣周期的誤差值。這通常能進(jìn)一步平滑小誤差段的控制減少高頻噪聲。然后進(jìn)行抗擾測試突加負(fù)載、快速升降速對比ADRC和PI的電流跟蹤波形和恢復(fù)時間。常見問題與排查表現(xiàn)象可能原因排查與解決思路系統(tǒng)發(fā)散、振蕩1.ω_o或ω_c過大超出系統(tǒng)有效帶寬。2. 參數(shù)b估計嚴(yán)重偏差。3. 控制量飽和未處理。1. 大幅降低ω_o和ω_c從很慢的響應(yīng)開始調(diào)。2. 檢查b值符號和量級??赏ㄟ^開環(huán)ESO測試給一個階躍u看z1的變化斜率斜率應(yīng)約等于b*u。3. 在輸出u后加入硬限幅并將限幅后的值反饋給ESO如上面?zhèn)未a的u_last這是關(guān)鍵ESO估計值z1有較大靜差1. ESO增益不足觀測器收斂慢。2. 測量反饋y有恒定偏差或噪聲過大。1. 適當(dāng)增大ω_o提高觀測器帶寬。2. 檢查電流采樣校準(zhǔn)和濾波。ESO本身有一定濾波作用但前端噪聲過大會影響估計精度。擾動估計z2噪聲大1.ω_o過高放大了測量噪聲。2. 反饋信號y噪聲大。1. 降低ω_o在響應(yīng)速度和噪聲抑制間折衷。2. 對反饋信號y進(jìn)行一階低通濾波但需注意引入相位滯后?;蛘呖梢钥紤]使用降階ESO等變體。動態(tài)響應(yīng)慢不如PI1.ω_c設(shè)置過低。2. TD的r過小指令過渡太慢。3. 非線性參數(shù)α太小或δ太大導(dǎo)致誤差增益始終很低。1. 在穩(wěn)定前提下逐步增大ω_c。2. 增大TD的r。3. 檢查fal函數(shù)輸出確保在動態(tài)過程中e較大時非線性函數(shù)能輸出足夠大的值??蓵簳r切回線性α1對比。切換負(fù)載時電流恢復(fù)慢擾動估計z2響應(yīng)不夠快。增大ω_o提高觀測器對擾動變化的跟蹤速度。同時檢查b值是否準(zhǔn)確不準(zhǔn)確的b會降低補償效率。4.3 實測心得與進(jìn)階技巧經(jīng)過多個項目的實踐我總結(jié)出幾點心得“b”值不必精確ESO對b有很強的魯棒性。b的估計值在真實值的0.5到2倍范圍內(nèi)系統(tǒng)通常都能穩(wěn)定工作只是性能略有差異。這大大降低了工程應(yīng)用門檻。TD并非必須對于很多伺服系統(tǒng)指令本身變化并不劇烈或者對指令跟蹤的平滑性要求不高時可以省略TD直接用目標(biāo)指令作為v1其微分v2設(shè)為0。這能簡化算法特別是在一階ADRC中。注意離散化與計算延時上面給出的ESO和TD公式都是歐拉離散化。在高帶寬或低采樣率下可能需要更高精度的離散化方法如雙線性變換。另外從采樣、計算到PWM更新產(chǎn)生的固有延時通常1-2個控制周期會影響高帶寬下的穩(wěn)定性必要時需要在ESO模型或控制律中考慮延時補償。從一階ADRC開始很多物理系統(tǒng)如電流環(huán)、溫度控制本質(zhì)是一階的。從一階ADRC入手參數(shù)更少ω_o,ω_c,b調(diào)試更簡單理解更深刻成功后再擴(kuò)展到二階位置/速度環(huán)。與現(xiàn)有框架融合你不需要完全拋棄現(xiàn)有的控制框架。例如可以在原有PI電流環(huán)的基礎(chǔ)上保留PI作為誤差反饋即u0的計算然后加上ESO進(jìn)行擾動估計和補償形成一種“PI擾動觀測器”的復(fù)合結(jié)構(gòu)這是一種平滑的遷移策略。ADRC的魅力在于它提供了一種統(tǒng)一、強大的框架來處理不確定性和擾動。它不一定在所有場景下都碾壓PID但在模型不確定性強、擾動頻繁的場合其優(yōu)勢非常明顯。調(diào)試的關(guān)鍵在于理解帶寬參數(shù)ω_o和ω_c的物理意義以及ESO那個“擾動估計與補償”的核心動作。當(dāng)你看到在負(fù)載突加時z2瞬間跳變并抵消了擾動電流幾乎無靜差地恢復(fù)跟蹤那一刻你就會覺得之前所有的調(diào)試都是值得的。