【PMSM】二. 经典电流环、速度环设计(下)
上一篇文章討論了永磁無刷電機電流環、速度環的建模和控制器的參數整定,這篇文章會討論前饋、濾波、抗飽和算法以及其他一些要注意的細節,且包含了大量工程經驗。結合這兩篇文章的內容,我們可以完整地使用經典 PI 控制器實現電機轉速的控制。
一. 前饋
不考慮功率變換器和純延時環節,系統雙環傳遞函數如下:
永磁無刷電機的 DQ 軸電壓方程如下:
{ud=Rid+Lddiddt?ωeLqiquq=Riq+Lqdiqdt+ωe(Ldid+?f)\begin{cases} u_d=Ri_d+L_d\frac{di_d}{dt}-\omega_eL_qi_q\\ u_q=Ri_q+L_q\frac{di_q}{dt}+\omega_e\left( L_di_d+\phi _f \right)\\ \end{cases} {ud?=Rid?+Ld?dtdid???ωe?Lq?iq?uq?=Riq?+Lq?dtdiq??+ωe?(Ld?id?+?f?)?
可以看到,udu_dud? 不僅和 idi_did? 有關,同時還和 iqi_qiq? 有關;uqu_quq? 不僅和 iqi_qiq? 有關,還和 idi_did? 有關。換句話說,DQ 軸之間存在耦合。如果我們簡單地使用兩個 PI 控制器去分別控制 DQ 軸,那么耦合一定會影響控制器的性能,但幸運的是,在任何一個時刻 ?ωeLqiq-\omega_eL_qi_q?ωe?Lq?iq? 以及 ωe(Ldid+?f)\omega_e(L_di_d+\phi_f)ωe?(Ld?id?+?f?) 是確定的,與偏差無關,故我們可以使用前饋進行直接補償,在 Q 軸控制器的輸出上加上 ωe(Ldid+?f)\omega_e(L_di_d+\phi_f)ωe?(Ld?id?+?f?),在 D 軸控制器的輸出上加上?ωeLqiq-\omega_eL_qi_q?ωe?Lq?iq? 。
理想情況下,通過這樣的方法,我們可以完美地補償掉反電動勢帶來的影響,實現 DQ 軸的完全解耦。但事實上卻并不是這樣,一方面,我們在進行前饋補償時需要用到 iq,id,ωei_q,\,i_d,\,\omega_eiq?,id?,ωe?,但采樣得到的電流和轉速通常有比較大的噪聲;而另一方面,前饋中還包含 Ld,Lq,?fL_d,\,L_q,\,\phi_fLd?,Lq?,?f? 等電機參數,我們獲取到的電機參數很可能不準確,并且電機在高速旋轉時,自身的參數也會發生攝動。
把一個沒有那么準確且包含噪聲的前饋直接加到控制器的輸出上作為 DQ 軸電壓的一部分,帶來的負面作用很可能高于 DQ 軸解耦的正面作用,嚴重時甚至可能導致系統失穩。
所以,是否使用前饋需要根據典型工況、性能指標、軟硬件性能等因素綜合考慮。如果引入前饋會帶來正面效果,那么就使用前饋。
前饋的使用在工程上非常靈活。在大部分情況下,采樣得到的 id,iqi_d,\,i_qid?,iq? 中包含的噪聲要大于 ωe\omega_eωe? 中的噪聲,那么我們完全可以只補償 ωe?f\omega_e\phi_fωe??f?,實現 DQ 軸的部分解耦。
除此之外,在工程上還可以使用各種低通濾波器濾除掉 iq,id,ωei_q,\,i_d,\,\omega_eiq?,id?,ωe? 中的噪聲,再進行前饋補償,但濾波器也會引入滯后,實際效果的好壞需要權衡。
最后,就算不存在模型攝動,我們獲取到的電機參數以及電流轉速都 100% 準確,我們仍然不可能進行 DQ 軸的完全解耦,因為系統中存在很多延時環節,這些延時環節導致我們的前饋作用到被控對象上時,被控對象的狀態已經發生了變化,我們補償的其實是系統之前的狀態。
如果能準確預測到延時之后系統的狀態,我們可以直接使用該狀態進行前饋補償,而這通常是很難做到的,所以在工程上我們可以引入前饋系數 Kf∈(0,1)K_f\in(0,1)Kf?∈(0,1),將前饋乘以 KfK_fKf? 再加入到控制器中,通過調節 KfK_fKf? 的大小,可以有效地降低前饋帶來的負面影響,同時盡可能保留前饋解耦的正面作用。
二. 濾波
電流環使用一個一階低通濾波器進行反饋濾波和指令濾波,其傳遞函數為一個一階慣性環節:
Gf(s)=Y(s)R(s)=11+1wbsG_f\left( s \right) =\frac{Y\left( s \right)}{R\left( s \right)}=\frac{1}{1+\frac{1}{w_b}s} Gf?(s)=R(s)Y(s)?=1+wb?1?s1?
其中 wbw_bwb? 為低通濾波器的截止頻率。我們用后向積分法進行 Z 變換,有:
s=z?1TzGf(z)=Y(z)R(z)=wbTwbT+1?z?1R(z)wbT=Y(z)(wbT+1)?Y(z)z?1Y(n)=TwbTwb+1R(n)+1Twb+1Y(n?1)s=\frac{z-1}{Tz} \\ G_f\left( z \right) =\frac{Y\left( z \right)}{R\left( z \right)}=\frac{w_bT}{w_bT+1-z^{-1}} \\ R\left( z \right) w_bT=Y\left( z \right) \left( w_bT+1 \right) -Y\left( z \right) z^{-1} \\ Y\left( n \right) =\frac{Tw_b}{Tw_b+1}R\left( n \right) +\frac{1}{Tw_b+1}Y\left( n-1 \right) s=Tzz?1?Gf?(z)=R(z)Y(z)?=wb?T+1?z?1wb?T?R(z)wb?T=Y(z)(wb?T+1)?Y(z)z?1Y(n)=Twb?+1Twb??R(n)+Twb?+11?Y(n?1)
得到離散后的時域表達式我們就可以在程序中實現濾波器了。
我們在上一篇文章的建模中考慮了速度環使用的一階低通濾波器,故其參數可以通過電流環帶寬 wbcrtw_{b}^{crt}wbcrt? 和電流環幀率 fff 計算得到。而速度環的濾波器并沒有在建模時考慮,相反,我們把它視為一種擾動,它的參數是需要手動整定的。我們希望它在濾除掉噪聲的同時,給系統帶來的相位滯后最小,即濾波器對系統帶來的擾動最小。
為了減小濾波器對速度環產生的擾動,我們使用二階巴特沃斯濾波器進行濾波,使用高階濾波器可以在保證濾波效果的同時引入更小的相位滯后。在這篇文章中我簡單對比過不同濾波器的性能:【ADRC】一. 線性跟蹤微分器,這里就不詳細地對濾波器進行介紹了。
二階巴特沃斯濾波器的核心代碼如下,詳細的代碼可以查看 PX4 飛控源碼中的 LowPassFilter2p.hpp 文件,濾波器的推導可以參考這篇文章。
// init const float fr = _sample_freq / _cutoff_freq; const float ohm = tanf(M_PI_F / fr); const float c = 1.f + 2.f * cosf(M_PI_F / 4.f) * ohm + ohm * ohm;_b0 = ohm * ohm / c; _b1 = 2.f * _b0; _b2 = _b0;_a1 = 2.f * (ohm * ohm - 1.f) / c; _a2 = (1.f - 2.f * cosf(M_PI_F / 4.f) * ohm + ohm * ohm) / c;// apply T delay_element_0{sample - _delay_element_1 *_a1 - _delay_element_2 * _a2};const T output{delay_element_0 *_b0 + _delay_element_1 *_b1 + _delay_element_2 * _b2};_delay_element_2 = _delay_element_1; _delay_element_1 = delay_element_0;值得一提的是,速度環的幀率要顯著低于電流環,在速度環運行計算量稍大的二階濾波器不會占用太多算力。
三. 抗飽和(Anti-Windup)
在實際的控制系統中,電機和驅動器都有最大功率限制。比如,電流環的輸出為 Q 軸和 D 軸的相電壓,其最大值受到調制方法和母線電壓的限制,對于 SVPWM 來說,Uqmax=Udmax=3/3?Ubusmax?U_{q}^{max}=U_ozvdkddzhkzd^{max}=\sqrt{3}/3*U_{bus}^{\max}Uqmax?=Udmax?=3?/3?Ubusmax?。速度環的輸出為 Q 軸電流,其最大值為電機最大電流和驅動器最大電流中的最小值,即 Uvelt_loopmax=min?{Imotormax,Iescmax}U^{max}_{velt\_loop} = \min \left\{ I_{motor}^{max},\, I_{esc}^{max} \right\}Uvelt_loopmax?=min{Imotormax?,Iescmax?}。
當控制器的輸出達到執行器的極限時,反饋回路失效,系統將運行于開環狀態,此時我們說執行器處于飽和狀態,系統長時間飽和很可能造成系統失穩,故我們在進行控制器設計時要做抗飽和(Anti-Windup)處理,考慮執行器的物理約束。
設 PI 控制器中比例項的輸出為 UpU_pUp?,積分項的輸出為 UiU_iUi?,總輸出為 UUU,其最大值為 UmaxU^{max}Umax。
我們可以簡單的令 Uimax=Umax=?Uimax{U_i}^{max}=U^{max}=-{U_i}^{max}Ui?max=Umax=?Ui?max,這是最簡單的抗飽和處理。除此之外,我們還可以用積分分離、變速積分等方法進行抗飽和,不過這兩種方法在電流環控制中都存在局限性:積分分離法在偏差較小時不使用積分控制,在偏差大于某個值時啟用積分控制,其不適合應用在扭矩不斷變化的場合,因為積分反復開關可能會造成電流的突變。變速積分法通過引入一個變化的增益,做到大偏差時積分較慢,小偏差時積分較快,其本質上是通過引入非線性環節來獲得更好的控制效果,但這樣做會影響到我們前面的建模分析,即通過帶寬整定 Kpcrt,KicrtK_{p}^{crt},\, K_{i}^{crt}Kpcrt?,Kicrt? 的公式可能不再適用,且變積分的參數整定也較為困難,所以我們接下來還是在最簡單的抗飽和方法之上進行拓展。
回到 Uimax=Umax=?Uimax{U_i}^{max}=U^{max}=-{U_i}^{max}Ui?max=Umax=?Ui?max 上,當 UpU_pUp? 較大時,積分效應仍然可能導致控制器的總輸出 UUU 達到飽和,即 U=Ui+Up>UmaxU=U_{i}+U_p>U^{max}U=Ui?+Up?>Umax。我們抗飽和的根本目標是通過限制積分器的輸出來保證控制器不飽和且擁有最大輸出能力,即通過限制 UimaxU_{i}^{max}Uimax? 和 UiminU_{i}^{min}Uimin? 來保證 ?Umin<U<Umax-U^{min}<U<U^{max}?Umin<U<Umax 。
所以,考慮到比例項的輸出,我們可以使用積分器的動態限幅,即 Uimax=Umax?Up,Uimin=?Umax?UpU_{i}^{max}=U^{max}-U_p,\, U_{i}^{min}=-U^{max}-U_pUimax?=Umax?Up?,Uimin?=?Umax?Up?,每個時刻的積分限幅是動態變化的,和當前比例項的輸出有關。這樣可以保證總輸出限幅一定,在偏差較大時可以起到類似變速積分的效果。
考慮到前饋項,我們還需要對前饋的輸出進行處理,由于前饋項的形式比較靈活,在這里就不舉例了,我們只需要保證積分項 UiU_iUi? 不會使得控制器輸出 UUU 的絕對值超過 UmaxU^{max}Umax 即可。
四. 其他細節
1. 單位
兩篇文章中提到的所有頻率,如 wb,wc,wnw_b,\,w_c,\,w_nwb?,wc?,wn? 等,單位都為 rad/srad/srad/s。其余物理量的單位均為國際單位制,如電流單位為安培 (A),電壓單位為伏特 (V),等等。
2. Z 變換中的時間
很多人使用 PID 時,都沒有考慮代碼的執行周期 TTT ,積分項直接使用 Ui += error * Ki,如果是手動調節參數的話這樣做并沒有什么問題,但我們直接使用理論計算出的 PI 參數,就必須在所有的環節都符合公式推導,代碼中應該使用 Ui += error * Ki * dt。dt 對應 Z 變換 s=(z?1)/Tzs=(z-1)/Tzs=(z?1)/Tz 中的 TTT。
3. 放縮
雖然現在大部分微處理器中都集成了浮點計算單元(FPU,floating-point unit),但浮點數的計算還是比定點數的計算要慢得多,為了提高運算速度,我們可以把所有浮點數放縮為定點數進行計算,在最后使用的時候再放縮回來,這通常是使用數學庫來實現的,比如 TI 的 IQmath Library,CMSIS 的 DSP Software Library 等。
在通信中也要考慮數據溢出的問題,為了在有限長的字節內傳遞全部信息,通常也要對數據進行放縮處理。
4. 指令預處理
在程序中需要根據物理約束對輸入控制器的指令進行限幅,比如速度環的目標值不應超過電機的最高轉速,電流環的目標值不應該超過電機和驅動器所允許的最大電流。
其次根據驅動系統的性能,可能還需要對指令的變化率進行限制,直接給電流環非常大的電流階躍會給控制帶來較大壓力,可以對指令額外進行低通濾波,或者簡單地使用斜坡信號代替階躍。
5. 運行速率
電流環的幀率對控制器的性能有顯著影響,至少要保證電流環幀率在 10K 以上,一般 10K~40K 之間比較合適,幀率超過 40K 之后,再提高幀率所帶來的收益較小。
使能 FPU、使用定點數運算、使用查表法計算 sin?\sinsin 和 cos?\coscos、開啟編譯器 -O1/-O2 優化可以顯著提高運行速率,除此之外,將反復調用的函數定義為內聯函數、將浮點數除法改為浮點數乘法等方法也可以幫助提高代碼的執行速度。
總結
以上是生活随笔為你收集整理的【PMSM】二. 经典电流环、速度环设计(下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Entity Relation Fusi
- 下一篇: 互联网的工作原理