速詳解:TIM3四倍頻、機(jī)械角度與電角度)
STM32F4 FOC 編碼器電機(jī)角度與轉(zhuǎn)速詳解TIM3 四倍頻、機(jī)械角度、電角度與測速做 FOC 無刷電機(jī)控制最基礎(chǔ)也最容易出問題的就是電機(jī)轉(zhuǎn)子位置和速度的獲取。位置不對電流環(huán)解算出來的方向就是錯(cuò)的速度反饋不準(zhǔn)速度環(huán)和位置環(huán)根本調(diào)不起來。而對于 STM32F4 跑 FOC 的項(xiàng)目來說使用正交編碼器配合定時(shí)器接口模式是最常用、最穩(wěn)定的方案之一。這次的核心是搞清楚三件事TIM3 怎么配置成編碼器模式并實(shí)現(xiàn)四倍頻機(jī)械角度到電角度之間怎么換算以及基于編碼器脈沖如何做轉(zhuǎn)速測量。文章偏向?qū)崙?zhàn)會給出 CubeMX 配置、寄存器說明、代碼實(shí)現(xiàn)和常見問題排查適合正在做 FOC 控制、無感/有感矢量控制或者對編碼器測速有需求的開發(fā)者參考。我會重點(diǎn)展開以下內(nèi)容STM32F4 定時(shí)器編碼器模式的工作原理TIM3 四倍頻的實(shí)現(xiàn)方法與計(jì)數(shù)方向判定機(jī)械角度、電角度與極對數(shù)之間的關(guān)系編碼器零位與角度初始化M 法與 T 法測速的實(shí)現(xiàn)對比常見問題與排查思路1. 核心概念速覽能力項(xiàng)說明主控平臺STM32F4 系列以 STM32F407 為例其他型號類似編碼器類型增量式正交編碼器常見 200~4096 線定時(shí)器模塊TIM3可選 TIM1/TIM2/TIM4/TIM5/TIM8 等四倍頻原理利用 A/B 兩路信號的 4 個(gè)邊沿提高分辨率角度類型機(jī)械角度、電角度電角度需乘極對數(shù)測速方法M 法測頻率、T 法測周期、M/T 法綜合資源需求1 個(gè)四倍頻定時(shí)器 簡單數(shù)學(xué)運(yùn)算無額外傳感器用于場景FOC 電流環(huán)、速度環(huán)、位置環(huán)反饋云臺/機(jī)器人/伺服驅(qū)動(dòng)T 法測速適合低速場景M 法測速適合中高速場景M/T 法適合寬速度范圍場景。實(shí)際項(xiàng)目中可以根據(jù)電機(jī)最高轉(zhuǎn)速和編碼器線數(shù)選擇最合適的方案。2. 為什么 FOC 必須要位置信息以及編碼器接口模式的原理FOC 的核心是把三相交流電機(jī)的定子電流通過 Clarke 變換和 Park 變換解耦成 d 軸和 q 軸兩個(gè)直流分量去控制。而 Park 變換中需要用到轉(zhuǎn)子的電角度這個(gè)角度來源通常有幾個(gè)方向霍爾傳感器、編碼器、磁編碼器如 AS5047P、或者無感觀測器如滑模觀測器 SMO、龍伯格觀測器。編碼器的優(yōu)勢在于精度高、響應(yīng)快、抗干擾能力強(qiáng)。增量式編碼器輸出 A、B 兩路相位相差 90° 的正交脈沖通過判斷 A、B 的相對相位先后來確定旋轉(zhuǎn)方向。STM32F4 的通用定時(shí)器有一個(gè)非常實(shí)用的特性編碼器接口模式。這種模式下定時(shí)器硬件會自動(dòng)處理 A、B 兩路信號的邊沿檢測、方向判斷和計(jì)數(shù)方向切換不需要 CPU 額外干預(yù)而且支持四倍頻。四倍頻的意思是在編碼器線數(shù)為 N 的情況下A 相和 B 相各有上升沿和下降沿也就是每個(gè)完整的 A/B 周期可以產(chǎn)生 4 個(gè)計(jì)數(shù)脈沖。最終的分辨率就是4 * N。以常見 1000 線編碼器為例四倍頻后每圈脈沖數(shù)為 4000角度分辨率可以達(dá)到360° / 4000 0.09°。對于大多數(shù) FOC 應(yīng)用來說這個(gè)精度已經(jīng)完全夠用。在編碼器接口模式下TIM3 根據(jù) A、B 相的電平組合自動(dòng)切換向上計(jì)數(shù)或向下計(jì)數(shù)CNT 寄存器直接反映位置增量而 CR1 寄存器的 DIR 位則可以反饋當(dāng)前方向。// 以 HAL 庫獲取當(dāng)前方向?yàn)槔?uint8_t direction __HAL_TIM_IS_GET_DIRECTION(htim3);這個(gè)方向信息在測速和角度解算中會很常用。3. STM32F4 定時(shí)器編碼器模式與 TIM3 四倍頻配置3.1 TIM3 引腳映射在 STM32F4 上TIM3 的通道 1CH1默認(rèn)映射到 PA6通道 2CH2默認(rèn)映射到 PA7但通過 AF 復(fù)用配置也可以映射到 PC6 和 PC7。使用編碼器接口模式時(shí)通常讓通道 1 接編碼器 A 相通道 2 接編碼器 B 相。使用 STM32CubeMX 配置方法如下使能 TIM3將 Channel1 和 Channel2 均配置為Encoder Mode。配置Combined Channels為Encoder Mode TI1 and TI2這是最常用的四倍頻模式。配置計(jì)數(shù)周期Counter Period這個(gè)值決定 CNT 的最大計(jì)數(shù)值一般設(shè)為四倍頻后的單圈脈沖數(shù)減 1例如 4000 線對應(yīng) 16000。配置輸入濾波器和預(yù)分頻器。在 CubeMX 中定時(shí)器配置界面相關(guān)參數(shù)如下Counter Period等于四倍頻之后的單圈總脈沖數(shù)減 1。Input Filter建議設(shè)置 2 到 8可以濾掉數(shù)字噪聲。Input Prescaler通常設(shè)為 1即不分頻。這里的關(guān)鍵是理解編碼器模式下定時(shí)器計(jì)數(shù)值是在 0 和 Counter Period 之間往復(fù)計(jì)數(shù)當(dāng)計(jì)數(shù)到達(dá)上限后如果繼續(xù)正轉(zhuǎn)會回繞到 0。這就是角度計(jì)算中取余的基本邏輯。3.2 TIM3 編碼器模式寄存器配置如果不想用 CubeMX也可以直接用寄存器配置。核心寄存器包括TIM_CR1設(shè)置計(jì)數(shù)方向編碼器模式下由硬件自動(dòng)管理DIR 位只讀。TIM_SMCR選擇從模式為編碼器模式SMS 0011。TIM_CCMR1設(shè)置通道 1 和通道 2 的輸入捕獲映射到 TI1、TI2。TIM_CCER使能捕獲并配置極性通常兩個(gè)通道的極性相同。TIM_ARR設(shè)置計(jì)數(shù)周期。TIM_CNT清零作為位置計(jì)數(shù)器使用。一個(gè)簡化配置示例void TIM3_Encoder_Init(void) { RCC-APB1ENR | RCC_APB1ENR_TIM3EN; GPIO_InitTypeDef GPIO_InitStruct {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin GPIO_PIN_6 | GPIO_PIN_7; GPIO_InitStruct.Mode GPIO_MODE_AF_PP; GPIO_InitStruct.Pull GPIO_PULLUP; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate GPIO_AF2_TIM3; HAL_GPIO_Init(GPIOA, GPIO_InitStruct); TIM3-PSC 0; TIM3-ARR 4000 * 4 - 1; // 1000線編碼器四倍頻 TIM3-CCMR1 | TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0; TIM3-CCMR1 | TIM_CCMR1_IC1F_2 | TIM_CCMR1_IC2F_2; TIM3-CCER | TIM_CCER_CC1E | TIM_CCER_CC2E; TIM3-SMCR | TIM_SMCR_SMS_0 | TIM_SMCR_SMS_1; // 編碼器模式3 TIM3-CR1 | TIM_CR1_CEN; }3.3 四倍頻方向判定邏輯編碼器接口模式下定時(shí)器的硬件邏輯比較特殊計(jì)數(shù)器并不是單純地在每個(gè)上升沿或下降沿加一而是根據(jù) A、B 兩相的電平狀態(tài)組合來決定是加一、減一還是不變。在四倍頻模式下每個(gè)信號周期的 4 個(gè)邊沿都會觸發(fā)一次更新每次更新的方向由當(dāng)前時(shí)刻兩路信號的電平狀態(tài)決定。方向判定完全由硬件完成不需要在中斷里讀取兩路 GPIO 電平來判斷方向這降低了中斷負(fù)載。實(shí)際測試中當(dāng)電機(jī)正轉(zhuǎn)時(shí)TIM3 的 CNT 寄存器遞增反轉(zhuǎn)時(shí) CNT 遞減。反轉(zhuǎn)越過零后會從 ARR 值往下回繞表示角度取模時(shí)的自然流轉(zhuǎn)。4. 機(jī)械角度與電角度的關(guān)系及代碼實(shí)現(xiàn)4.1 機(jī)械角度計(jì)算機(jī)械角度也就是電機(jī)轉(zhuǎn)軸實(shí)際旋轉(zhuǎn)的物理角度。增量式編碼器沒有絕對零位所以上電后默認(rèn)機(jī)械角度為 0需要先校準(zhǔn)零點(diǎn)例如上電時(shí)讓電機(jī)對齊到一個(gè)確定的電角度再清零編碼器計(jì)數(shù)或者在編碼器 Z 相Index 信號到來時(shí)清零。機(jī)械角度計(jì)算公式角度計(jì)數(shù)原始值 TIM3-CNT 機(jī)械角度 (TIM3-CNT / 單圈總脈沖數(shù)) * 360° 機(jī)械角度 (TIM3-CNT % 單圈總脈沖數(shù)) * 360° / 單圈總脈沖數(shù)在 STM32F4 上用一個(gè) uint16_t 讀取 CNT 值即可范圍已經(jīng)限制在 ARR 以內(nèi)。注意CNT 計(jì)數(shù)器是回繞計(jì)數(shù)的所以讀取后需要立即與 ARR 計(jì)算取?;蛘甙呀Y(jié)果存為連續(xù)累加位置。為了提高計(jì)算速度FOC 程序中盡量避免浮點(diǎn)運(yùn)算可以使用 Q15 或 Q24 格式表示角度。例如將 360° 映射到 Q15 的 0~32767或者直接存儲在 int32_t 變量中每圈累計(jì)一個(gè)固定增量。示例代碼#define ENCODER_PULSE_PER_REV (1000 * 4) // 1000線編碼器四倍頻 float Encoder_GetMechanicalAngle(TIM_HandleTypeDef *htim) { uint16_t cnt __HAL_TIM_GET_COUNTER(htim); float angle_deg ((float)cnt / ENCODER_PULSE_PER_REV) * 360.0f; return angle_deg; }4.2 電角度計(jì)算電角度的核心公式是電角度 機(jī)械角度 × 極對數(shù)Pole Pairs對于永磁同步電機(jī)PMSM極對數(shù)是電機(jī)磁極對數(shù)。例如一個(gè) 4 極電機(jī)極對數(shù)為 2電機(jī)每轉(zhuǎn)一圈電角度變化 720°。在實(shí)際 FOC 解算中更常用的是電角度的周期形式電角度電角周期整數(shù)部分 (機(jī)械角度計(jì)數(shù) × 極對數(shù)) / 單圈總脈沖數(shù) 電角度剩余值 (機(jī)械角度計(jì)數(shù) × 極對數(shù)) % 單圈總脈沖數(shù)以 TIM3 計(jì)數(shù)值為例#define POLE_PAIRS 4 // 4對極即8極電機(jī)按實(shí)際填寫 uint16_t mechanical_cnt __HAL_TIM_GET_COUNTER(htim3); uint32_t electrical_cnt (uint32_t)mechanical_cnt * POLE_PAIRS; electrical_cnt % ENCODER_PULSE_PER_REV; float electrical_angle ((float)electrical_cnt / ENCODER_PULSE_PER_REV) * 2.0f * PI;這里有一個(gè) FOC 開發(fā)中很常見的坑電角度計(jì)算的超前滯后問題。編碼器安裝后A 相與電機(jī) U 相之間的相位關(guān)系不是固定的如果電角度算出來電流環(huán)無法正常出力通常需要調(diào)整一個(gè)非常量偏移角度。比較穩(wěn)妥的做法是在電機(jī)對齊到任意一個(gè)已知電角度后記錄編碼器計(jì)數(shù)然后計(jì)算實(shí)際電角度偏移。一個(gè)常用的校準(zhǔn)流程給電機(jī)施加 U 相正方向電流例如 d 軸電流正向讓轉(zhuǎn)子鎖止到一個(gè)已知位置。讀取當(dāng)前編碼器值記錄為encoder_zero_offset。在運(yùn)行時(shí)電角度 (編碼器計(jì)數(shù) - encoder_zero_offset) * 極對數(shù) * 角度系數(shù)。這樣可以在代碼中統(tǒng)一處理安裝偏移。4.3 方向?qū)嵌鹊挠绊懢幋a器方向與電機(jī) FOC 方向相反時(shí)最直觀的表現(xiàn)是電流環(huán)調(diào)試時(shí)電機(jī)飛車、過流或者完全轉(zhuǎn)不動(dòng)。處理方法有兩個(gè)在電機(jī)側(cè)交換其中兩相線使電機(jī)實(shí)際轉(zhuǎn)向與編碼器方向一致在軟件側(cè)把編碼器計(jì)數(shù)取反即cnt -cnt然后再參與角度計(jì)算。第二種方法改動(dòng)小適合調(diào)試階段快速驗(yàn)證。注意取反后要處理負(fù)數(shù)取模問題int32_t enc_raw (int16_t)(__HAL_TIM_GET_COUNTER(htim3)); int32_t enc_direction_corrected -enc_raw; enc_direction_corrected % (int32_t)ENCODER_PULSE_PER_REV; if (enc_direction_corrected 0) { enc_direction_corrected ENCODER_PULSE_PER_REV; }5. 位置累加與連續(xù)角度跟蹤增量式編碼器天然只提供增量信息在角速度較高時(shí)如果直接讀取 CNT 寄存器可能會面臨一個(gè)問題兩次讀取之間計(jì)數(shù)器可能已經(jīng)回繞了一次?;乩@會導(dǎo)致角度跳變。解決方式有兩種用 STM32 的定時(shí)器溢出中斷Update Interrupt在回繞時(shí)維護(hù)一個(gè)encoder_overflow_count變量把位置擴(kuò)展為 32 位。在高速控制循環(huán)中假設(shè)每次讀取 CNT 的間隔足夠短例如 FOC 電流環(huán) 10kHz~20kHz兩次讀取之間最多只回繞一次因此可以通過判斷 CNT 變化量是否大于 ARR 的一半來判斷是否回繞。推薦使用 32 位位置累計(jì)方式這也是工業(yè)伺服驅(qū)動(dòng)中常見做法volatile int32_t encoder_raw_count 0; volatile int32_t encoder_overflow_count 0; uint16_t last_cnt 0; void Encoder_UpdateOverflow(void) { uint16_t current_cnt __HAL_TIM_GET_COUNTER(htim3); int16_t diff (int16_t)(current_cnt - last_cnt); if (diff (int16_t)(ENCODER_PULSE_PER_REV / 2)) { encoder_overflow_count--; } else if (diff -(int16_t)(ENCODER_PULSE_PER_REV / 2)) { encoder_overflow_count; } encoder_raw_count (int32_t)encoder_overflow_count * ENCODER_PULSE_PER_REV current_cnt; last_cnt current_cnt; }注意如果定時(shí)器 ARR 設(shè)置為四倍頻單圈總脈沖數(shù)減 1那么溢出中斷頻次在電機(jī)高速轉(zhuǎn)動(dòng)時(shí)可能較高需要在中斷函數(shù)中只做簡單的累加運(yùn)算避免浮點(diǎn)計(jì)算和長耗時(shí)分支。更簡單的方式是利用定時(shí)器的 TI1 或 TI2 邊沿觸發(fā) DMA 或中斷但會占用 CPU 資源。實(shí)際項(xiàng)目一般把編碼器溢出更新放在 FOC 主循環(huán)中而不是中斷服務(wù)函數(shù)中。6. 基于 TIM3 編碼器的轉(zhuǎn)速測量M 法、T 法與 M/T 法6.1 M 法測速M(fèi) 法測速的基本思路是在固定時(shí)間窗口內(nèi)統(tǒng)計(jì)編碼器脈沖數(shù)然后用脈沖數(shù)除以時(shí)間得到頻率再乘以每個(gè)脈沖對應(yīng)的角度增量得到轉(zhuǎn)速。公式轉(zhuǎn)速 (RPM) (脈沖數(shù) / 時(shí)間窗口秒) * 60 / 單圈總脈沖數(shù)M 法適合高速場景因?yàn)楦咚贂r(shí)脈沖數(shù)多量化誤差相對較小。低速時(shí)如果脈沖數(shù)太少測出的轉(zhuǎn)速會跳躍非常嚴(yán)重。示例代碼uint16_t cnt1, cnt2; int32_t pulse_count; float rpm; cnt1 __HAL_TIM_GET_COUNTER(htim3); HAL_Delay(10); // 時(shí)間窗口 10ms cnt2 __HAL_TIM_GET_COUNTER(htim3); // 注意處理圈內(nèi)回繞 pulse_count (int32_t)(int16_t)(cnt2 - cnt1); // 每10ms計(jì)一個(gè)數(shù)對應(yīng)的轉(zhuǎn)速 脈沖數(shù) / (單圈總脈沖數(shù) * 0.01) * 60 rpm (float)pulse_count / (ENCODER_PULSE_PER_REV * 0.01f) * 60.0f;HAL_Delay 實(shí)際項(xiàng)目中不推薦在 FOC 控制循環(huán)中使用建議使用 SysTick 或固定中斷周期來獲取時(shí)間窗口。6.2 T 法測速T 法測速是測量兩個(gè)相鄰脈沖或指定數(shù)量脈沖之間的時(shí)間間隔然后用角度變化量除以時(shí)間得到轉(zhuǎn)速。公式轉(zhuǎn)速 (RPM) (角度增量 / 時(shí)間間隔) * 60 / 360°T 法適合低速場景因?yàn)榈退贂r(shí)脈沖間隔長時(shí)間測量精度高而高速時(shí)如果脈沖間隔太短定時(shí)器計(jì)數(shù)可能不夠精準(zhǔn)。T 法的實(shí)現(xiàn)通常依賴輸入捕獲功能捕獲相鄰兩次脈沖邊沿的時(shí)間戳計(jì)算間隔。在 STM32F4 上可以用定時(shí)器的輸入捕獲通道來實(shí)現(xiàn)也可以借助外部中斷加 DWT 周期計(jì)數(shù)。示例思路uint32_t t1, t2; uint32_t time_diff; // 在輸入捕獲中斷中獲取時(shí)間戳 t1 last_capture_time; t2 current_capture_time; if (t2 t1) { time_diff t2 - t1; } else { time_diff 0xFFFFFFFF - t1 t2; } // 每個(gè)脈沖對應(yīng)的角度 360 / 單圈總脈沖數(shù) float speed_deg_per_s (360.0f / ENCODER_PULSE_PER_REV) / (time_diff / TIMER_CLOCK_MHZ); float rpm speed_deg_per_s / 360.0f * 60.0f;6.3 M/T 法測速M(fèi)/T 法結(jié)合了 M 法和 T 法的優(yōu)點(diǎn)在低速和高速下都能保持較高精度。實(shí)現(xiàn)邏輯是先選定一個(gè)目標(biāo)時(shí)間窗口在窗口結(jié)束后等待捕獲到下一個(gè)脈沖邊沿然后同時(shí)統(tǒng)計(jì)該時(shí)間段內(nèi)的脈沖數(shù)和定時(shí)器時(shí)鐘周期數(shù)。M/T 法適合寬速度范圍場景但實(shí)現(xiàn)復(fù)雜度高一檔。對于大部分 FOC 興趣項(xiàng)目如果電機(jī)運(yùn)行在幾百到幾千 RPMM 法其實(shí)就夠用。6.4 速度環(huán)采樣周期選擇速度環(huán)采樣周期一般比電流環(huán)慢很多。FOC 電流環(huán)通常運(yùn)行在 10kHz~20kHz速度環(huán)可以放在 1kHz 下運(yùn)行位置環(huán)可以更慢。編碼器測速在這個(gè)采樣周期內(nèi)如果 M 法測速脈沖少于 5 個(gè)建議增大時(shí)間窗口或者切換到 T 法。7. FOC 電流環(huán)、速度環(huán)、位置環(huán)中的角度與速度接口最終在 FOC 算法中角度和速度要接入到以下位置控制流程 位置環(huán)可選- 速度環(huán) - 電流環(huán)Id/Iq- Park 變換 - SVPWM - 三相逆變器 - 電機(jī) 角度和速度反饋 - 編碼器 - TIM3 計(jì)數(shù) - 角度/速度解算在實(shí)際代碼中Park 變換和逆 Park 變換都需要電角度這個(gè)電角度必須來自編碼器換算結(jié)果而不是直接使用機(jī)械角度。如果直接使用機(jī)械角度電機(jī)在帶載時(shí)會發(fā)生明顯的轉(zhuǎn)矩波動(dòng)嚴(yán)重時(shí)甚至無法啟動(dòng)。典型調(diào)用流程// FOC 中斷 10kHz void FOC_ISR(void) { // 1. 獲取編碼器計(jì)數(shù) uint16_t enc_cnt __HAL_TIM_GET_COUNTER(htim3); // 2. 計(jì)算機(jī)械角度和電角度 float mech_angle Encoder_GetMechanicalAngle(enc_cnt); float elec_angle Encoder_GetElectricalAngle(enc_cnt); // 3. 采樣相電流 - Clarke - Park使用 elec_angle // 4. PI 調(diào)節(jié) - 逆 Park使用 elec_angle // 5. SVPWM 輸出 } // 速度環(huán) 1kHz void SpeedLoop_1kHz(void) { float rpm Encoder_GetSpeedM(); speed_pi_output Speed_PI(rpm, target_rpm); }注意這兩個(gè)函數(shù)中Encoder_GetElectricalAngle需要提前完成極對數(shù)換算和零點(diǎn)偏移補(bǔ)償否則電流環(huán)角度與實(shí)際轉(zhuǎn)子位置有偏差矢量控制效果會打折扣。8. 常見問題與排查方法問題現(xiàn)象可能原因排查方式解決方案上電后角度跳變編碼器沒有絕對零位上電默認(rèn)值為隨機(jī)打印上電 CNT 值做零點(diǎn)校準(zhǔn)或使用 Z 相歸零電機(jī)反轉(zhuǎn)時(shí)角度計(jì)算異常方向未處理CNT 負(fù)數(shù)取模錯(cuò)誤打印原始 CNT 和計(jì)算角度加方向糾正負(fù)數(shù)處理角度抖動(dòng)明顯編碼器信號有毛刺濾波不足用示波器看 A/B 波形增加輸入濾波檢查接線和共地M 法測速低速跳變時(shí)間窗口內(nèi)脈沖數(shù)太少打印脈沖數(shù)換 T 法或加長時(shí)間窗口電流環(huán)無法正常出力電角度零位偏移未校準(zhǔn)對齊后記錄編碼器值初始化時(shí)計(jì)算 offset 并補(bǔ)償計(jì)數(shù)器到邊界回繞未處理溢出打印 CNT 原始值加溢出計(jì)數(shù)或 32 位位置累計(jì)TIM3 編碼器模式不計(jì)數(shù)引腳復(fù)用配置錯(cuò)誤或未開啟編碼器模式打印 CR1、SMCR 寄存器檢查 CubeMX 或寄存器配置電機(jī)噪音大、發(fā)熱電角度方向反了或偏移不對檢查轉(zhuǎn)向和 FOC 波形調(diào)整方向/零偏排查順序建議如果 FOC 電機(jī)轉(zhuǎn)不起來建議先從編碼器原始數(shù)據(jù)排查再做角度換算最后才排查電流環(huán) PI 參數(shù)。順序如下打印 TIM3-CNT手動(dòng)旋轉(zhuǎn)電機(jī)軸確認(rèn)計(jì)數(shù)是否遞增/遞減。打印機(jī)械角度確認(rèn)一圈對應(yīng) 0~360°。打印電角度緩慢旋轉(zhuǎn)電機(jī)確認(rèn)電角度變化是機(jī)械角度的極對數(shù)倍。給一個(gè)固定電壓開環(huán)測試確認(rèn)電機(jī)轉(zhuǎn)動(dòng)方向。閉環(huán)測試先用低速速度環(huán)試再切換位置環(huán)。這一步一步排查下來編碼器相關(guān)的 90% 問題都能定位到原因。9. 調(diào)參建議與工程實(shí)踐9.1 編碼器濾波參數(shù)STM32 定時(shí)器編碼器模式的輸入濾波可以有效抑制抖動(dòng)。濾波值不是越大越好過大會導(dǎo)致真實(shí)邊沿被濾掉尤其在高速下會出現(xiàn)丟步。建議低速場景使用中等濾波高速場景使用較小濾波或關(guān)斷。電機(jī)最高轉(zhuǎn)速建議濾波設(shè)置 500 RPM8~15500~3000 RPM4~8 3000 RPM0~4實(shí)際數(shù)值需要在示波器輔助下調(diào)整避免盲目取值。9.2 編碼器線數(shù)選擇做 FOC 時(shí)編碼器線數(shù)選擇需要平衡成本和性能200~500 線入門實(shí)驗(yàn)級四倍頻后分辨率 800~2000低速表現(xiàn)一般。1000 線大多數(shù) DIY FOC 項(xiàng)目和教學(xué)實(shí)驗(yàn)的主流選擇四倍頻后分辨率 4000。4096 線以上或磁編碼器用于高性能伺服。磁編碼器如 AS5047P通常直接輸出 SPI 或 ABZ 信號配合 STM32F4 也很方便但那是另一套配置方式。如果手頭只有 200 線的編碼器做 FOC 低速實(shí)驗(yàn)會明顯感覺到轉(zhuǎn)速波動(dòng)。9.3 定時(shí)器溢出中斷中不要做浮點(diǎn)運(yùn)算FOC 控制對實(shí)時(shí)性要求很高如果編碼器溢出中斷頻率很高例如高速電機(jī)加上高線數(shù)編碼器中斷服務(wù)函數(shù)里盡量只處理整數(shù)變量更新。浮點(diǎn)角度和速度計(jì)算放在主控制循環(huán)中進(jìn)行。9.4 數(shù)據(jù)打印與上位機(jī)聯(lián)動(dòng)調(diào)試時(shí)建議把以下數(shù)據(jù)通過串口或虛擬示波器VOFA、SerialPlot讀出編碼器原始計(jì)數(shù)值機(jī)械角度電角度目標(biāo)速度和實(shí)際速度速度環(huán)輸出和電流環(huán)給定當(dāng)電角度波形在恒速旋轉(zhuǎn)時(shí)應(yīng)該是平滑的三角波或鋸齒波如果在某個(gè)位置出現(xiàn)跳變大概率是角度回繞或零點(diǎn)偏移問題。10. 總結(jié)與下一步STM32F4 上的 FOC 編碼器方案本質(zhì)上就是用硬件編碼器接口模式簡化了位置增量的獲取然后用一小段數(shù)學(xué)換算完成機(jī)械角度、電角度和速度解算。TIM3 四倍頻可以基于常見 1000 線編碼器達(dá)到 4000 脈沖/圈的精度配合極對數(shù)映射到電角度已經(jīng)能滿足多數(shù) DIY 伺服和教學(xué)實(shí)驗(yàn)的需求。建議拿到板子后先做三件事第一步用示波器或邏輯分析儀確認(rèn)編碼器 A/B 波形和方向第二步運(yùn)行基礎(chǔ)角度解算手動(dòng)轉(zhuǎn)軸觀察串口輸出的機(jī)械角度和電角度曲線第三步用 M 法測速匹配速度環(huán)先跑通低速再逐步提速。最容易踩的坑是零點(diǎn)偏移和方向不一致這些問題在開環(huán)測試階段就能暴露出來不要直接上閉環(huán)。后續(xù)可以繼續(xù)擴(kuò)展的方向包括M/T 法測速提升低速性能、編碼器 Z 相索引歸零、磁編碼器 SPI 接入對比、以及把編碼器反饋接入無感 FOC 觀測器的啟動(dòng)過渡邏輯。每一步都在這個(gè)基礎(chǔ)上加一個(gè)小模塊不會影響整體架構(gòu)。建議收藏備用調(diào)編碼器時(shí)可以直接對照。