字與 PWM 模擬輸出)
嵌入式硬件開發(fā)物聯(lián)網(wǎng)工業(yè)制造【免費(fèi)下載鏈接】Grbl_Esp32A port of Grbl CNC Firmware for ESP32項(xiàng)目地址https://gitcode.com/gh_mirrors/gr/Grbl_Esp32點(diǎn)擊查看免費(fèi)下載本文以 Grbl_Esp32 倉庫中的 User I/O 說明文檔 為主線系統(tǒng)講解如何通過 M62–M65數(shù)字輸出開關(guān)與 M67–M68PWM 模擬輸出在 G 代碼中控制冷卻風(fēng)扇、夾具、電磁閥等外設(shè)并結(jié)合 UserOutput.cpp、GCode.cpp 等源碼說明“同步/立即”語義、PWM 分辨率計算與引腳配置的底層實(shí)現(xiàn)幫助你在 ESP32 CNC 系統(tǒng)中直接用 G 代碼完成通用 I/O 控制。一、User I/O 是什么用 G 代碼替代專用代碼Grbl_Esp32 提供了一套通用 I/O 控制機(jī)制User I/O目標(biāo)是讓外設(shè)控制直接寫進(jìn) G 代碼而不是依賴特殊編碼或外部程序。典型應(yīng)用包括冷卻風(fēng)扇的啟停數(shù)字量 on/off工件夾持clamp開關(guān)電磁閥valve控制需要模擬量PWM調(diào)壓/調(diào)位的器件如 RC 舵機(jī)、可變比例閥等原文檔將其分為兩種類型Digital I/O數(shù)字 I/O只有開/關(guān)兩個狀態(tài)由 M62–M65 控制Analog (PWM)模擬 I/O輸出 PWM 占空比由 M67/M68 控制。二、命令速查M62–M65 數(shù)字輸出、M67–M68 模擬輸出2.1 數(shù)字輸出控制M62–M65命令含義M62Synchronized Digital Output On同步置位數(shù)字輸出為開M63Synchronized Digital Output Off同步置位數(shù)字輸出為關(guān)M64Immediate Digital Output On立即置位為開M65Immediate Digital Output Off立即置位為關(guān)使用P 字指定數(shù)字輸出編號0–3例如M62 P0 ; 同步打開數(shù)字輸出 0 M63 P0 ; 同步關(guān)閉數(shù)字輸出 0在源碼中P 字是數(shù)字類命令的必需詞GCode.cpp 在參數(shù)校驗(yàn)階段對 M62–M65 檢查 P 字是否存在缺失則報GcodeValueWordMissing錯誤執(zhí)行階段要求p MaxUserDigitalPin常量定義為 4見 GCode.h 中static const int MaxUserDigitalPin 4;否則報PParamMaxExceeded。因此P 取值范圍是 0、1、2、3寫成 P4 及以后會報錯。2.2 模擬輸出控制M67–M68命令含義M67Synchronized Set Analog Value同步設(shè)置模擬量值M68Immediate Set Analog Value立即設(shè)置模擬量值使用E 字指定模擬輸出編號0–3使用Q 字指定占空比百分?jǐn)?shù)percent duty浮點(diǎn)數(shù)。原文檔示例M67 E1 Q23.87 ; 將模擬輸出 1 設(shè)置為 23.87% 占空比 M67 E1 Q0 ; 將占空比設(shè)為 0%等效于關(guān)閉該引腳與數(shù)字命令類似源碼要求 E、Q 兩個字必須同時出現(xiàn)見 GCode.cpp 中對SetAnalogSync/SetAnalogImmediate的校驗(yàn)分支且執(zhí)行前 Q 值會被強(qiáng)制鉗制到 0–100 范圍constrain(gc_block.values.q, 0.0, 100.0)——這與原文檔“超過 100% 按 100% 處理負(fù)數(shù)按 0% 處理”的說明完全一致。E 值超出 0–3 同樣報PParamMaxExceeded。2.3 模態(tài)組歸屬從源碼結(jié)構(gòu)看M62–M68 被劃入獨(dú)立的模態(tài)組MM10 15GCode.h 中注釋[M62, M63, M64, M65, M67, M68] User Defined解析時映射到IoControl枚舉DigitalOnSync/DigitalOffSync/DigitalOnImmediate/DigitalOffImmediate/SetAnalogSync/SetAnalogImmediate。這意味著同一條 G 代碼塊中不能出現(xiàn)兩個 I/O 命令會觸發(fā)GcodeModalGroupViolation。三、引腳編號規(guī)則原文檔Pin Numbering一節(jié)規(guī)定每個引腳都被賦予一個從 0 開始的編號數(shù)字與模擬的編號相互獨(dú)立。如果各用一路它們都應(yīng)該是 0。對應(yīng)源碼System.cpp 中維護(hù)兩個獨(dú)立數(shù)組myDigitalOutputs[4]與myAnalogOutputs[4]sys_set_digital(io_num, ...)與sys_set_analog(io_num, ...)分別按各自編號尋址。因此M62 P0與M67 E0指向的是兩塊不同的物理引腳。四、Synchronized同步與 Immediate立即的語義這是原文檔中最重要的使用原則Synchronized表示緩沖區(qū)中所有步驟必須完成后才改變 I/O 狀態(tài)Immediate不等待。流式發(fā)送 G 代碼時應(yīng)使用同步命令。立即版本沒有任何時序保證。源碼中的實(shí)現(xiàn)印證了這一點(diǎn)在執(zhí)行 I/O 動作前同步版本會先調(diào)用protocol_buffer_synchronize()排空接收緩沖與運(yùn)動緩沖立即版本直接置位GCode.cpp 中 M62/M67 分支??梢酝茢嗳绻阍诟咚偌庸?、流式下發(fā) G 代碼的途中使用 M64/M68 立即命令引腳翻轉(zhuǎn)的時刻與你預(yù)想的坐標(biāo)位置之間沒有任何保證而 M62/M67 會等前面排隊的運(yùn)動塊走完再動作從而保證“在某個精確加工位置之后切換夾具”這類時序需求。五、特殊狀態(tài)下的引腳行為原文檔Special Behaviors一節(jié)列出Power On上電——所有引腳置為 off 狀態(tài)Reset復(fù)位——所有引腳置為 off 狀態(tài)Alarm Mode報警模式——引腳狀態(tài)不變Error錯誤——引腳狀態(tài)不變End of File文件結(jié)束——引腳狀態(tài)不變源碼層面可以逐項(xiàng)驗(yàn)證上電UserOutput.cpp 中DigitalOutput::init()執(zhí)行digitalWrite(_pin, LOW)AnalogOutput::init()執(zhí)行l(wèi)edcWrite(_pwm_channel, 0)即兩類輸出上電后均為關(guān)閉態(tài)。復(fù)位MotionControl.cpp 的mc_reset()中依次調(diào)用sys_digital_all_off()與sys_analog_all_off()System.cpp 中遍歷 4 路輸出全部置低/清零與原文檔一致。報警/錯誤/文件結(jié)束從源碼結(jié)構(gòu)看這些狀態(tài)切換路徑均不會調(diào)用上述置位函數(shù)引腳保持最后狀態(tài)與文檔描述吻合。另外每個已定義的輸出在初始化時會通過串口打印一條配置信息例如User Digital Output:0 on Pin:GPIO_NUM_25、User Analog Output:1 on Pin:GPIO_NUM_15 Freq:50Hz方便調(diào)試時確認(rèn)引腳映射是否正確。六、Setup在機(jī)器頭文件中定義引腳原文檔給出的配置模板如下在機(jī)器定義頭文件中添加#define USER_DIGITAL_PIN_0 GPIO_NUM_xx #define USER_DIGITAL_PIN_1 GPIO_NUM_xx #define USER_DIGITAL_PIN_2 GPIO_NUM_xx #define USER_DIGITAL_PIN_3 GPIO_NUM_xx #define USER_ANALOG_PIN_0 GPIO_NUM_xx #define USER_ANALOG_PIN_1 GPIO_NUM_xx #define USER_ANALOG_PIN_2 GPIO_NUM_xx #define USER_ANALOG_PIN_3 GPIO_NUM_xx #define USER_ANALOG_PIN_1_FREQ 50 // Hz實(shí)際倉庫中有多個現(xiàn)成示例tapster_pro_6P_trinamic.h定義 4 路數(shù)字輸出GPIO 26/4/16/27與 4 路模擬輸出GPIO 14/13/15/12全部*_FREQ 50注釋明確標(biāo)注for use with RC servos正好是原文檔“舵機(jī)應(yīng)用”一節(jié)的落地配置tapster_3.h數(shù)字輸出 GPIO 25/26/27模擬輸出 GPIO 2/15/16頻率 50Hz注釋為duty range 5% to 10%Root_Controller_Root_4_Lite_RS485.h展示數(shù)字輸出也可以接到 I2S 輸出引腳如I2SO(17)。幾點(diǎn)關(guān)鍵細(xì)節(jié)全部 8 路引腳都是可選的。Defaults.h 中若未定義USER_DIGITAL_PIN_x/USER_ANALOG_PIN_x會回退為UNDEFINED_PIN。從源碼結(jié)構(gòu)看未定義的引腳不會占用 GPIO對未定義的引腳執(zhí)行置位命令時set_level()會返回失敗并觸發(fā)錯誤路徑因此只應(yīng)使用自己定義過的引腳編號。系統(tǒng)初始化時機(jī)System.cpp 在系統(tǒng) setup 階段注釋// Setup M62,M63,M64,M65 pins/// Setup M67 Pins逐個構(gòu)造DigitalOutput與AnalogOutput對象此時即完成 GPIO 模式設(shè)置、LEDC 通道配置與上電默認(rèn)關(guān)閉。PWM 通道分配限制ESP32 的 LEDC 為 8 個通道共享 4 組定時器。System.cpp 中sys_get_next_PWM_chan_num()的注釋說明通道對0/1、2/3 等必須同頻率主軸始終占用通道 0因此用戶 PWM 從通道 2 開始分配若通道耗盡會打印Error: out of PWM channels。這意味著模擬輸出并非可以無限多路混用不同頻率同一定時器對內(nèi)的頻率需保持一致使用時應(yīng)注意這一點(diǎn)。七、Frequency 與 ResolutionPWM 分辨率是怎么算的原文檔說明頻率是可選的某個引腳不定義*_FREQ時默認(rèn)使用 5000HzDefaults.h 中USER_ANALOG_PIN_x_FREQ的#ifndef回退值均為 5000。分辨率取決于頻率PWM 基于 80MHz 定時器。以 10kHz 為例80,000,000 / 10,000 8000 計數(shù)按 2 的冪向下取整得到 12 bit即 4096 級分辨率原文檔給出的最高位寬為 13 bits。UserOutput.cpp 的構(gòu)造函數(shù)正是這套邏輯的實(shí)現(xiàn)讀取 APB 頻率getApbFrequency()從 0 bit 開始遞增_resolution_bits直到1 _resolution_bits超過APB 頻率 / PWM 頻率再減 1最終得到“不超過頻率預(yù)算的最大位寬”。以默認(rèn) 5000Hz 為例80MHz/5000Hz 160002^13 8192 滿足而 2^14 16384 超出故得到 13 bit 分辨率——與原文檔“最高 13 bits”的常見場景一致源碼中循環(huán)上限放寬到 16 bit更低頻率時可得到更高位寬。原文檔強(qiáng)調(diào)這一切都在幕后完成你只需要提供頻率和占空比。設(shè)置值最終通過denominator()即1 _resolution_bits把百分?jǐn)?shù)換算成 LEDC 計數(shù)值見 System.cpp 中sys_set_analog()的percent / 100.0 * analog-denominator()再經(jīng)ledcWrite()寫入硬件。八、Duty占空比與脈沖寬度的換算原文檔Duty一節(jié)的要點(diǎn)占空比是周期period的百分比周期 1/freqQ 是浮點(diǎn)數(shù)寫成XX.XX形式可獲得最高分辨率超過 100% 的值按 100% 處理負(fù)數(shù)按 0% 處理。原文檔給出的換算示例若頻率 100Hz周期即 10ms想得到 1ms 的脈沖占空比應(yīng)為 0.10ms/10ms 0.1%注意1ms/10ms 實(shí)際為 10%原文示例寫作 0.10%此處按原文檔原文保留。九、配合 RC 舵機(jī)使用RC Servos原文檔Use With RC Servos一節(jié)給出了完整的工程經(jīng)驗(yàn)RC 舵機(jī)依靠 PWM 脈沖長度定位。標(biāo)準(zhǔn)頻率是 50Hz部分?jǐn)?shù)字舵機(jī)可承受更高采樣率但對該應(yīng)用不會提升性能反而可能讓部分舵機(jī)過熱。標(biāo)準(zhǔn)脈沖范圍是 1ms 到 2ms部分舵機(jī)范圍更寬。50Hz 時周期為 20ms因此1ms 脈沖 5% 占空比行程一端2ms 脈沖 10% 占空比行程另一端中間值對應(yīng)中間位置若舵機(jī)行程更寬可嘗試略小于 5% 或略大于 10% 的值。占空比設(shè)為 0% 通常會讓舵機(jī)斷電自由轉(zhuǎn)動幾乎不耗電。把這套知識寫進(jìn) G 代碼例如 50Hz 下讓輸出 0 的舵機(jī)從行程一端掃到另一端M68 E0 Q5.0 ; 1ms 脈沖行程一端 M68 E0 Q7.5 ; 1.5ms 脈沖中位 M68 E0 Q10.0 ; 2ms 脈沖行程另一端 M68 E0 Q0.0 ; 斷電自由狀態(tài)倉庫中的 tapster_pro_6P_trinamic.h 即為該用法的真實(shí)配置4 路 50Hz 模擬輸出注釋指向 RC 舵機(jī)模塊。十、測試腳本tests/user_io.nc倉庫自帶一個可直接流式發(fā)送的 I/O 測試文件 tests/user_io.nc完整演示了兩類命令的用法值得參考(MSG, Starting User I/O tests) M62 P0 ; 依次打開數(shù)字輸出 0..3每個間隔 0.5s 便于觀察 G4 P0.5 M62 P1 G4 P0.5 M62 P2 G4 P0.5 M62 P3 G4 P2 M63 P0 ; 再依次關(guān)閉 M63 P1 M63 P2 M63 P3 G4P1 M67 E0 Q10 ; 兩路模擬輸出以 10% 步進(jìn)做對向漸變直到 90% M67 E1 Q100 G4 P0.25 M67 E0 Q20 M67 E1 Q90 ; ...中間省略按原文檔測試腳本逐步變化... M67 E0 Q0 ; 最后歸零關(guān)閉 M67 E1 Q0 G4 P0.25該腳本的特點(diǎn)是數(shù)字部分配合G4駐留便于肉眼確認(rèn)開關(guān)時序模擬部分用 E0/E1 兩路以互補(bǔ)的占空比序列10→90 與 100→10做漸變測試最后統(tǒng)一Q0關(guān)閉。如果你的機(jī)器頭文件已經(jīng)定義了輸出引腳可以直接用它冒煙測試整套 M62–M68 功能鏈。十一、使用要點(diǎn)小結(jié)事項(xiàng)說明依據(jù)數(shù)字輸出編號P 字0–3缺失或越界報錯原文檔 GCode.cpp模擬輸出編號E 字0–3E、Q 必須同時提供原文檔 GCode.cpp占空比范圍Q 為百分?jǐn)?shù)浮點(diǎn)自動鉗制到 0–100原文檔 源碼constrain流式加工中優(yōu)先使用 M62/M63/M67 同步命令原文檔 Synchronized 一節(jié)上電/復(fù)位全部輸出強(qiáng)制關(guān)閉原文檔 mc_reset()、init()報警/錯誤輸出狀態(tài)保持不變原文檔 Special Behaviors頻率默認(rèn)值未定義*_FREQ時為 5000HzDefaults.h舵機(jī)配置50Hz5%–10% 對應(yīng) 1–2ms 脈沖0% 斷電原文檔 RC Servos 一節(jié)掌握以上內(nèi)容后你就可以在 Grbl_Esp32 中僅憑 G 代碼與機(jī)器頭文件中的引腳宏定義完成從繼電器開關(guān)到舵機(jī)調(diào)位的完整通用 I/O 控制無需任何額外編程。贊分享嵌入式硬件開發(fā)物聯(lián)網(wǎng)工業(yè)制造【免費(fèi)下載鏈接】Grbl_Esp32A port of Grbl CNC Firmware for ESP32項(xiàng)目地址https://gitcode.com/gh_mirrors/gr/Grbl_Esp32點(diǎn)擊查看免費(fèi)下載相關(guān)推薦FluidNC 用戶 I/O 輸出控制全指南M62–M65/M67–M68 數(shù)字與 PWM 命令、配置與源碼實(shí)現(xiàn)FluidNC 用戶 I/O 輸出控制全指南M62–M65/M67–M68 數(shù)字與 PWM 命令、配置與源碼實(shí)現(xiàn) 本文是 FluidNC 運(yùn)動控制固件中用戶嵌入式固件硬件開發(fā)智能硬件ESP-IDF 標(biāo)準(zhǔn)輸入輸出Standard I/O與 Console 輸出配置完全指南ESP IDF 標(biāo)準(zhǔn)輸入輸出Standard I/O與 Console 輸出配置完全指南 導(dǎo)讀 本文基于 ESP IDF 官方文檔 docs/en/api物聯(lián)網(wǎng)嵌入式ESP-IDF 標(biāo)準(zhǔn) I/O 與控制臺輸出stdin/stdout/stderr 的 VFS 實(shí)現(xiàn)、配置與阻塞 I/O 控制ESP IDF 標(biāo)準(zhǔn) I/O 與控制臺輸出stdin/stdout/stderr 的 VFS 實(shí)現(xiàn)、配置與阻塞 I/O 控制 本文以 ESP IDF 的《標(biāo)準(zhǔn)物聯(lián)網(wǎng)嵌入式創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考