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