:ePWM脈沖生成與梯形加減速避坑指南)
簡介基于TI TMS320F28335 DSP與Xilinx XC3S500E FPGA聯(lián)合控制的步進電機例程與原理圖資料包面向電機控制、電力電子與嵌入式實時系統(tǒng)開發(fā)者重點解決DSP與FPGA協(xié)同驅(qū)動步進電機時的接口設計、時序配合和驅(qū)動邏輯問題。包內(nèi)包含DSP端與FPGA端工程源碼代碼層面可看到PWM生成、方向與速度控制、雙芯片間通信協(xié)議以及FPGA側(cè)時序配置原理圖部分則展示硬件連接關(guān)系、電源管理電路與保護電路設計讓讀者能對照軟硬件實現(xiàn)理解整套控制流程。壓縮包共248個文件大小約25.13MB主要文件類型包括C/ASM源碼、H頭文件、FPGA工程文件.bit/.ucf/.vhd、VHDL設計文件以及PDF/DOCX說明文檔另有編譯過程中產(chǎn)生的ISE中間文件適合按工程目錄逐步梳理。目前已有349人瀏覽學習對需要開展課程設計、畢業(yè)設計或工業(yè)電機控制項目預研的開發(fā)者這套資料提供了從算法到硬件的完整參考。1. 先搞懂 DSP28335 控制步進電機到底在做什么拿著 DSP28335 板子做步進電機控制的人通常不是被電機難住而是被“為什么脈沖發(fā)完了位置不對”“為什么一上電電機自己跑了一下”“為什么轉(zhuǎn)速一高就丟步”這類問題卡住。步進電機控制本質(zhì)很簡單給驅(qū)動器發(fā)脈沖、給方向信號、控加減速但 DSP28335 這類 150MHz 的浮點 DSP 用在這個場景里真正價值不在“發(fā)脈沖”本身而在于多軸擴展、實時位置閉環(huán)、中斷響應和處理其它控制任務時的那點余量。這份資源是一套完整的 DSP28335 步進電機控制工程覆蓋 ePWM 發(fā)脈沖、梯形加減速、位置計數(shù)、方向切換和編碼器反饋閉環(huán)適合剛從單片機轉(zhuǎn)過來、或者已經(jīng)在用 DSP 但只跑過 LED 閃爍的人。2. 為什么用 DSP28335 而不用單片機三根信號線和三種發(fā)脈沖方式2.1 步進電機控制只需要三根信號線但發(fā)脈沖的方式?jīng)Q定上限步進電機驅(qū)動器比如常見的 A4988、DRV8825 或者脈沖型伺服驅(qū)動器對外接口高度統(tǒng)一脈沖PULSE、方向DIR、使能ENABLE。DSP28335 要做的就是把這三個 GPIO 信號按正確的時序送出去。脈沖信號的頻率決定電機轉(zhuǎn)速脈沖的個數(shù)決定電機轉(zhuǎn)過的角度方向引腳的電平?jīng)Q定正轉(zhuǎn)還是反轉(zhuǎn)。這套協(xié)議沒有任何歧義單片機能做DSP 也能做差別在于單片機常見做法是定時器中斷翻轉(zhuǎn) GPIO 產(chǎn)生脈沖一個脈沖進一次中斷轉(zhuǎn)速高了中斷開銷很大。DSP28335 有 6 個 ePWM 模塊每個模塊可以獨立產(chǎn)生 PWM 波形脈沖頻率由硬件計數(shù)器控制CPU 幾乎不參與。DSP 的 ePWM 支持增減計數(shù)、比較翻轉(zhuǎn)、周期中斷很容易實現(xiàn)“頻率可變的脈沖串”這正是加減速控制需要的。選 DSP28335 的真實理由不是“車不過單片機”而是如果你的項目后面要加編碼器反饋做位置閉環(huán)、要同時控制 3 到 4 個軸、要在電機運動的同時跑通信和邏輯判斷那 DSP 的硬件外設和中斷響應能力會從容很多。A 同學做個三軸平臺用某款單片機控制脈沖一多 CPU 占用率飆到 70%挪到 DSP28335 之后 CPU 幾乎只負責算加減速和改寄存器。2.2 脈沖、方向、使能三個信號的時序細節(jié)三根線雖然簡單但時序上有幾個容易被忽略的點方向信號一定要在脈沖信號之前建立。驅(qū)動器的電平轉(zhuǎn)換和內(nèi)部邏輯需要時間如果方向引腳和脈沖同時變化驅(qū)動可能把第一個脈沖當成反向。常見做法是先寫 GPIO 方向延時幾個微秒再開始發(fā)脈沖。使能信號低有效居多。很多驅(qū)動器是 ENABLE 低電平使能懸空等于使能容易造成上電后電機鎖死、發(fā)熱。脈沖的高電平寬度和低電平寬度要滿足驅(qū)動器最小脈寬要求。常規(guī)驅(qū)動器要求高電平不小于 1 到 2 微秒頻率特別高時要檢查占空比和電平轉(zhuǎn)換芯片的響應速度。DSP28335 的 GPIO 輸出是 3.3V 電平多數(shù)驅(qū)動器接收 5V 或者更高電平信號中間需要電平轉(zhuǎn)換或光耦隔離。這個放到第 3 章展開這里先說協(xié)議層面的結(jié)論只要方向先于脈沖一個安全時間、使能按需控制、脈沖占空比滿足要求電機就能轉(zhuǎn)起來。2.3 發(fā)脈沖的三條路ePWM、定時器中斷、純軟件延時同一個 DSP28335 上發(fā)脈沖有三條路線選型直接影響后續(xù)代碼復雜度發(fā)脈沖方式實現(xiàn)思路最高頻率CPU 占用適用場景ePWM 模塊硬件 PWM 輸出改 TBPRD 即可變頻率可達 MHz 級極低多軸、高速、加減速定時器中斷翻轉(zhuǎn) GPIO每次中斷翻轉(zhuǎn)一個引腳受中斷開銷限制通常幾十 kHz 內(nèi)中簡單單軸、頻率變化不頻繁純軟件延時翻轉(zhuǎn)延時函數(shù)控制高低電平時間極低受延時精度影響滿只適合測試和點動這套資源用的是 ePWM 方案。定時器中斷方案的特點是改頻率非常靈活每個中斷都能改下一個脈沖的周期但頻率一高中斷頻繁進出現(xiàn)場保護、壓棧、出棧的開銷會讓波形抖動。ePWM 方案恰恰相反PWM 波形由硬件持續(xù)產(chǎn)生CPU 只需要在需要變化頻率的時刻更新一次 TBPRD 寄存器后續(xù)波形由硬件自動維持波形質(zhì)量高且不占 CPU。加減速的粒度取決于 CPU 多久更新一次 TBPRD一般用定時器中斷以固定間隔比如 1ms更新一次在這個間隔內(nèi) PWM 頻率保持恒定階梯感在高細分下幾乎察覺不到。3. 接線與電平匹配光耦隔離、限流電阻和共地噪聲3.1 最小接線DSP28335 引腳到驅(qū)動器接口的對應關(guān)系以最常用的脈沖接口舉例選擇 ePWM1AGPIO0作為脈沖輸出。ePWM1A 在增減計數(shù)模式下可以產(chǎn)生對稱方波占空比 50%非常規(guī)整。選擇 GPIO1 作為方向輸出普通 GPIO 即可。選擇 GPIO2 作為使能輸出低電平使能。如果驅(qū)動器是差分輸入比如脈沖型伺服還需要把單端信號轉(zhuǎn)成差分信號常見做法是加一顆差分線驅(qū)動芯片或者使用帶差分輸入的驅(qū)動器端子。我一般會在 DSP 和驅(qū)動器之間加一級緩沖比如 74HC245 或光耦。原因很簡單DSP28335 的 GPIO 驅(qū)動能力有限直接驅(qū)動光耦或長線容易造成信號畸變。加了緩沖之后即使驅(qū)動器端出現(xiàn)異常電壓也不至于直接打到 DSP 引腳上。這是血淚經(jīng)驗之前某次調(diào)試時驅(qū)動器電源接反反向電壓順著信號線燒了 DSP 的一個 GPIO從那以后所有demo板我都強制加隔離和緩沖。3.2 光耦隔離隔離電源和信號地不要混用如果現(xiàn)場環(huán)境電磁噪聲大或者驅(qū)動器和 DSP 之間距離超過半米光耦隔離是最穩(wěn)妥的方案。選型要點普通光耦如 4N35響應速度慢適合頻率 20kHz 以內(nèi)的場合。高速光耦如 6N137響應時間在 100ns 級別適合高頻脈沖傳輸。光耦兩側(cè)電源必須隔離DSP 側(cè)用 3.3V驅(qū)動器側(cè)用驅(qū)動器提供的 5V 或 12V兩側(cè)的地不能連在一起否則光耦失去隔離意義。有一個坑特別常見光耦輸入側(cè)的限流電阻取值不合適。輸入側(cè) LED 的額定電流一般在 5 到 15mA電阻取太大則電流不足、輸出波形變差取太小則光耦發(fā)熱甚至損壞。3.3V 驅(qū)動 6N137 輸入時限流電阻一般取 330 歐姆到 470 歐姆之間。5V 驅(qū)動時取 470 到 680 歐姆。實際值要根據(jù) LED 正向壓降和所需電流算一下別照著網(wǎng)上電路圖硬抄。3.3 電平匹配3.3V 信號控 5V 驅(qū)動器的三種做法DSP28335 GPIO 輸出 3.3V多數(shù)步進驅(qū)動器為了兼容老設備輸入閾值按 5V TTL 設計。3.3V 高電平可能勉強達到閾值也可能不夠?qū)е旅}沖丟失或誤觸發(fā)。三種補救方案直接換支持 3.3V 輸入的驅(qū)動器最簡單但選擇面窄。加電平轉(zhuǎn)換芯片如 TXS0102、SN74LVC2T45雙向自動轉(zhuǎn)換適合單路脈沖和方向。用三極管或 MOSFET 做電平拉升把 3.3V 信號轉(zhuǎn)成開漏輸出再接上拉到 5V。這個方案成本最低但上升沿受上拉電阻影響頻率高時會變慢只適合低頻場合。第三種方案有一個細節(jié)上拉電阻越小上升沿越陡但靜態(tài)電流越大。10kHz 脈沖用 4.7k 上拉沒問題100kHz 就得用 1k 甚至更小。示波器測一下上升沿超過 1 微秒就要換更小的上拉電阻。3.4 共地和噪聲一上電就丟步的元兇步進電機驅(qū)動器內(nèi)部有斬波電路電機繞組電流頻繁切換會在電源和地線上產(chǎn)生很大的電流尖峰。如果 DSP 的信號地和驅(qū)動器功率地走同一條線這些尖峰直接竄進 DSP 的地回路表現(xiàn)為電機一轉(zhuǎn)脈沖計數(shù)莫名其妙多幾個嚴重點直接復位。處理辦法DSP 信號地、驅(qū)動器邏輯地、功率地單點匯接功率地走粗短線直接回電源負極。脈沖和方向信號線用雙絞線和電機繞組線保持距離。如果信號線超過 30 厘米兩端各加一個磁珠或者串一個小電阻33 歐姆以內(nèi)抑制振鈴。這些措施很難用萬用表判斷只能靠示波器和經(jīng)驗。遇到“接線明明對了但工作不可靠”的情況先把功率線遠離信號線往往就正常了。這行當里很多問題是玄學其實都是布局和地回路在作祟。4. 把加減速寫進 DSPePWM 脈沖生成與梯形速度曲線實現(xiàn)4.1 初始化 ePWM輸出一路固定頻率脈沖的寄存器配置先看 ePWM1A 作為脈沖輸出通道的初始化代碼void EPwm1_PulseInit(Uint32 pulse_freq_hz) { // 時基周期 系統(tǒng)時鐘 / (2 * 脈沖頻率) EPwm1Regs.TBPRD (150000000U / (2 * pulse_freq_hz)) - 1U; EPwm1Regs.TBCTR 0U; // 計數(shù)器清零 EPwm1Regs.CMPA.half.CMPA EPwm1Regs.TBPRD / 2U; // 比較值取一半獲得50%占空比 // 增減計數(shù)模式計數(shù)器先增后減一個完整周期輸出一個脈沖 EPwm1Regs.TBCTL.bit.CTRMODE TB_COUNT_UPDOWN; // 不分頻時鐘直接給到時基模塊 EPwm1Regs.TBCTL.bit.HSPCLKDIV TB_DIV1; EPwm1Regs.TBCTL.bit.CLKDIV TB_DIV1; // 動作限定增計數(shù)到CMPA時輸出高減計數(shù)到CMPA時輸出低 EPwm1Regs.AQCTLA.bit.CAU AQ_SET; EPwm1Regs.AQCTLA.bit.CAD AQ_CLEAR; // 使能時基周期中斷用于后續(xù)更新頻率 EPwm1Regs.ETSEL.bit.INTEN 1U; EPwm1Regs.ETSEL.bit.INTSEL ET_CTR_ZERO; EPwm1Regs.ETPS.bit.INTPRD ET_1ST; }這段配置說明系統(tǒng)時鐘 150MHz不分頻送入時基模塊增減計數(shù)模式下TBPRD 決定計數(shù)峰值輸出頻率 150MHz / (2 * (TBPRD 1))。CMPA 設為 TBPRD 一半計數(shù)器增計數(shù)到 CMPA 時引腳輸出高電平減計數(shù)回到 CMPA 時輸出低電平波形就是 50% 占空比方波。周期中斷選擇計數(shù)器歸零時觸發(fā)這樣每次 TBPRD 更新后可以同步修改 CMPA 保持占空比。修改頻率時要注意TBPRD 和 CMPA 必須在同一個周期中斷里一起更新不能只改 TBPRD 不改 CMPA否則占空比會突然變化電機電流波形異常。4.2 梯形加減速步數(shù)、啟動頻率、加速度怎么換算步進電機失步的根源在于脈沖頻率突變。電機轉(zhuǎn)子有慣性頻率瞬間拉高轉(zhuǎn)子跟不上脈沖就會丟步。梯形加減速本質(zhì)上就是讓頻率以可控斜率上升和下降。三個核心參數(shù)啟動頻率 f_start電機能直接起轉(zhuǎn)的頻率一般取 500Hz 以內(nèi)比較安全帶負載時還要降低。最高頻率 f_max目標轉(zhuǎn)速對應的頻率受限于電機最大轉(zhuǎn)速和驅(qū)動細分。加速度 accel每秒頻率增加量單位 Hz/s。加速度太大容易丟步太小加長加減速時間。步數(shù)計算關(guān)系如果要求電機轉(zhuǎn) N 圈、驅(qū)動器細分為 S、絲桿導程為 L總步數(shù) N * S * (一圈所需脈沖數(shù))。帶減速比還要乘以減速比。這套換算在 DSP 里用整數(shù)運算避免浮點數(shù)溢出// 參數(shù)目標圈數(shù)、細分、減速比、絲桿導程 Uint32 Steps_Calculate(float turns, Uint16 microstep, float gear_ratio, float lead_mm) { float total_steps_f turns * microstep * 200.0f * gear_ratio; // 200是兩相步進電機整步步數(shù)如果是五相電機改成500 return (Uint32)(total_steps_f); }實際使用中導程和減速比都會有誤差開環(huán)控制時累計誤差不可消除這就是后面要加編碼器反饋做閉環(huán)的原因。梯形加減速的核心結(jié)構(gòu)用結(jié)構(gòu)體管理typedef struct { Uint32 target_steps; // 總步數(shù) Uint32 current_step; // 已發(fā)步數(shù) Uint32 freq_start_hz; // 啟動頻率 Uint32 freq_max_hz; // 目標頻率 float accel_hz_per_s; // 加速度 Hz/s Uint32 switch_step; // 減速起始點 Uint8 state; // 0加速 1勻速 2減速 3停止 } Trapezoid_Move_t; Trapezoid_Move_t g_move;梯形加減速的減速點計算加速段步數(shù) f_max2 / (2 * accel) 附近的一個整數(shù)。當剩余步數(shù)小于加速段步數(shù)時開始減速。這樣確保減速段和加速段對稱總步數(shù)不夠時還沒有達到最高頻率就開始減速形成三角形速度曲線。4.3 位置與方向狀態(tài)機脈沖發(fā)完要能停下來控制循環(huán)放在定時器中斷里比如每 1ms 進一次中斷在中斷里更新頻率值。核心思路是ePWM 硬件持續(xù)輸出當前頻率的脈沖中斷定期修改頻率實現(xiàn)頻率階梯變化同時累加已發(fā)步數(shù)。interrupt void Timer1_Update_ISR(void) { static Uint32 elapsed_ms 0; if(g_move.state 0U) { // 加速 g_move.freq_current g_move.accel_hz_per_s * 0.001f; if(g_move.freq_current g_move.freq_max_hz) { g_move.freq_current g_move.freq_max_hz; g_move.state 1U; } } else if(g_move.state 1U) { // 勻速 if((g_move.target_steps - g_move.current_step) g_move.switch_step) { g_move.state 2U; } } else if(g_move.state 2U) { // 減速 g_move.freq_current - g_move.accel_hz_per_s * 0.001f; if(g_move.freq_current g_move.freq_start_hz) { g_move.freq_current g_move.freq_start_hz; g_move.state 3U; } } else { return; } // 更新ePWM頻率 EPwm1Regs.TBPRD (150000000U / (2U * (Uint32)g_move.freq_current)) - 1U; EPwm1Regs.CMPA.half.CMPA EPwm1Regs.TBPRD / 2U; }這段代碼的要點是accel 單位是 Hz/s乘以 0.001s 就是每毫秒增加的頻率。更新 TBPRD 后同步改 CMPA保持脈沖寬度恒定。減速狀態(tài)通過剩余步數(shù)和 switch_step 比較觸發(fā)而不是單純依賴頻率判定這樣在總步數(shù)小于兩倍加速步數(shù)時也能正確降下來。方向切換的時機在啟動之前先寫 GPIO1 的電平延時至少 5 微秒再使能 ePWM 輸出。不要在脈沖序列中間切換方向否則驅(qū)動器和電機都會承受額外沖擊。5. 避坑實錄DSP28335 控制步進電機的五個典型翻車場景5.1 現(xiàn)象電機低速抖動高速丟步現(xiàn)象是電機在低頻段一頓一頓地動轉(zhuǎn)速稍高就咔咔響甚至徹底不動。原因首先是啟動頻率設得太高或加速度太大。電機從靜止直接進入高頻脈沖轉(zhuǎn)子來不及響應。其次是驅(qū)動器的細分設置與 DSP 側(cè)預期不符比如驅(qū)動實際是 1/8 細分但代碼按 1/16 細分算轉(zhuǎn)速實際轉(zhuǎn)速翻倍。解決把 f_start 降到 200 到 300Hz加速度調(diào)低 30% 再試把驅(qū)動器的撥碼開關(guān)和代碼里的細分常量核對一遍。這個排查步驟看起來簡單但我見過好幾個案例都是撥碼開關(guān)撥錯代碼調(diào)了半天。5.2 現(xiàn)象一上電電機自己“抖”了一下現(xiàn)象是 DSP 復位瞬間電機微微動一下或者發(fā)出“嗡”的一聲。原因是初始化順序問題。GPIO 默認狀態(tài)在復位期間是輸入高阻如果外部上拉或驅(qū)動器內(nèi)部上拉把脈沖引腳拉到了有效電平驅(qū)動就會收到雜散脈沖。另外使能引腳如果默認懸空或高電平驅(qū)動器上電即使能。解決程序最開頭第一時間把所有電機控制相關(guān) GPIO 初始化為確定狀態(tài)尤其是使能引腳。我習慣把使能引腳先拉高禁用驅(qū)動器等初始化完成后再按需拉低。void Motor_IO_Init(void) { // 先禁用驅(qū)動器防止上電誤動作 GpioCtrlRegs.GPAMUX1.bit.GPIO0 0U; // GPIO0 配置為普通IO GpioDataRegs.GPADAT.bit.GPIO2 1U; // 使能引腳拉高禁用驅(qū)動器 }5.3 現(xiàn)象脈沖發(fā)完了位置差了一截現(xiàn)象是電機轉(zhuǎn)完指定的步數(shù)但機械位置偏了每次偏差方向一致。原因是機械傳動誤差比如同步帶打滑、絲桿間隙、聯(lián)軸器松動。開環(huán)控制下DSP 認為已經(jīng)發(fā)出了 1600 個脈沖但實際電機可能因為負載突增丟了幾步這些步數(shù)不會自己補回來。解決先檢查機械連接是否牢固再考慮加編碼器反饋做位置閉環(huán)。如果只是絲桿間隙可以在反轉(zhuǎn)方向前先補一個間隙補償值。這些屬于機構(gòu)層面的問題DSP 程序只能做到盡量補償不能根治。某開發(fā)者的垂直軸掉電后滑塊下滑就是靠加抱閘解決的程序上無解。5.4 現(xiàn)象驅(qū)動器正常DSP 引腳卻燒了現(xiàn)象是運行一段時間后 DSP 的脈沖引腳輸出電平異常甚至芯片發(fā)熱嚴重。原因是信號線過長或驅(qū)動器端的干擾電壓反灌。脈沖信號經(jīng)過長線傳輸線上的電感在電流突變時產(chǎn)生尖峰電壓直接加到 DSP GPIO 內(nèi)部保護二極管上超過承受能力就損壞。解決脈沖和方向信號線上串接 33 到 100 歐姆的電阻靠近 DSP 引腳放置或者直接用光耦隔離徹底切斷電氣連接。線長超過 20 厘米時不要裸線直接接雙絞 電阻是底線。5.5 現(xiàn)象示波器看 PWM 完全正常電機就是不動現(xiàn)象是用示波器量 DSP 引腳波形方方正正頻率也對但電機紋絲不動。原因是測量點和實際驅(qū)動點之間斷線最常見是杜邦線松了或者驅(qū)動器端子的螺絲沒擰緊。還有一個隱蔽原因示波器探頭的地線夾在驅(qū)動器電源地上示波器地回路把 DSP 的信號拉偏導致驅(qū)動器收不到有效高電平。解決先量驅(qū)動器輸入端子的電壓確認信號真的到了驅(qū)動器。判斷標準是方向電平 3.3V 對應到驅(qū)動器輸入端至少 2V 以上。我之前遇到過示波器通道本身壞了顯示波形正常但實際引腳沒輸出換通道才發(fā)現(xiàn)問題。從那以后排查此類問題我直接從驅(qū)動器端往回量而不是只看 DSP 引腳。6. 進階從梯形加減速到 S 曲線再用 eQEP 編碼器驗證位置6.1 S 曲線速度規(guī)劃讓加減速更平滑的查表法梯形加減速的加速度是階躍變化的高速時沖擊感明顯。S 曲線把加速度的變化也變成連續(xù)曲線機械沖擊更小。但在 DSP28335 上實時計算三角函數(shù)不劃算常見做法是離線生成速度表運行時查表更新頻率。#define S_CURVE_SEGMENTS 128U // 離線生成0到1之間平滑變化的系數(shù)表 // 實際使用中把這個表存成const數(shù)組避免運行時計算 float g_s_curve_table[S_CURVE_SEGMENTS]; void S_Curve_Table_Init(void) { Uint16 i; for(i 0U; i S_CURVE_SEGMENTS; i) { float u (float)i / (float)(S_CURVE_SEGMENTS - 1U); // 用余弦函數(shù)生成S形曲線 g_s_curve_table[i] 0.5f - 0.5f * cosf(3.14159265f * u); } }運行時把當前段索引對應的系數(shù)應用到頻率范圍上當前頻率 f_start (f_max - f_start) * table[idx]。這個辦法的代價是一張 128 個浮點數(shù)的表DSP28335 的 RAM 完全放得下。效果相比梯形加減速啟停瞬間的機械沖擊明顯減小適合帶精密負載的場景。S 曲線要注意起始加速度不為零的問題。上表用半周期余弦生成起點斜率為零起點加速度為零是標準的 S 形有些簡化實現(xiàn)用線性插值生成起點斜率不為零本質(zhì)還是梯形。兩者效果差異明顯別被名字騙了。6.2 用 eQEP 編碼器反饋驗證位置把開環(huán)變閉環(huán)做完開環(huán)控制后加編碼器驗證是讓系統(tǒng)可靠的最后一步。DSP28335 的 eQEP 模塊可以直接讀取增量編碼器信號驗證實際位置是否和預期一致。// 初始化eQEP1為編碼器接口 void EQep1_Init(void) { EQep1Regs.QUPRD 150000000U / 1000U; // 1ms位置采樣周期 EQep1Regs.QDECCTL.bit.QSRC 0U; // 正交計數(shù)模式 EQep1Regs.QEPCTL.bit.FREE_SOFT 0U; EQep1Regs.QEPCTL.bit.PCRM 0U; // 計數(shù)模式設為位置計數(shù) EQep1Regs.QEPCTL.bit.QPEN 1U; // 使能eQEP } // 讀取當前位置并和理論位置比較 int32_t EQep1_ReadPosition(void) { return (int32_t)EQep1Regs.QPOSCNT; }位置閉環(huán)的最簡做法目標位置和編碼器計數(shù)差值作為誤差誤差超過一個閾值比如 50 個脈沖時發(fā)脈沖修正。這個閾值要綜合考慮機械間隙和編碼器分辨率設太小會讓電機頻繁微動震動設太大則位置誤差大。編碼器分辨率遠高于步進細分時低速區(qū)可以看到步進電機的微觀步進痕跡這是開環(huán)控制的原生特性。如果項目要求絕對平滑可以考慮把驅(qū)動器的細分調(diào)高到 1/32 或 1/64或者換閉環(huán)步進驅(qū)動器。用 eQEP 驗證位置之后我對“脈沖發(fā)了就到位”這個說法就不再完全相信了實際位置總是和理論位置有那么一點偏差只是用不用得到的問題。從那以后我每次搭建新的步進電機系統(tǒng)都強制走一遍這個流程先用 eQEP 確認機械能轉(zhuǎn)到位再調(diào)加減速曲線最后才談精度。這套工程配置和代碼我整理成了源碼包從 ePWM 初始化到位置閉環(huán)都有完整例程下載后對照改參數(shù)就能用希望幫到你。本文還有配套的精品資源點擊獲取