感FOC中PLL替代反正切:解決滑膜觀測(cè)器角度抖動(dòng))
1. 從滑膜觀測(cè)器的角度抖動(dòng)說(shuō)起為什么換PLL如果你調(diào)過(guò)STM32F4平臺(tái)上的無(wú)感FOC大概率經(jīng)歷過(guò)這個(gè)場(chǎng)景電機(jī)在中低速運(yùn)行時(shí)能轉(zhuǎn)但一到某個(gè)轉(zhuǎn)速區(qū)間轉(zhuǎn)速波形就開(kāi)始出現(xiàn)周期性抖動(dòng)示波器上看到的是角度估算值在真實(shí)值附近來(lái)回?cái)[動(dòng)電流波形也跟著出現(xiàn)毛刺。你反復(fù)調(diào)滑膜觀測(cè)器的增益調(diào)來(lái)調(diào)去要么抖得輕一點(diǎn)但動(dòng)態(tài)響應(yīng)變慢要么響應(yīng)快了抖動(dòng)又加劇。這個(gè)矛盾本質(zhì)上不是滑膜觀測(cè)器本身的問(wèn)題而是它輸出的是反電動(dòng)勢(shì)的開(kāi)關(guān)信號(hào)里面天然含有高頻抖振分量直接拿這個(gè)信號(hào)去反正切求角度抖動(dòng)就會(huì)被放大?;び^測(cè)器的核心思路是構(gòu)造一個(gè)滑模面讓估算電流跟蹤實(shí)際電流當(dāng)系統(tǒng)進(jìn)入滑模面后反電動(dòng)勢(shì)的估算值就等價(jià)于滑模控制量經(jīng)過(guò)低通濾波后的結(jié)果。問(wèn)題就出在這個(gè)低通濾波上截止頻率設(shè)低了角度估算滯后高速時(shí)誤差大設(shè)高了高頻抖振濾不干凈角度抖動(dòng)明顯。而且低通濾波引入的相位延遲還需要額外做角度補(bǔ)償補(bǔ)償系數(shù)跟轉(zhuǎn)速相關(guān)標(biāo)定起來(lái)非常麻煩。PLL鎖相環(huán)的思路則完全不同。它不直接對(duì)反電動(dòng)勢(shì)做反正切而是把估算的反電動(dòng)勢(shì)α、β分量送入一個(gè)鎖相環(huán)結(jié)構(gòu)通過(guò)PI調(diào)節(jié)器讓估算角度跟蹤真實(shí)角度。PLL本質(zhì)上是一個(gè)閉環(huán)角度跟蹤系統(tǒng)它對(duì)高頻噪聲有天然的抑制能力因?yàn)镻I調(diào)節(jié)器本身就是一個(gè)低通特性而且它跟蹤的是角度誤差的積分穩(wěn)態(tài)時(shí)角度誤差趨近于零。換句話說(shuō)PLL把“求角度”這件事從一個(gè)開(kāi)環(huán)計(jì)算變成了閉環(huán)跟蹤抖動(dòng)被閉環(huán)帶寬壓制住了。我在STM32F407上做過(guò)對(duì)比測(cè)試同一臺(tái)無(wú)刷電機(jī)同一組滑膜觀測(cè)器參數(shù)只把角度提取環(huán)節(jié)從反正切換成PLL轉(zhuǎn)速波動(dòng)從±30rpm降到±8rpm左右電流波形明顯干凈了。這個(gè)改善在中低速段尤其明顯因?yàn)榈退贂r(shí)反電動(dòng)勢(shì)幅值小反正切對(duì)噪聲更敏感而PLL的閉環(huán)特性可以把噪聲壓下去。注意PLL不是萬(wàn)能的它解決的是角度提取環(huán)節(jié)的抖動(dòng)問(wèn)題如果滑膜觀測(cè)器本身的估算反電動(dòng)勢(shì)就不準(zhǔn)PLL也救不回來(lái)。所以前置的滑膜觀測(cè)器參數(shù)還是要調(diào)好PLL是在此基礎(chǔ)上的優(yōu)化。2. STM32F4上PLL鎖相環(huán)的數(shù)學(xué)結(jié)構(gòu)與離散化2.1 PLL的基本框圖與傳遞函數(shù)PLL鎖相環(huán)在電機(jī)控制里的典型結(jié)構(gòu)是這樣的估算反電動(dòng)勢(shì)的α、β分量經(jīng)過(guò)Park變換到估算角度對(duì)應(yīng)的旋轉(zhuǎn)坐標(biāo)系得到ε -Eα·cosθ_est - Eβ·sinθ_est這個(gè)ε就是角度誤差信號(hào)。當(dāng)估算角度接近真實(shí)角度時(shí)ε近似正比于角度誤差Δθ。然后ε經(jīng)過(guò)PI調(diào)節(jié)器輸出角速度估算值ω_est再經(jīng)過(guò)積分得到角度θ_est。用傳遞函數(shù)描述從真實(shí)角度θ到估算角度θ_est的閉環(huán)傳遞函數(shù)為θ_est(s)/θ(s) (Kp·s Ki) / (s2 Kp·s Ki)這是一個(gè)典型的二階系統(tǒng)自然頻率ωn sqrt(Ki)阻尼比ζ Kp/(2·sqrt(Ki))。通常取ζ 0.707最佳阻尼然后根據(jù)需要的帶寬確定ωn。比如想要100Hz的跟蹤帶寬ωn 2π·100 ≈ 628 rad/s那么Ki ωn2 ≈ 394384Kp 2·ζ·ωn ≈ 888。這個(gè)參數(shù)設(shè)計(jì)方法比滑膜觀測(cè)器那種“試湊法”要清晰得多因?yàn)镻LL的帶寬有明確的物理意義你可以直接根據(jù)電機(jī)的最高運(yùn)行頻率來(lái)選。一般取PLL帶寬為電機(jī)基頻的5到10倍既能保證跟蹤速度又能有效抑制噪聲。2.2 離散化實(shí)現(xiàn)與STM32F4的定點(diǎn)/浮點(diǎn)選擇STM32F407帶FPU所以直接用浮點(diǎn)運(yùn)算最省事。離散化用后向歐拉法// PLL參數(shù) #define PLL_KP 888.0f #define PLL_KI 394384.0f #define PLL_TS 0.0001f // 10kHz控制頻率 typedef struct { float theta; // 估算角度 float omega; // 估算角速度 float err; // 角度誤差 float integral; // 積分項(xiàng) } PLL_State; void PLL_Update(PLL_State *pll, float Ealpha, float Ebeta) { // 計(jì)算角度誤差 float sin_th arm_sin_f32(pll-theta); float cos_th arm_cos_f32(pll-theta); pll-err -Ealpha * cos_th - Ebeta * sin_th; // PI調(diào)節(jié)器 pll-integral PLL_KI * pll-err * PLL_TS; pll-omega PLL_KP * pll-err pll-integral; // 積分得到角度 pll-theta pll-omega * PLL_TS; // 角度歸一化到0~2π if (pll-theta 6.2831853f) pll-theta - 6.2831853f; if (pll-theta 0.0f) pll-theta 6.2831853f; }這里有幾個(gè)實(shí)操細(xì)節(jié)值得說(shuō)。第一arm_sin_f32和arm_cos_f32是CMSIS-DSP庫(kù)的查表加插值實(shí)現(xiàn)速度比標(biāo)準(zhǔn)庫(kù)快很多在168MHz的F407上單次調(diào)用大約20個(gè)周期10kHz控制頻率下完全夠用。第二積分項(xiàng)要做限幅防止啟動(dòng)時(shí)誤差過(guò)大導(dǎo)致積分飽和一般限幅到額定角速度的1.5倍。第三角度歸一化用減法比用fmodf快因?yàn)閒modf是函數(shù)調(diào)用減法就是一條指令。如果你用的是STM32F401這種沒(méi)有FPU或者FPU性能較弱的型號(hào)可以考慮定點(diǎn)實(shí)現(xiàn)但說(shuō)實(shí)話F4系列基本都帶FPU除非成本壓到極致否則沒(méi)必要折騰定點(diǎn)。我試過(guò)在F401上用Q15定點(diǎn)跑PLL代碼復(fù)雜度翻倍效果還不如浮點(diǎn)直接跑。2.3 與滑膜觀測(cè)器的銜接反電動(dòng)勢(shì)從哪來(lái)PLL的輸入是估算反電動(dòng)勢(shì)Eα、Eβ這兩個(gè)量來(lái)自滑膜觀測(cè)器。典型的滑膜觀測(cè)器輸出是// 滑膜觀測(cè)器輸出 float Ealpha_est LPF(sliding_mode_output_alpha); float Ebeta_est LPF(sliding_mode_output_beta);這里的LPF截止頻率通常設(shè)得比較低比如200Hz到500Hz目的是濾掉滑模的開(kāi)關(guān)抖振。但正如前面說(shuō)的這個(gè)LPF會(huì)引入相位延遲。用了PLL之后LPF的截止頻率可以適當(dāng)提高因?yàn)镻LL本身對(duì)高頻噪聲有抑制不需要LPF承擔(dān)全部濾波任務(wù)。我一般把LPF截止頻率從200Hz提高到500Hz這樣相位延遲減小PLL的輸入信號(hào)更“新鮮”整體角度跟蹤更快。提示LPF截止頻率提高后PLL的PI參數(shù)可能需要微調(diào)因?yàn)檩斎朐肼曉龃罅恕H绻l(fā)現(xiàn)角度還是有抖動(dòng)先把PLL的Kp減小、Ki適當(dāng)增大讓閉環(huán)帶寬降一點(diǎn)。3. 在STM32F4工程里落地PLL的完整步驟3.1 定時(shí)器與ADC配置控制頻率的選擇FOC的控制頻率決定了PLL的離散化步長(zhǎng)進(jìn)而影響參數(shù)設(shè)計(jì)。STM32F4的定時(shí)器位數(shù)足夠靈活TIM1是16位高級(jí)定時(shí)器適合做PWM生成TIM2/TIM5是32位通用定時(shí)器適合做控制循環(huán)觸發(fā)。我一般用TIM1產(chǎn)生20kHz的PWM用TIM1的更新事件觸發(fā)ADC采樣然后在ADC中斷里跑FOC和PLL控制頻率就是20kHz。但20kHz下PLL的TS 50μs如果PLL帶寬設(shè)100Hzωn·TS ≈ 0.031離散化誤差可以忽略。如果你把控制頻率降到10kHzTS 100μsωn·TS ≈ 0.063也還能接受。但再低就不行了比如5kHz下ωn·TS ≈ 0.126離散化帶來(lái)的相位誤差就明顯了需要改用雙線性變換或者Tustin離散化。// TIM1配置為20kHz PWM中心對(duì)齊模式 void TIM1_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Prescaler 0; TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_CenterAligned1; TIM_TimeBaseStructure.TIM_Period 4200 - 1; // 168MHz/2/4200 20kHz TIM_TimeBaseStructure.TIM_ClockDivision TIM_CKD_DIV1; TIM_TimeBaseInit(TIM1, TIM_TimeBaseStructure); // 更新事件觸發(fā)ADC TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update); TIM_Cmd(TIM1, ENABLE); }中心對(duì)齊模式下更新事件發(fā)生在計(jì)數(shù)器到零和到峰值時(shí)所以實(shí)際觸發(fā)頻率是PWM頻率的兩倍也就是40kHz。如果你在更新中斷里跑FOC控制頻率就是40kHz。這個(gè)細(xì)節(jié)很容易搞錯(cuò)我第一次調(diào)的時(shí)候以為控制頻率是20kHz結(jié)果PLL參數(shù)算出來(lái)帶寬翻倍角度抖得厲害。后來(lái)用示波器量了一下中斷頻率才發(fā)現(xiàn)問(wèn)題。3.2 滑膜觀測(cè)器與PLL的代碼集成整個(gè)無(wú)感FOC的代碼流程是這樣的ADC中斷觸發(fā) → 讀取相電流 → Clarke變換 → Park變換 → 電流PI → 反Park變換 → SVPWM輸出 → 滑膜觀測(cè)器更新 → PLL更新 → 得到角度和速度。void ADC_IRQHandler(void) { // 讀取電流 Ia ADC_GetConversionValue(ADC1) * CURRENT_SCALE; Ib ADC_GetConversionValue(ADC2) * CURRENT_SCALE; // Clarke變換 Ialpha Ia; Ibeta (Ia 2.0f * Ib) * ONE_BY_SQRT3; // Park變換 float sin_th arm_sin_f32(pll.theta); float cos_th arm_cos_f32(pll.theta); Id Ialpha * cos_th Ibeta * sin_th; Iq -Ialpha * sin_th Ibeta * cos_th; // 電流PI Vd PI_Update(pi_d, Id_ref - Id); Vq PI_Update(pi_q, Iq_ref - Iq); // 反Park變換 Valpha Vd * cos_th - Vq * sin_th; Vbeta Vd * sin_th Vq * cos_th; // SVPWM SVPWM_Update(Valpha, Vbeta); // 滑膜觀測(cè)器 SMO_Update(Ialpha, Ibeta, Valpha, Vbeta); // PLL更新 PLL_Update(pll, smo.Ealpha_est, smo.Ebeta_est); // 清除中斷標(biāo)志 ADC_ClearITPendingBit(ADC1, ADC_IT_EOC); }這段代碼里有個(gè)順序問(wèn)題PLL更新必須在滑膜觀測(cè)器之后因?yàn)镻LL用的是滑膜觀測(cè)器輸出的反電動(dòng)勢(shì)。但PLL輸出的角度又要在下一次Park變換時(shí)使用所以實(shí)際上角度是滯后一個(gè)控制周期的。這個(gè)滯后在20kHz下是50μs對(duì)應(yīng)電角度延遲很小可以忽略。但如果你的控制頻率只有5kHz200μs的延遲在高速時(shí)就會(huì)造成明顯誤差需要做角度預(yù)測(cè)補(bǔ)償。3.3 啟動(dòng)階段的處理PLL的初始化與切換無(wú)感FOC的啟動(dòng)是個(gè)麻煩事因?yàn)榈退贂r(shí)反電動(dòng)勢(shì)太小滑膜觀測(cè)器估不準(zhǔn)PLL也就跟不準(zhǔn)。常見(jiàn)的做法是先用開(kāi)環(huán)強(qiáng)拖把電機(jī)拉到一定轉(zhuǎn)速后再切換到閉環(huán)。切換瞬間PLL的積分項(xiàng)需要預(yù)置到當(dāng)前的開(kāi)環(huán)角速度角度直接對(duì)齊開(kāi)環(huán)角度否則PLL會(huì)有一個(gè)大的暫態(tài)過(guò)程。void FOC_Startup(void) { // 開(kāi)環(huán)強(qiáng)拖階段 for (int i 0; i 2000; i) { openloop_theta OPENLOOP_OMEGA * PLL_TS; SVPWM_Update(OPENLOOP_VOLTAGE * arm_cos_f32(openloop_theta), OPENLOOP_VOLTAGE * arm_sin_f32(openloop_theta)); delay_us(50); } // 切換到閉環(huán)前預(yù)置PLL狀態(tài) pll.theta openloop_theta; pll.omega OPENLOOP_OMEGA; pll.integral OPENLOOP_OMEGA; // 積分項(xiàng)預(yù)置為當(dāng)前角速度 pll.err 0.0f; // 使能閉環(huán) closed_loop_enable 1; }這里pll.integral OPENLOOP_OMEGA是關(guān)鍵因?yàn)镻I調(diào)節(jié)器的輸出是Kp·err integral穩(wěn)態(tài)時(shí)err≈0輸出就是integral。如果不預(yù)置integral從零開(kāi)始PLL輸出角速度會(huì)從零慢慢爬升電機(jī)就會(huì)失步。我踩過(guò)這個(gè)坑切換瞬間電機(jī)“咯噔”一下電流沖到限幅值后來(lái)加上預(yù)置就平順了。注意開(kāi)環(huán)強(qiáng)拖的角速度不能太低一般至少要到額定轉(zhuǎn)速的10%到15%否則反電動(dòng)勢(shì)還是太小切換后PLL可能鎖不住。具體值取決于電機(jī)參數(shù)KV值高的電機(jī)可以低一些KV值低的電機(jī)需要高一些。4. 調(diào)參實(shí)戰(zhàn)PLL帶寬、滑膜增益與濾波器的聯(lián)合整定4.1 PLL參數(shù)對(duì)系統(tǒng)性能的影響規(guī)律PLL的Kp和Ki不是隨便設(shè)的它們直接決定了角度跟蹤的帶寬和阻尼。我整理了一個(gè)參數(shù)影響表方便你快速判斷調(diào)整方向參數(shù)變化角度跟蹤速度角度抖動(dòng)抗噪聲能力適用場(chǎng)景Kp增大變快增大變差高速、動(dòng)態(tài)響應(yīng)要求高Kp減小變慢減小變好低速、噪聲大Ki增大變快增大變差需要快速消除穩(wěn)態(tài)誤差Ki減小變慢減小變好穩(wěn)態(tài)精度要求不高帶寬ωn增大變快增大變差高速運(yùn)行阻尼ζ減小變快振蕩變差不推薦實(shí)際調(diào)參時(shí)我一般先按ζ0.707、ωn2π·(電機(jī)基頻×5)算一組初值然后根據(jù)實(shí)測(cè)波形微調(diào)。如果發(fā)現(xiàn)角度有低頻振蕩說(shuō)明阻尼不夠增大Kp或者減小Ki如果發(fā)現(xiàn)角度有高頻毛刺說(shuō)明帶寬太高減小Kp和Ki。4.2 滑膜觀測(cè)器增益與PLL的耦合關(guān)系滑膜觀測(cè)器的增益決定了反電動(dòng)勢(shì)估算的收斂速度而PLL的帶寬決定了角度跟蹤速度。這兩個(gè)參數(shù)是耦合的如果滑膜增益太低反電動(dòng)勢(shì)估算滯后PLL輸入信號(hào)本身就不準(zhǔn)角度跟蹤再好也沒(méi)用如果滑膜增益太高反電動(dòng)勢(shì)抖振大PLL輸入噪聲大角度抖動(dòng)也會(huì)增大。我的經(jīng)驗(yàn)是先把滑膜觀測(cè)器調(diào)到一個(gè)“勉強(qiáng)能用”的狀態(tài)也就是電機(jī)能轉(zhuǎn)、角度大致跟得上然后在此基礎(chǔ)上調(diào)PLL。調(diào)PLL的時(shí)候先把Ki設(shè)為零只調(diào)Kp讓角度能跟上但略有滯后然后逐漸增大Ki直到滯后消除但抖動(dòng)不明顯增加。這個(gè)過(guò)程有點(diǎn)像調(diào)電流環(huán)PI先調(diào)P再調(diào)I。// 滑膜觀測(cè)器增益典型值以STM32F4 20kHz控制為例 #define SMO_K_SLIDE 0.5f // 滑模增益 #define SMO_LPF_FC 500.0f // LPF截止頻率Hz #define SMO_TS 0.00005f // 20kHz // PLL參數(shù)與滑膜觀測(cè)器匹配 #define PLL_KP 600.0f #define PLL_KI 200000.0f這組參數(shù)在額定轉(zhuǎn)速3000rpm、極對(duì)數(shù)4的電機(jī)上跑過(guò)轉(zhuǎn)速波動(dòng)在±10rpm以內(nèi)。但換一臺(tái)電機(jī)就需要重新調(diào)因?yàn)榉措妱?dòng)勢(shì)常數(shù)不同滑膜觀測(cè)器的輸出幅值不同PLL的等效增益也就不同。4.3 實(shí)測(cè)波形分析與問(wèn)題定位調(diào)參過(guò)程中示波器是最好的朋友。我一般用DAC輸出PLL的err信號(hào)和omega信號(hào)或者用SWO打印到上位機(jī)看波形。幾個(gè)典型問(wèn)題問(wèn)題一角度波形有周期性尖峰。這通常是滑膜觀測(cè)器的開(kāi)關(guān)噪聲導(dǎo)致的檢查L(zhǎng)PF截止頻率是否太低或者PLL的Kp是否太大。把LPF截止頻率提高同時(shí)減小PLL的Kp尖峰一般會(huì)消失。問(wèn)題二角度波形整體滯后。這是PLL帶寬不夠增大Kp和Ki。但要注意帶寬增大后抖動(dòng)也會(huì)增大需要折中。問(wèn)題三角度波形在某個(gè)轉(zhuǎn)速區(qū)間振蕩。這是PLL的阻尼不夠或者滑膜觀測(cè)器在該轉(zhuǎn)速下估算不準(zhǔn)。先檢查滑膜觀測(cè)器的反電動(dòng)勢(shì)波形是否正常如果反電動(dòng)勢(shì)本身就有問(wèn)題先調(diào)滑膜。問(wèn)題四啟動(dòng)時(shí)角度鎖不住。檢查PLL積分項(xiàng)預(yù)置是否正確以及開(kāi)環(huán)切換轉(zhuǎn)速是否足夠高。提示用DAC輸出內(nèi)部變量是最方便的調(diào)試手段STM32F4有兩個(gè)DAC通道可以同時(shí)輸出err和omega接示波器就能看。如果沒(méi)有DAC用SWO的ITM輸出也行但采樣率有限看不了高頻細(xì)節(jié)。5. 幾個(gè)容易踩的坑與我的處理方式5.1 角度歸一化與三角函數(shù)查表的精度問(wèn)題PLL輸出的角度需要?dú)w一化到0到2π然后用arm_sin_f32和arm_cos_f32計(jì)算三角函數(shù)。CMSIS-DSP的這兩個(gè)函數(shù)用的是查表加線性插值表長(zhǎng)256點(diǎn)精度大約0.01弧度。對(duì)于FOC來(lái)說(shuō)這個(gè)精度足夠了因?yàn)殡娏鳝h(huán)的帶寬遠(yuǎn)低于此。但如果你發(fā)現(xiàn)電流波形有周期性畸變可以試試用更高精度的查表比如1024點(diǎn)表或者直接用sinf和cosfF4的FPU算這個(gè)大概50個(gè)周期20kHz下也夠用。我試過(guò)用sinf替換arm_sin_f32電流波形的THD從3.2%降到2.8%改善有限但確實(shí)有。如果你的應(yīng)用對(duì)噪聲敏感可以試試。5.2 低速時(shí)PLL的失效與應(yīng)對(duì)PLL在低速時(shí)的問(wèn)題和滑膜觀測(cè)器一樣反電動(dòng)勢(shì)太小信噪比低。當(dāng)轉(zhuǎn)速低于額定轉(zhuǎn)速的5%時(shí)PLL的角度誤差會(huì)明顯增大甚至鎖不住。這時(shí)候有幾個(gè)選擇一是用開(kāi)環(huán)強(qiáng)拖到更高轉(zhuǎn)速再切閉環(huán)二是用高頻注入法估算低速角度但這需要額外的硬件支持和復(fù)雜的算法三是用IF啟動(dòng)也就是電流閉環(huán)、頻率開(kāi)環(huán)等轉(zhuǎn)速上來(lái)再切。我在實(shí)際項(xiàng)目中一般用第一種因?yàn)楹?jiǎn)單可靠。如果應(yīng)用要求低速大扭矩那就得上高頻注入但那是另一個(gè)話題了。5.3 參數(shù)整定的順序不能亂很多人調(diào)無(wú)感FOC的時(shí)候喜歡把滑膜觀測(cè)器、PLL、電流環(huán)一起調(diào)結(jié)果哪個(gè)參數(shù)影響哪個(gè)都搞不清楚。我的建議是嚴(yán)格按順序來(lái)先調(diào)電流環(huán)有傳感器或者開(kāi)環(huán)確保電流跟蹤正常再調(diào)滑膜觀測(cè)器讓反電動(dòng)勢(shì)估算大致準(zhǔn)確最后調(diào)PLL優(yōu)化角度跟蹤。每一步都確認(rèn)波形正常后再進(jìn)行下一步這樣出問(wèn)題容易定位。這個(gè)順序看起來(lái)慢但實(shí)際上比亂調(diào)快得多。我見(jiàn)過(guò)有人調(diào)了一周都沒(méi)調(diào)好按這個(gè)順序半天就搞定了。5.4 不同電機(jī)參數(shù)的適配PLL的參數(shù)和電機(jī)參數(shù)是相關(guān)的。反電動(dòng)勢(shì)常數(shù)大的電機(jī)同樣轉(zhuǎn)速下反電動(dòng)勢(shì)幅值大PLL的等效增益高Kp和Ki可以適當(dāng)減小反電動(dòng)勢(shì)常數(shù)小的電機(jī)則相反。極對(duì)數(shù)多的電機(jī)同樣機(jī)械轉(zhuǎn)速下電頻率高PLL帶寬需要相應(yīng)提高。我一般會(huì)先測(cè)一下電機(jī)的反電動(dòng)勢(shì)常數(shù)和極對(duì)數(shù)然后按公式算一組初值再微調(diào)。這樣比盲試快很多。// 根據(jù)電機(jī)參數(shù)計(jì)算PLL初值 // Ke: 反電動(dòng)勢(shì)常數(shù)(V/krpm) // pp: 極對(duì)數(shù) // rpm_max: 最高轉(zhuǎn)速 float Ke 12.5f; // 示例 float pp 4.0f; float rpm_max 3000.0f; float fe_max rpm_max * pp / 60.0f; // 最高電頻率 float omega_n 2.0f * 3.14159f * fe_max * 5.0f; // 帶寬取5倍基頻 float zeta 0.707f; float Kp 2.0f * zeta * omega_n; float Ki omega_n * omega_n;這段代碼算出來(lái)的Kp和Ki可以直接用然后根據(jù)實(shí)測(cè)微調(diào)。注意這里的Kp和Ki是連續(xù)域的離散化時(shí)Kp不變Ki要乘以TS。我在代碼里把Ki已經(jīng)乘過(guò)TS了所以直接賦值就行。6. 寫(xiě)在最后的一些個(gè)人體會(huì)PLL替代反正切做角度提取這個(gè)改動(dòng)本身不大代碼量也就幾十行但效果提升很明顯。我第一次在F407上跑通的時(shí)候看到轉(zhuǎn)速波動(dòng)從±30rpm降到±8rpm確實(shí)有點(diǎn)驚喜。后來(lái)在多個(gè)項(xiàng)目上驗(yàn)證只要滑膜觀測(cè)器調(diào)得不太差PLL都能帶來(lái)可觀的改善。不過(guò)也要說(shuō)清楚PLL不是銀彈。它解決的是角度提取環(huán)節(jié)的噪聲和抖動(dòng)如果滑膜觀測(cè)器本身估算的反電動(dòng)勢(shì)就有系統(tǒng)性誤差比如參數(shù)不匹配導(dǎo)致的幅值偏差PLL是修不了的。所以電機(jī)參數(shù)辨識(shí)、滑膜觀測(cè)器的增益整定這些基礎(chǔ)工作還是要做扎實(shí)。另外PLL的帶寬選擇需要根據(jù)應(yīng)用場(chǎng)景折中。如果你的應(yīng)用對(duì)動(dòng)態(tài)響應(yīng)要求高比如伺服定位帶寬可以高一些如果是風(fēng)機(jī)水泵這類(lèi)對(duì)穩(wěn)態(tài)精度要求高、動(dòng)態(tài)要求低的帶寬可以低一些換取更平滑的角度。最后分享一個(gè)調(diào)試小技巧用DAC輸出PLL的err信號(hào)然后用手輕輕給電機(jī)軸施加阻力觀察err的變化。如果err能快速回到零附近說(shuō)明PLL跟蹤正常如果err持續(xù)偏大或者振蕩說(shuō)明參數(shù)需要調(diào)整。這個(gè)方法比看轉(zhuǎn)速波形更直接因?yàn)閑rr就是角度誤差的直接反映。