間計(jì)算詳解)
做FOC時(shí)間久了你會(huì)發(fā)現(xiàn)一個(gè)很有意思的現(xiàn)象電流環(huán)輸出Ud、Uq之后怎么把這些電壓指令變成三相橋臂上具體的導(dǎo)通時(shí)間不同人的做法差別很大。有人習(xí)慣傳統(tǒng)SVPWM扇區(qū)判斷、查表、算切換點(diǎn)中斷里跑得滿頭大汗有人卻只用幾行代數(shù)運(yùn)算就能生成效果完全一致的PWM波形。后者用的就是三投影法。今天我把三投影法的基本原理和三相電壓作用時(shí)間的計(jì)算過(guò)程完整拆開(kāi)講清楚它為什么能替代傳統(tǒng)SVPWM以及在寫(xiě)代碼和調(diào)波形時(shí)到底該注意哪些細(xì)節(jié)。這篇文章適合正在做PMSM FOC控制、對(duì)PWM調(diào)制環(huán)節(jié)還想深入一層的中高級(jí)開(kāi)發(fā)者和相關(guān)專業(yè)學(xué)生。1. 為什么選擇三投影法從傳統(tǒng)SVPWM的痛點(diǎn)說(shuō)起1.1 傳統(tǒng)SVPWM每一步都在做什么傳統(tǒng)SVPWM的核心思想是伏秒平衡??刂浦芷赥s內(nèi)期望電壓矢量Uref不是直接加在電機(jī)上的而是用兩個(gè)相鄰的基本電壓矢量和一個(gè)或多個(gè)零矢量按時(shí)間比例合成出來(lái)。具體分四步先把Uα、Uβ折算到三相坐標(biāo)系根據(jù)坐標(biāo)符號(hào)判斷所處扇區(qū)接著計(jì)算中間變量X、Y、Z再根據(jù)扇區(qū)查表選出T1、T2然后算出切換點(diǎn)Ta、Tb、Tc最后把切換點(diǎn)映射到具體的定時(shí)器比較通道上。每個(gè)周期還要重置扇區(qū)標(biāo)志、數(shù)組索引一大堆條件分支。這套流程有一個(gè)比較隱蔽的工程問(wèn)題分支多執(zhí)行時(shí)間不穩(wěn)定而且做除法的時(shí)候必須特別小心邊界條件。比如Uβ剛好為零、或者扇區(qū)邊界附近符號(hào)抖動(dòng)時(shí)容易造成相鄰周期的PWM波形不對(duì)稱。雖然這些都可以通過(guò)代碼規(guī)避但維護(hù)成本不低。1.2 三投影法是怎么另辟蹊徑的三投影法的思路完全不一樣。它不做扇區(qū)判斷也不查表。核心動(dòng)作只有一個(gè)把期望電壓矢量分別投影到A、B、C三相的坐標(biāo)軸上直接得到每相應(yīng)該輸出的相電壓參考值。這個(gè)投影在數(shù)學(xué)上只是兩個(gè)乘法和一個(gè)加法不存在任何分支。為什么可以這樣做因?yàn)槿鄻虮郾緛?lái)就是獨(dú)立的電壓源每相都可以輸出任意占空比對(duì)應(yīng)的平均電壓。只要這三相平均電壓在線電壓層面等于Uref系統(tǒng)就是等效的。換句話說(shuō)傳統(tǒng)SVPWM是先定兩個(gè)非零矢量的作用時(shí)間再推導(dǎo)三相占空比三投影法是直接跳過(guò)矢量概念從電壓投影一步到位。兩條路線殊途同歸但從代碼和執(zhí)行效率來(lái)說(shuō)三投影法的優(yōu)勢(shì)非常明顯尤其適合開(kāi)關(guān)頻率高、中斷周期短、MCU算力不太充裕的場(chǎng)景。2. 三投影法的數(shù)學(xué)原理與公式推導(dǎo)2.1 坐標(biāo)變換里的那些系數(shù)約定說(shuō)到三投影法之前必須先把坐標(biāo)變換的系數(shù)約定說(shuō)清楚。電機(jī)控制里Clark變換有兩種常見(jiàn)約定一種是等幅值變換一種是等功率變換。三投影法本身并沒(méi)有強(qiáng)制要求用哪一種但反Park變換輸出的Uα、Uβ必須和后續(xù)投影公式保持一致。通常FOC代碼里電流采樣做完Clark變換之后αβ軸上的電流幅值等于相電流幅值這就是等幅值約定。電流環(huán)整定出來(lái)的Ud、Uq經(jīng)過(guò)反Park變換得到的Uα、Uβ也應(yīng)當(dāng)保持“合成電壓矢量幅值等于相電壓幅值”的性質(zhì)。在這個(gè)約定下三相相電壓參考可以直接用投影公式得到不需要額外的2/3或3/2倍系數(shù)。如果你在別人的代碼里看到多乘了一個(gè)系數(shù)可以先檢查他的Clark變換系數(shù)約定是不是不一樣這個(gè)坑很容易讓人調(diào)半天。2.2 投影公式的完整推導(dǎo)先看坐標(biāo)關(guān)系。A相繞組軸線定義為零度方向B相滯后A相120度C相滯后A相240度也就是超前120度。α軸與A軸重合β軸超前α軸90度。假設(shè)反Park輸出為Uα、Uβ那么期望電壓矢量在αβ平面上就是一條從原點(diǎn)出發(fā)、長(zhǎng)度為|Uref|的矢量。把這個(gè)矢量往A軸上投影投影長(zhǎng)度就是Uα本身因?yàn)锳軸和α軸重合Va_proj Uα往B軸上投影B軸的單位方向在αβ平面里是(-0.5, 0.866)。向量點(diǎn)乘之后得到Vb_proj -0.5 × Uα 0.866 × Uβ往C軸上投影C軸單位方向是(-0.5, -0.866)所以Vc_proj -0.5 × Uα - 0.866 × Uβ這就是三投影法的核心代數(shù)式。三個(gè)投影值VA、VB、VC之和恒等于零說(shuō)明它們只是一組純交流分量不含共模分量。2.3 零序注入與中心對(duì)稱處理VA、VB、VC直接轉(zhuǎn)成占空比能不能用可以但電壓利用率不是最優(yōu)。三相逆變器的最大不失真相電壓幅值在SVPWM下可以做到Vdc/√3而直接使用VA、VB、VC并把占空比限制在[0,1]時(shí)最大相電壓幅值只能到Vdc/2相對(duì)減小了約13.4%。傳統(tǒng)SVPWM之所以能提高電壓利用率是因?yàn)樗谌鄥⒖茧妷荷献⑷肓艘粋€(gè)零序分量把每相參考電壓整體抬高或壓低從而讓三相占空比都能落在合理區(qū)間。三投影法也可以用同樣的方式處理。最常見(jiàn)的做法是中心對(duì)稱注入也叫min-max注入offset -0.5 × (max(VA, VB, VC) min(VA, VB, VC))然后把offset加到三相參考電壓上。這樣處理后三相參考電壓的最大值和最小值關(guān)于零點(diǎn)對(duì)稱占空比的中心也落在0.5附近。有人會(huì)問(wèn)零序注入會(huì)不會(huì)改變電機(jī)的相電壓不會(huì)。電機(jī)三相繞組構(gòu)成的系統(tǒng)沒(méi)有中線零序電壓不會(huì)在繞組上產(chǎn)生電流真正決定電流的是線電壓。只要三相參考電壓兩兩之間的差值不變電機(jī)上得到的電壓就和沒(méi)注入零序時(shí)完全一樣。3. 三相電壓作用時(shí)間的計(jì)算從參考電壓到PWM占空比3.1 逆變器橋臂的平均電壓模型三相電壓作用時(shí)間其實(shí)就是每個(gè)PWM周期里上橋臂MOSFET導(dǎo)通的時(shí)間長(zhǎng)度Ton。要算Ton先得知道占空比D。對(duì)于一只橋臂假設(shè)上管導(dǎo)通時(shí)輸出點(diǎn)相對(duì)直流母線負(fù)極為Vdc下管導(dǎo)通時(shí)為0V。如果參考電壓是相對(duì)直流母線中點(diǎn)來(lái)說(shuō)的那么中點(diǎn)電位就是Vdc/2橋臂輸出的平均電壓為Vx_avg D × Vdc - Vdc/2 (D - 0.5) × Vdc反解占空比D 0.5 Vx_avg / Vdc這一步就是把三投影法算出的三相參考電壓映射到時(shí)間量的關(guān)鍵公式。之前投影出來(lái)的VA、VB、VC此時(shí)就作為Vx_avg代入。注意這里Vx_avg必須是一個(gè)相對(duì)母線中點(diǎn)的電壓而且它的絕對(duì)值不能超過(guò)Vdc/2超出部分就是過(guò)調(diào)制區(qū)。3.2 作用時(shí)間的伏秒平衡表達(dá)得到占空比之后導(dǎo)通時(shí)間就是Ton D × Ts其中Ts是PWM開(kāi)關(guān)周期也就是PWM頻率的倒數(shù)。如果Ts 100usD 0.6那么這一相上橋臂在這個(gè)周期內(nèi)導(dǎo)通60us下橋臂導(dǎo)通40us。三相的Ton并不獨(dú)立因?yàn)槿鄥⒖茧妷航?jīng)過(guò)零序注入后三相占空比之和通常不等于1.5而是1.5加零序偏移量除以Vdc后的結(jié)果。你不要去懷疑“占空比之和為什么不是1.5”那正是零序分量的體現(xiàn)。三相電壓作用時(shí)間也不一定都要在區(qū)間[0, Ts]內(nèi)。如果D小于0或者大于1實(shí)際已經(jīng)超出了線性調(diào)制區(qū)需要做限幅或者過(guò)調(diào)制處理。正常FOC運(yùn)行在低速和額定速度以內(nèi)時(shí)電流環(huán)輸出的Ud、Uq幅值不會(huì)超過(guò)Vdc/√3占空比一般不會(huì)飽和。3.3 定時(shí)器比較值的換算與采樣時(shí)機(jī)MCU的PWM定時(shí)器一般用中心對(duì)齊模式。定時(shí)器輸出比較寄存器CCR決定的是翻轉(zhuǎn)時(shí)刻把占空比換算成CCR時(shí)不同廠家、不同定時(shí)器極性有差異。比如有些芯片里占空比和CCR的關(guān)系可以寫(xiě)成CCR ARR × (1 - D)或CCR ARR × D具體取決于有效電平定義和計(jì)數(shù)方向。我的建議是不要死記公式而是用一個(gè)基準(zhǔn)信號(hào)做一次示波器標(biāo)定給一個(gè)固定的D值看高電平時(shí)間對(duì)不對(duì)不對(duì)就調(diào)整公式。這個(gè)操作只要一次之后公式就穩(wěn)定了。采樣時(shí)機(jī)方面中心對(duì)齊PWM在三角波的頂點(diǎn)和底點(diǎn)處三相橋臂處于一種固定的開(kāi)關(guān)狀態(tài)非常適合觸發(fā)ADC電流采樣。因?yàn)榇藭r(shí)電流等于直流母線電流的某一路徑組合對(duì)應(yīng)某一相的相電流。所有FOC基本都采用頂點(diǎn)采樣或底點(diǎn)采樣三投影法在這里和傳統(tǒng)SVPWM沒(méi)有任何區(qū)別。4. 手算實(shí)例用一組數(shù)據(jù)走完整條鏈路4.1 初始條件與反Park輸出光講公式不夠直觀我拿一組真實(shí)可驗(yàn)證的數(shù)據(jù)走一遍全流程。假設(shè)母線電壓Vdc 300V開(kāi)關(guān)周期Ts 100us也就是10kHz。某一個(gè)控制周期里電流環(huán)輸出的Ud、Uq經(jīng)過(guò)反Park變換后得到Uα 120VUβ 80V。這兩個(gè)量已經(jīng)包含了當(dāng)前電角度信息。合成矢量幅值為|Uref| sqrt(1202 802) 144.22V這個(gè)值小于Vdc/√3 173.2V所以工作在線性區(qū)三投影法可以直接輸出正常占空比。4.2 逐步計(jì)算三相參考電壓、零序和占空比第一步計(jì)算三相投影參考電壓VA 120VVB -0.5 × 120 0.866 × 80 -60 69.28 9.28VVC -0.5 × 120 - 0.866 × 80 -60 - 69.28 -129.28V此時(shí)三相參考電壓之和為0符合預(yù)期。第二步做中心對(duì)稱零序注入max 120Vmin -129.28Voffset -(120 (-129.28)) / 2 4.64V注入零序后VA 124.64VVB 13.92VVC -124.64V第三步換算占空比DA 0.5 124.64 / 300 0.9155DB 0.5 13.92 / 300 0.5464DC 0.5 - 124.64 / 300 0.0845第四步計(jì)算導(dǎo)通時(shí)間Ton_A 0.9155 × 100us 91.55usTon_B 0.5464 × 100us 54.64usTon_C 0.0845 × 100us 8.45us三相占空比都在[0,1]內(nèi)沒(méi)有飽和。如果看線電壓A-B之間瞬時(shí)輸出電壓為Vab (DA - DB) × Vdc (0.9155 - 0.5464) × 300 110.73V這符合當(dāng)前相位下相電壓矢量幅值為144.22V時(shí)線電壓瞬時(shí)值的合理范圍。4.3 與扇區(qū)式SVPWM輸出對(duì)比把同樣的Uα 120V、Uβ 80V丟進(jìn)傳統(tǒng)SVPWM先算扇區(qū)60度以內(nèi)屬于第一扇區(qū)。然后算相鄰矢量作用時(shí)間再用七段式安排每個(gè)切換點(diǎn)最終得到的占空比結(jié)果和上面三投影法的結(jié)果完全一致。這里的關(guān)鍵點(diǎn)是只要零序注入策略選取一致三投影法和傳統(tǒng)SVPWM在數(shù)值上就是嚴(yán)格等價(jià)的。所以要怎么選如果你是在學(xué)習(xí)原理、寫(xiě)文檔、講課傳統(tǒng)SVPWM的矢量圖更直觀如果是在MCU上追求穩(wěn)定執(zhí)行時(shí)間和簡(jiǎn)單代碼三投影法更省心。我自己在實(shí)際項(xiàng)目里基本都是用三投影法配合中心對(duì)齊定時(shí)器極大減少了中斷里的運(yùn)算量和分支跳變。5. 工程實(shí)現(xiàn)中的補(bǔ)償問(wèn)題三投影法踩坑實(shí)錄5.1 死區(qū)時(shí)間如何補(bǔ)償PWM輸出必然有死區(qū)否則上下橋臂會(huì)直通。死區(qū)會(huì)帶來(lái)一個(gè)很實(shí)際的后果實(shí)際輸出電壓平均值比指令值偏小而且?guī)в信c電流方向相關(guān)的非線性。三投影法本身不會(huì)自動(dòng)消除這個(gè)誤差需要額外做死區(qū)補(bǔ)償。最簡(jiǎn)單的補(bǔ)償方法是電流極性判斷。理想情況下如果某相電流為正死區(qū)時(shí)間產(chǎn)生的影響方向是確定的占空比需要加上一個(gè)固定補(bǔ)償量電流為負(fù)方向相反。補(bǔ)償增量可以估算為delta_D DeadTime / Ts對(duì)應(yīng)的電壓補(bǔ)償量大約為delta_V (DeadTime / Ts) × Vdc具體加還是減取決于橋臂結(jié)構(gòu)和電流定義方向。我的經(jīng)驗(yàn)是先用固定補(bǔ)償值跑起來(lái)看相電流波形里的削頂畸變和過(guò)零附近的臺(tái)階。如果補(bǔ)償方向正確波形明顯平滑如果方向反了畸變更重把符號(hào)反過(guò)來(lái)即可。不要指望一次就完美死區(qū)補(bǔ)償是個(gè)需要從波形反饋里反復(fù)確認(rèn)的過(guò)程。5.2 母線電壓波動(dòng)與管壓降處理母線電壓Vdc不是恒定不變的尤其電池供電或者整流電壓帶紋波比較大的場(chǎng)合。占空比計(jì)算時(shí)必須使用實(shí)時(shí)檢測(cè)到的Vdc不能用一個(gè)固定常量否則指令電壓和實(shí)際輸出不匹配電流環(huán)會(huì)莫名抖動(dòng)。三投影法在代碼上只需要把Vdc變量改成ADC實(shí)時(shí)采樣值這是它比查表SVPWM更自然的優(yōu)勢(shì)之一。另外一個(gè)容易被忽略的量是功率管壓降。MOSFET導(dǎo)通電阻產(chǎn)生的壓降在大電流時(shí)能達(dá)到好幾伏特。如果對(duì)低速力矩精度要求很高可以在占空比上疊加一個(gè)與電流方向相關(guān)的校正項(xiàng)。這個(gè)校正項(xiàng)不是固定死區(qū)那樣近似方波而是跟電流大小成比例的實(shí)際調(diào)的時(shí)候可以先用死區(qū)補(bǔ)償加電流方向判斷再?zèng)Q定要不要上線性壓降模型。5.3 過(guò)調(diào)制和最小脈寬限制三投影法輸出占空比一旦超過(guò)[0,1]就進(jìn)入了過(guò)調(diào)制區(qū)。簡(jiǎn)單的做法是直接飽和但直接飽和會(huì)導(dǎo)致線電壓波形產(chǎn)生削頂失真也就是相電流的高次諧波成分增多。如果你只是把它當(dāng)應(yīng)急手段比如最高轉(zhuǎn)速附近稍微超過(guò)一點(diǎn)線性區(qū)用簡(jiǎn)單飽和問(wèn)題不大。但如果你希望保留完整的過(guò)調(diào)制能力一般需要把超出六邊形區(qū)域的電壓矢量拉回到六邊形邊界上這相當(dāng)于一個(gè)矢量限幅器實(shí)現(xiàn)復(fù)雜度明顯上升。還有一個(gè)工程細(xì)節(jié)是“最小脈寬限制”。當(dāng)某相占空比很接近0或者很接近1時(shí)器件的開(kāi)關(guān)脈沖寬度會(huì)小于功率管的開(kāi)關(guān)特性要求導(dǎo)致波形無(wú)法正常傳輸。常規(guī)做法是把占空比限制在比如0.05到0.95之間。代價(jià)是犧牲一點(diǎn)最大輸出能力通常可以通過(guò)提高母線電壓或者調(diào)整控制策略來(lái)彌補(bǔ)。6. 調(diào)試方法與實(shí)踐建議6.1 開(kāi)環(huán)正弦表先跑通三投影法我的經(jīng)驗(yàn)是首次做三投影法驗(yàn)證不要直接上FOC閉環(huán)先開(kāi)環(huán)發(fā)一組三相對(duì)稱正弦波把調(diào)制環(huán)節(jié)單獨(dú)驗(yàn)證掉。做法很簡(jiǎn)單讓Uα Vp × cos(θ_m)Uβ Vp × sin(θ_m)θ_m按時(shí)勻速遞增Vp給一個(gè)安全值比如Vdc × 0.2。用三投影法轉(zhuǎn)成占空比后輸出到三相橋臂不接電機(jī)或者接一個(gè)電阻負(fù)載即可示波器觀察輸出端相對(duì)母線的電壓波形。如果三投影像計(jì)算的占空比沒(méi)有問(wèn)題你會(huì)在每個(gè)橋臂中點(diǎn)看到正弦調(diào)制的PWM脈寬變化。再把線電壓波形看一遍Uab、Ubc都是光滑的正弦包絡(luò)沒(méi)有斷續(xù)和臺(tái)階。這一步跑通了之后再接電機(jī)做FOC閉環(huán)可以把調(diào)制環(huán)節(jié)的問(wèn)題從電流環(huán)問(wèn)題里隔離出來(lái)。6.2 常見(jiàn)波形異常排查調(diào)試中我遇到過(guò)幾種典型的波形異常整理成表格方便對(duì)照現(xiàn)象可能原因排查方向相電壓PWM脈寬不對(duì)稱零序注入算法寫(xiě)錯(cuò)或扇區(qū)邊界抖動(dòng)檢查offset計(jì)算與三相參考電壓代數(shù)式母線電流出現(xiàn)6倍頻紋波占空比飽和或過(guò)調(diào)制處理不當(dāng)降低電壓指令幅值臨時(shí)代償測(cè)試低速大電流時(shí)電流波形臺(tái)階狀死區(qū)補(bǔ)償方向或補(bǔ)償量不合適對(duì)比不同補(bǔ)償方向的電流THD高速時(shí)電壓輸出突然畸變Vdc采樣滯后或?yàn)V波時(shí)間過(guò)長(zhǎng)用實(shí)時(shí)Vdc縮短采樣濾波窗口空載電流有固定頻率尖峰最小脈寬限制未加或開(kāi)關(guān)時(shí)刻采樣窗口太短限制占空比范圍檢查ADC觸發(fā)點(diǎn)6.3 關(guān)于代碼結(jié)構(gòu)的一點(diǎn)建議三投影法本身只有三行代數(shù)的活但工程代碼里可以把它封裝成一個(gè)獨(dú)立的調(diào)制模塊輸入是Uα、Uβ、Vdc輸出是三相比值或CCR。這樣做的好處是不管上層用的是VF控制、電流閉環(huán)還是無(wú)感觀測(cè)器只要最后給出Uα、Uβ調(diào)制模塊都可以復(fù)用。同時(shí)也可以把“零序注入”“死區(qū)補(bǔ)償”“過(guò)調(diào)制限幅”作為獨(dú)立可裁剪的配置項(xiàng)調(diào)試時(shí)逐項(xiàng)開(kāi)關(guān)方便定位問(wèn)題。我自己在遷移傳統(tǒng)SVPWM到三投影法時(shí)做過(guò)一個(gè)很小的實(shí)驗(yàn)平臺(tái)用同一個(gè)電壓指令分別跑兩種調(diào)制器對(duì)比相電流FFT。結(jié)果顯示在相同死區(qū)補(bǔ)償參數(shù)下三投影法的諧波分布和傳統(tǒng)七段式SVPWM幾乎一致。從那之后我再也沒(méi)有糾結(jié)過(guò)扇區(qū)判斷和查表因?yàn)槿队胺ㄓ酶?jiǎn)單的代碼得到了等價(jià)的性能。最后再分享一個(gè)小技巧如果你擔(dān)心零序注入的浮點(diǎn)運(yùn)算耗時(shí)可以把offset計(jì)算簡(jiǎn)化成只看三相電壓的最大值和最小值而這兩個(gè)值在三相正弦情況下是有明確規(guī)律的完全可以用比較器硬件加速或者查表實(shí)現(xiàn)。實(shí)際跑下來(lái)三投影法的計(jì)算時(shí)間通常只是傳統(tǒng)SVPWM的一半左右省出來(lái)的時(shí)間留給電流環(huán)或觀測(cè)器非常劃算。