FOC:電壓模型+電流模型磁鏈觀測(cè)器C代碼全解析)
簡(jiǎn)介面向嵌入式電機(jī)控制工程師與電力電子專業(yè)學(xué)生這份感應(yīng)異步電機(jī)無傳感器矢量控制資源包完整解決無速度傳感器條件下的轉(zhuǎn)子磁場(chǎng)定向控制工程實(shí)現(xiàn)問題。核心采用“電壓模型電流模型”磁鏈觀測(cè)器低速至中高速段可精確估算轉(zhuǎn)速配合空間矢量脈寬調(diào)制降低定子電流畸變率適用于工業(yè)變頻、電動(dòng)汽車電驅(qū)等動(dòng)態(tài)響應(yīng)要求高的場(chǎng)合。代碼已移植至兩款主流控制芯片并在三十三千瓦異步電機(jī)上完成帶滿載零速啟動(dòng)、抗負(fù)載擾動(dòng)、快速響應(yīng)試驗(yàn)附帶波形與臺(tái)架照片可直接驗(yàn)證。資源共十一個(gè)文件以九張?jiān)囼?yàn)圖片為主輔以算法說明文本和網(wǎng)頁文檔壓縮包僅一點(diǎn)六二兆查閱下載便捷。除可運(yùn)行的C語言控制代碼與仿真模型還提供與代碼逐段對(duì)應(yīng)的算法原理推導(dǎo)從磁鏈觀測(cè)到坐標(biāo)變換、空間矢量調(diào)制均可對(duì)照學(xué)習(xí)是產(chǎn)品級(jí)電機(jī)控制開發(fā)的實(shí)用資料。已有五百零九人學(xué)習(xí)下載。 前陣子整理自己的電機(jī)控制代碼庫(kù)發(fā)現(xiàn)這幾年做的感應(yīng)異步電機(jī)無傳感器矢量控制項(xiàng)目居然積累了一套還算完整的方案。編碼器拆掉、速度閉環(huán)照跑、低速不抖、高速不飄這套“電壓模型電流模型”磁鏈觀測(cè)器的路子前前后后調(diào)了小半年踩過的坑能寫滿一頁紙。今天把這套方案的C代碼框架和仿真模型搭建思路完整拆一遍給正在做異步電機(jī)FOC的同仁做個(gè)參考。這套方案的初衷很簡(jiǎn)單風(fēng)機(jī)、水泵、壓縮機(jī)這類負(fù)載變頻器長(zhǎng)時(shí)間運(yùn)行在惡劣環(huán)境里編碼器線纜老化、碼盤臟污導(dǎo)致的故障占比相當(dāng)高。把編碼器去掉只靠電流采樣和電壓重構(gòu)就能實(shí)現(xiàn)轉(zhuǎn)矩和速度的精準(zhǔn)控制省掉一個(gè)傳感器就是省掉一塊不小的成本和一類高頻故障源。不過無傳感器方案要是真那么好做市面上就不會(huì)還有一堆低速性能拉胯的產(chǎn)品了核心難點(diǎn)全在“磁鏈怎么觀測(cè)”。1. 為什么是“電壓模型電流模型”而不是二選一做無傳感器FOC最核心的問題是轉(zhuǎn)子磁鏈角度怎么來。有編碼器的時(shí)候角度直接讀磁鏈角度通過轉(zhuǎn)差公式就能算出來。沒了編碼器就得靠電機(jī)本身的電壓電流關(guān)系把磁鏈“估計(jì)”出來。目前工程上主流的兩條路子一個(gè)叫電壓模型一個(gè)叫電流模型這倆各有各的脾氣。1.1 電壓模型中高速域的“主力軍”電壓模型的思路很直接就是把異步電機(jī)的定子電壓方程拿來做積分[ \psi_{\alpha} \int (u_{\alpha} - R_s i_{\alpha}) dt ] [ \psi_{\beta} \int (u_{\beta} - R_s i_{\beta}) dt ]定子電阻壓降一扣剩下的就是反電動(dòng)勢(shì)積分出來就是定子磁鏈。定子磁鏈到轉(zhuǎn)子磁鏈做一個(gè)補(bǔ)償變換就能拿到轉(zhuǎn)子磁鏈的角度和幅值。這個(gè)模型最舒服的地方是不需要轉(zhuǎn)速信號(hào)也不需要轉(zhuǎn)子時(shí)間常數(shù)對(duì)轉(zhuǎn)子參數(shù)的變化完全免疫。中高速段反電動(dòng)勢(shì)足夠大積分出來的磁鏈信噪比很高轉(zhuǎn)子磁場(chǎng)定向就能做得很準(zhǔn)。但電壓模型的死穴恰恰是它的積分器。理想積分器的直流偏置和初始值問題在電機(jī)控制里會(huì)被放大得非常明顯。低速時(shí)反電動(dòng)勢(shì)只有幾個(gè)伏特和電阻壓降、逆變器死區(qū)誤差混在一起信噪比低得可憐積分結(jié)果要么漂移要么飽和。1.2 電流模型低速域的“救火隊(duì)員”電流模型走的是另一條路基于轉(zhuǎn)子回路方程在轉(zhuǎn)子磁場(chǎng)定向的dq坐標(biāo)系里重建磁鏈[ \psi_r \frac{L_m}{\tau_r p 1} i_d ]換句話說磁鏈大小基本由勵(lì)磁電流 (i_d) 的一階慣性環(huán)節(jié)決定角度則通過對(duì)轉(zhuǎn)差頻率積分來逼近。這個(gè)模型低速時(shí)表現(xiàn)穩(wěn)定不依賴反電動(dòng)勢(shì)哪怕定子頻率接近0Hz也能維持一個(gè)合理的磁鏈估計(jì)。但是電流模型也有坑它極其依賴轉(zhuǎn)子時(shí)間常數(shù) (\tau_r)。轉(zhuǎn)子溫度一變化轉(zhuǎn)子電阻一漂估計(jì)出來的磁鏈幅值和角度就會(huì)出現(xiàn)偏差直接影響轉(zhuǎn)矩精度。電機(jī)參數(shù)隨工況一直在變指望一個(gè)固定參數(shù)存活的電流模型只適合在窄速度范圍工作的場(chǎng)合。1.3 兩者配合的邏輯既然電壓模型低速不行高速香電流模型低速穩(wěn)高速飄那自然想到的就是“低速看電流、中高速看電壓”的雙模型方案。工程實(shí)現(xiàn)上不需要做得太復(fù)雜低速段比如10%額定轉(zhuǎn)速以下用電流模型中高速段切換到電壓模型中間過渡區(qū)做線性加權(quán)或者滯環(huán)切換就可以實(shí)現(xiàn)在全速域內(nèi)估算出來的磁鏈角度和幅值都保持在可用范圍。這也是標(biāo)題里“電壓模型電流模型”這組關(guān)鍵詞的核心邏輯不是二選一而是各管一段。2. 核心控制框架與磁鏈觀測(cè)器設(shè)計(jì)細(xì)節(jié)這套控制框架整體還是標(biāo)準(zhǔn)的轉(zhuǎn)子磁場(chǎng)定向FOC結(jié)構(gòu)電流內(nèi)環(huán)、速度外環(huán)、SVPWM調(diào)制、坐標(biāo)變換只是把編碼器反饋換成了觀測(cè)器估算。整個(gè)觀測(cè)與控制的信號(hào)鏈條是這樣的。2.1 整體信號(hào)鏈系統(tǒng)上電后先做一個(gè)預(yù)勵(lì)磁環(huán)節(jié)速度環(huán)輸出給定轉(zhuǎn)矩電流 (i_q^)勵(lì)磁電流 (i_d^) 保持在一個(gè)恒定值。采樣的三相電流通過Clarke變換到靜止坐標(biāo)系得到 (i_\alpha)、(i_\beta)再通過Park變換轉(zhuǎn)到旋轉(zhuǎn)坐標(biāo)系。電流PI調(diào)節(jié)器輸出d/q軸電壓反Park變換后經(jīng)過SVPWM生成開關(guān)信號(hào)。這個(gè)過程中觀測(cè)器一直在后臺(tái)運(yùn)行。它根據(jù)當(dāng)前的控制電壓和采樣電流估算轉(zhuǎn)子磁鏈角度 (\theta_e) 和轉(zhuǎn)速 (\hat{\omega}_r)其中角度 (\theta_e) 作為Park變換和反Park變換的參考角轉(zhuǎn)速 (\hat{\omega}_r) 作為速度環(huán)的反饋。整個(gè)系統(tǒng)就是一個(gè)典型的雙閉環(huán)結(jié)構(gòu)只不過最里面的角度傳感器被一個(gè)數(shù)學(xué)觀測(cè)器替代了。2.2 磁鏈角度估算的工程公式對(duì)于異步電機(jī)轉(zhuǎn)子磁場(chǎng)定向的核心是轉(zhuǎn)差頻率法。在磁鏈角速度 (\omega_e) 和轉(zhuǎn)子機(jī)械轉(zhuǎn)速 (\omega_r) 之間有一個(gè)轉(zhuǎn)差關(guān)系[ \omega_{sl} \frac{L_m i_q}{\tau_r \psi_r} ]于是估算轉(zhuǎn)速就是磁鏈角速度減去轉(zhuǎn)差頻率[ \hat{\omega}r \omega_e - \omega{sl} ]而磁鏈角速度 (\omega_e) 來自觀測(cè)器輸出的磁鏈角度變化率。電壓模型估算的時(shí)候直接對(duì)磁鏈角度做微分或者用隱含微分關(guān)系獲得 (\omega_e)電流模型估算的時(shí)候(\omega_e) 由轉(zhuǎn)差和前一次轉(zhuǎn)速估計(jì)合起來得到。這兩種模式的切換必須在同一時(shí)刻保證 (\theta_e) 連續(xù)否則切換瞬間電流會(huì)沖擊現(xiàn)場(chǎng)表現(xiàn)就是電機(jī)“咯噔”一下。2.3 電壓模型積分器的工程補(bǔ)救純積分器在工程里根本沒法直接用直流偏置和初始積分飽和足以讓系統(tǒng)崩潰。我做項(xiàng)目時(shí)用的是帶限幅和反饋補(bǔ)償?shù)摹暗屯ǜ咄ā睆?fù)合結(jié)構(gòu)本質(zhì)上就是讓積分器在一個(gè)極低頻率以上扮演積分角色極低頻率以下自動(dòng)切換成一階慣性環(huán)節(jié)避免積分漂移。具體寫法是[ \psi_{\alpha}(k) \frac{T_s}{\tau_{LPF} T_s} \left( u_{\alpha} - R_s i_{\alpha} \right) \frac{\tau_{LPF}}{\tau_{LPF} T_s} \psi_{\alpha}(k-1) ]當(dāng) (\tau_{LPF}) 取得足夠大比如 200ms 級(jí)別這個(gè)式子在穩(wěn)態(tài)時(shí)的行為和積分器基本等效同時(shí)又不會(huì)因?yàn)槲⑿∑脽o限累積。這個(gè)處理看起來簡(jiǎn)單但能不能調(diào)穩(wěn)直接決定整套無傳感器方案能不能轉(zhuǎn)起來。3. C代碼實(shí)現(xiàn)從公式到可跑的程序梳理完算法邏輯接下來就是工程落地。很多剛?cè)胄械呐笥涯玫組atlab模型的時(shí)候最大的困惑是“模型跑得好好的怎么寫進(jìn)單片機(jī)就不行了”。這里面除了定點(diǎn)化、中斷周期這些老生常談的問題最大的陷阱是程序架構(gòu)和時(shí)序。3.1 程序模塊劃分我習(xí)慣把整個(gè)控制程序拆成三個(gè)模塊各司其職。第一個(gè)是采樣與坐標(biāo)變換模塊負(fù)責(zé)ADC讀取、電流標(biāo)幺化、Clarke/Park變換。第二個(gè)是觀測(cè)器模塊包含磁鏈觀測(cè)、轉(zhuǎn)速估算、切換邏輯。第三個(gè)是控制核心模塊包含速度環(huán)PI、電流環(huán)PI、SVPWM。三者之間通過結(jié)構(gòu)體傳遞數(shù)據(jù)不搞全局變量滿天飛。代碼文件組織成motor_obs.c磁鏈觀測(cè)器和轉(zhuǎn)速估算motor_foc.cFOC核心控制和坐標(biāo)變換motor_pi.cPI調(diào)節(jié)器帶積分限幅和抗飽和motor_svpwm.cSVPWM驅(qū)動(dòng)波形生成每個(gè)模塊的頭文件里定義好對(duì)外接口內(nèi)部靜態(tài)變量不對(duì)外暴露這樣調(diào)試和移植都方便。3.2 磁鏈觀測(cè)器核心代碼電壓模型積分器的C代碼實(shí)現(xiàn)大概長(zhǎng)這樣void voltage_model_update(MOTOR_OBS_TYPE *obs, float u_alpha, float u_beta, float i_alpha, float i_beta, float Ts) { float e_alpha, e_beta; float lpf_coeff; /* 反電動(dòng)勢(shì)計(jì)算考慮定子電阻壓降 */ e_alpha u_alpha - obs-R_s * i_alpha; e_beta u_beta - obs-R_s * i_beta; /* 帶低通反饋的積分器結(jié)構(gòu)抑制直流偏置 */ lpf_coeff Ts / (obs-tau_lpf Ts); obs-psi_s_alpha lpf_coeff * e_alpha (1.0f - lpf_coeff) * obs-psi_s_alpha; obs-psi_s_beta lpf_coeff * e_beta (1.0f - lpf_coeff) * obs-psi_s_beta; /* 定子磁鏈到轉(zhuǎn)子磁鏈的補(bǔ)償漏感補(bǔ)償系數(shù) */ obs-psi_r_alpha obs-sigma_ls * obs-psi_s_alpha obs-L_m * i_alpha; obs-psi_r_beta obs-sigma_ls * obs-psi_s_beta obs-L_m * i_beta; /* 磁鏈角度與幅值 */ obs-theta_e atan2f(obs-psi_r_beta, obs-psi_r_alpha); obs-psi_r_amp sqrtf(obs-psi_r_alpha * obs-psi_r_alpha obs-psi_r_beta * obs-psi_r_beta); }電流模型部分則是基于上一拍的角度和轉(zhuǎn)速估計(jì)推算轉(zhuǎn)差和新的磁鏈角度void current_model_update(MOTOR_OBS_TYPE *obs, float i_d, float i_q, float Ts) { float psi_r_est; float omega_sl; /* 轉(zhuǎn)子磁鏈幅值估算一階慣性環(huán)節(jié) */ psi_r_est obs-L_m * i_d / (1.0f obs-tau_r_est / Ts); psi_r_est (obs-tau_r_est / Ts) * obs-psi_r_amp_last / (1.0f obs-tau_r_est / Ts); /* 轉(zhuǎn)差頻率 */ omega_sl obs-L_m * i_q / (obs-tau_r_est * psi_r_est 0.001f); /* 上一拍的轉(zhuǎn)速估計(jì) 轉(zhuǎn)差 磁鏈角速度 */ obs-omega_e obs-omega_r_est_last omega_sl; /* 角度積分 */ obs-theta_e obs-omega_e * Ts; /* 歸一化到 -PI ~ PI */ if (obs-theta_e 3.14159f) obs-theta_e - 2.0f * 3.14159f; if (obs-theta_e -3.14159f) obs-theta_e 2.0f * 3.14159f; obs-psi_r_amp_last psi_r_est; }注意電流模型的磁鏈幅值那一行我做了簡(jiǎn)化處理實(shí)際工程里最好用一階濾波或者全階觀測(cè)器的形式避免純代數(shù)環(huán)。代碼里那個(gè)0.001f就是防除零的保護(hù)磁鏈幅值在預(yù)勵(lì)磁階段沒建立起來的時(shí)候這個(gè)保護(hù)很重要。3.3 切換邏輯與速度估算合并切換邏輯我用的是滯環(huán)比較加角度補(bǔ)償。當(dāng)轉(zhuǎn)速估算值上升到一定閾值以上逐步把電流模型的權(quán)重降下來電壓模型的權(quán)重升上去兩者角度差不超過一個(gè)很小的角度時(shí)再做切換。這樣做的原因是如果兩模型的角度偏差很大直接硬切就會(huì)造成電流突變。void observer_switch(MOTOR_OBS_TYPE *obs) { /* 低于15%額定轉(zhuǎn)速用電流模型高于30%用電壓模型中間線性過渡 */ if (obs-speed_pr 0.15f) { obs-model_weight 0.0f; /* 電流模型權(quán)重100% */ } else if (obs-speed_pr 0.30f) { obs-model_weight 1.0f; /* 電壓模型權(quán)重100% */ } else { obs-model_weight (obs-speed_pr - 0.15f) / 0.15f; } /* 按權(quán)重合并角度注意角度差要換算到-PI~PI */ float delta obs-theta_vol - obs-theta_cur; while (delta 3.14159f) delta - 6.28318f; while (delta -3.14159f) delta 6.28318f; obs-theta_e obs-theta_cur obs-model_weight * delta; }轉(zhuǎn)速估算則是在磁鏈角度合并后通過角度差微分拿到 (\omega_e)再減去轉(zhuǎn)差。這里需要做一個(gè)一階低通濾波不然速度反饋上的噪聲會(huì)通過速度環(huán)放大成轉(zhuǎn)矩抖動(dòng)。濾波截止頻率我一般取20~50Hz具體要看負(fù)載慣量和PI參數(shù)。4. 仿真模型搭建與離線驗(yàn)證仿真模型的價(jià)值不只是驗(yàn)證算法更重要的是觀察觀測(cè)器內(nèi)部的中間量。這些中間量在實(shí)物上用示波器抓比較費(fèi)勁但在仿真里可以直接拉出來看對(duì)理解算法行為特別有幫助。4.1 模型結(jié)構(gòu)與模塊對(duì)應(yīng)我的Simulink模型整體分為四塊異步電機(jī)模型、逆變器模型、FOC控制算法、磁鏈觀測(cè)器系統(tǒng)。電機(jī)模型用Simulink自帶的Asynchronous Machine SI Units即可逆變器用Universal Bridge搭一個(gè)三相兩電平橋控制算法和觀測(cè)器用S-Function或者M(jìn)atlab Function塊實(shí)現(xiàn)保證和C代碼邏輯一致。搭建時(shí)最關(guān)鍵的一點(diǎn)是“仿真模型就是代碼的映射”。我習(xí)慣在S-Function里直接寫和C代碼一樣的邏輯仿真跑出來的波形和代碼燒進(jìn)單片機(jī)后的行為才能保持一致。如果仿真模型和C代碼是兩套邏輯那就失去了仿真的意義。4.2 三個(gè)必看的仿真波形第一個(gè)必看的是磁鏈角度波形??此陔妷耗P秃碗娏髂P颓袚Q點(diǎn)附近是不是平滑過渡如果出現(xiàn)臺(tái)階說明切換邏輯的角度補(bǔ)償沒做好。第二個(gè)必看的是轉(zhuǎn)子磁鏈幅值曲線。從預(yù)勵(lì)磁到加載磁鏈幅值應(yīng)該穩(wěn)定在一個(gè)恒定值附近如果持續(xù)衰減說明電流模型的時(shí)間常數(shù)標(biāo)定不準(zhǔn)或者電壓模型的低通補(bǔ)償系數(shù)有問題。第三個(gè)必看的是零速和低速下的速度階躍響應(yīng)。在閉環(huán)調(diào)速模式下給定一個(gè)從0到10%額定轉(zhuǎn)速的階躍看轉(zhuǎn)速反饋能不能跟住動(dòng)態(tài)過程中是否出現(xiàn)電流震蕩。這一條很多算法在仿真階段就掛了。4.3 參數(shù)標(biāo)定的坑仿真里電機(jī)參數(shù)是寫死的但參數(shù)標(biāo)定這一環(huán)節(jié)必須提前做。異步電機(jī)的定子電阻、轉(zhuǎn)子電阻、互感、漏感這些參數(shù)直接決定觀測(cè)器精度。我一般用直流注入法測(cè)定子電阻用堵轉(zhuǎn)實(shí)驗(yàn)測(cè)漏感用空載實(shí)驗(yàn)測(cè)互感和轉(zhuǎn)子時(shí)間常數(shù)。這些參數(shù)最好做成配置表否則換一臺(tái)電機(jī)整套觀測(cè)器都要重新調(diào)。5. 調(diào)試實(shí)錄那些年我踩過的坑這部分是這套方案里最值錢的內(nèi)容。很多問題不是看公式能看出來的非得到現(xiàn)場(chǎng)測(cè)試才暴露。5.1 低速抖動(dòng)問題第一批樣機(jī)測(cè)試時(shí)在30rpm約1%額定轉(zhuǎn)速附近電機(jī)有明顯的低頻抖動(dòng)電流波形呈間歇性發(fā)散。排查下來問題出在電壓模型積分器的低通截止頻率太高導(dǎo)致低速時(shí)磁鏈幅值被壓偏。后來把 (\tau_{LPF}) 從50ms提到200ms抖動(dòng)基本消失。5.2 切換瞬間的沖擊從電流模型切到電壓模型的時(shí)候電機(jī)有明顯的電流尖峰。最開始懷疑是角度不連續(xù)后來抓了內(nèi)部變量才發(fā)現(xiàn)是兩模型估算出的磁鏈角度動(dòng)態(tài)偏差過大即使加了滯環(huán)切換切換瞬間角度差仍然超過15度。最后是加了一個(gè)角度同步環(huán)節(jié)切換前把電壓模型的角度先鎖到電流模型的角度上等角度差收斂到5度以內(nèi)才開始增加電壓模型的權(quán)重。5.3 電機(jī)溫度升高后的失速現(xiàn)象跑耐久測(cè)試時(shí)發(fā)現(xiàn)帶載運(yùn)行兩小時(shí)后電機(jī)出現(xiàn)了輕微失速甚至過流報(bào)警。排查發(fā)現(xiàn)由于轉(zhuǎn)子升溫導(dǎo)致轉(zhuǎn)子電阻變大電流模型估算的轉(zhuǎn)差頻率偏低實(shí)際磁鏈角度滯后于估算值轉(zhuǎn)矩輸出衰減。這個(gè)問題的根源是電流模型對(duì)轉(zhuǎn)子時(shí)間常數(shù)的敏感性。解決思路是增加一個(gè)基于電壓模型結(jié)果的在線修正環(huán)節(jié)在過渡區(qū)持續(xù)對(duì)比兩個(gè)模型的磁鏈幅值偏差用它在線修正電流模型的轉(zhuǎn)子時(shí)間常數(shù)。這個(gè)修正方法不算復(fù)雜但效果非常明顯。5.4 常見問題速查表現(xiàn)象可能原因排查方向低速抖動(dòng)、電流發(fā)散電壓模型低通截止頻率太高增大 (\tau_{LPF})觀察磁鏈幅值是否平穩(wěn)切換瞬間電流尖峰兩模型磁鏈角度偏差大增加角度同步環(huán)節(jié)做切換前對(duì)齊滿載失速、轉(zhuǎn)矩不足轉(zhuǎn)子時(shí)間常數(shù)失配在線修正電流模型的 (\tau_r)或限制加載速率速度反饋噪聲大角度微分帶來的高頻分量速度估算輸出加低通濾波適當(dāng)降低帶寬啟動(dòng)瞬間過流預(yù)勵(lì)磁時(shí)間不夠磁場(chǎng)未建立延長(zhǎng)預(yù)勵(lì)磁時(shí)間或采用斜坡勵(lì)磁實(shí)際調(diào)試過程中我最大的體會(huì)是這套方案能不能轉(zhuǎn)起來50%靠算法結(jié)構(gòu)50%靠細(xì)節(jié)處理。同樣一套C代碼有的人燒進(jìn)去就能跑有的人跑了就炸差別往往就在幾個(gè)參數(shù)的初始化和幾個(gè)邊界條件的處理上。最后再分享一個(gè)經(jīng)驗(yàn)無傳感器方案的調(diào)試順序一定是先調(diào)觀察器再調(diào)控制環(huán)。先把電壓模型的磁鏈幅值和角度對(duì)著用真實(shí)編碼器采集的數(shù)據(jù)驗(yàn)證確認(rèn)誤差在可接受范圍了再拔掉編碼器跑閉環(huán)。不要一開始就盲調(diào)不然出了問題你根本分不清是觀測(cè)器的問題還是PI參數(shù)的問題。這套方案我已經(jīng)在兩個(gè)不同的電機(jī)平臺(tái)一個(gè)4kW異步電機(jī)一個(gè)30kW異步電機(jī)上跑過了效果都很穩(wěn)定希望這次拆解能幫你少走點(diǎn)彎路。本文還有配套的精品資源點(diǎn)擊獲取