ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Marlin 激光与主轴(Cutter)内联功率控制架构深度解析:M3/M4/M5 三种模式、梯形功率补偿与动态功率计算

Marlin 激光与主轴(Cutter)内联功率控制架构深度解析:M3/M4/M5 三种模式、梯形功率补偿与动态功率计算 Marlin 激光与主轴Cutter内联功率控制架构深度解析M3/M4/M5 三种模式、梯形功率补偿与动态功率计算【免费下载链接】MarlinMarlin is a firmware for RepRap 3D printers optimized for both 8 and 32 bit microcontrollers. Marlin supports all common platforms. Many commercial 3D printers come with Marlin installed. Check with your vendor if you need source code for your specific machine.项目地址: https://gitcode.com/GitHub_Trending/ma/Marlin本篇技术指南以 Marlin 固件仓库中的 docs/Cutter.md 为核心系统讲解 Marlin 2.0.9.x 及以上版本引入的激光/主轴Cutter功率控制体系从 G 代码可选的三种工作模式标准、连续内联、动态内联到规划器Planner与步进器Stepper中的功率处理链路再到LASER_POWER_TRAP梯形功率补偿与calc_dynamic_power()动态功率计算的具体实现。读完本文你将掌握如何通过M3/M4/M5及I参数切换激光工作模式、理解block-laser.power等内联功率变量在规划器与步进器之间的流转并能够在 Marlin/Configuration_adv.h 中正确配置激光功率相关的全部选项。背景v2.0.9.x 之前的痛点与本次改进在 Marlin 2.0.9.x 之前激光的内联inline功能选项存在明显限制内联功能选项不启用并重新编译源码就无法生效运行期无法切换一旦启用内联选项基础标准功能反而失效两种模式互斥用户必须二选一。v2.0.9.x 引入的新功能彻底改变了这一状况标准模式与内联模式可以通过 G 代码在运行期随时选择并且两种模式彼此兼容无需重新编译。此外还新增了一个实验性的动态dynamic模式。而主轴spindle相关的运行特性目前仍需要通过宏定义并重新编译来启用。总体架构四个全局模式标志与功率处理链路激光可选功能通过 G 代码、激光/主轴spindle_laser、规划器planner和步进器stepper四套例程中的4 个全局模式标志来定义。默认模式保持标准激光功能G 代码被接收、处理并解析通过M3、M4、M5命令决定设置何种模式。当检测到内联模式参数集时激光功率处理将交由规划器与步进器例程驱动初始功率值与设置的处理则由 G 代码解析和激光/主轴例程完成。模式枚举CutterMode在 Marlin/src/feature/spindle_laser.h 中定义了完整的模式枚举enum CutterMode : int8_t { CUTTER_MODE_ERROR -1, CUTTER_MODE_STANDARD, // M3 power is applied directly and waits for planner moves to sync. CUTTER_MODE_CONTINUOUS, // M3 or G1/2/3 move power is controlled within planner blocks, set with M3 I, cleared with M5 I. CUTTER_MODE_DYNAMIC // M4 laser power is proportional to the feed rate, set with M4 I, cleared with M5 I. };全局实例SpindleLaser cutter及模式变量cutter.cutter_mode定义于 Marlin/src/feature/spindle_laser.cpp默认值为CUTTER_MODE_STANDARD。内联功率数据流内联功率从block-inline_power变量流入规划器的laser.power连续功率模式。若启用了激光功率陷阱laser power trap特性则在加速阶段按步逐步递增功率、减速阶段逐步递减功率否则laser.power在步进器中按整个运动块的设定值直接使用。另外两组功率设置由laser power sync激光功率同步和laser fan power sync激光风扇功率同步特性喂入规划器二者均通过规划器的同步块位标志sync block bit flags完成LASER_POWER_SYNC当位标志匹配时全局块laser.power值从激光/主轴标准M3 S-Value功率设置更新风扇同步功率值从风扇 G 代码S-Value设置更新到规划器block-fan_speed[i]变量。动态内联功率模式F-Value进给率设置通过cutter.calc_dynamic_power()处理并喂入规划器的laser.power值。无论激光功率值来自哪个来源最终的激光输出引脚始终由激光/主轴代码更新具体通过apply_power(value)调用设置激光或主轴输出。这一调用允许在传感器故障发生时进行安全的功率控制。注意主轴Spindle操作目前尚不能通过 G 代码选择模式。三种工作模式的 G 代码操作标准模式CUTTER_MODE_STANDARD默认M3/M4直接设置功率并等待规划器运动同步。根据 Marlin/src/gcode/control/M3-M5.cppM3——激光开启/功率设置斜坡功率主轴顺时针旋转M4——激光开启/功率设置主轴逆时针旋转Spower——按当前功率单位设置功率S0关闭激光/主轴Opower——以 0-255 PWM 单位设置功率若未定义 PWM 引脚M3/M4仅执行开关操作。在标准模式下M3/M4 处理前会调用planner.synchronize()等待之前的移动命令G0/G1/G2/G3完成再改变功率。连续内联模式CUTTER_MODE_CONTINUOUSM3 I启用连续内联功率模式由规划器处理功率存储在运动块中在步进器 ISR 处理块时应用。其行为特性如下M3 I启用连续内联功率由规划器处理内联模式下M3 S-Value将为后续移动设置功率例如G1 X10 Y10将以上一个 S-Value 的功率开启激光M5 I清除内联模式并将功率设为 0M5将功率输出设为 0 但保留内联模式使用规划器同步的M3内联 S-ValueLASER_POWER_SYNC之前必须先设置M3 I。动态内联模式CUTTER_MODE_DYNAMICM4 I设置动态模式该模式根据当前进给率计算激光功率 OCR 值。实验性功能后续版本可能会完善加减速补偿等功率控制。M5关闭M5的语义在 Marlin/src/gcode/control/M3-M5.cpp 中实现M5——将功率输出设为 0保留内联模式不变M5 I——清除内联模式并将功率设为 0随后自动切回标准模式。实现中M5会先执行planner.synchronize()然后cutter.power 0; cutter.apply_power(0)若当前处于内联模式且带I参数则cutter.set_enabled(false)清除内联功率并将cutter.cutter_mode切回CUTTER_MODE_STANDARD。流程控制逻辑图以下流程图展示了代码库中主轴与激光操作的流程控制逻辑源自 docs/Cutter.md 原图。主轴模式逻辑┌──────────┐ ┌───────────┐ ┌───────────┐ │M3 S-Value│ │Dir !same ?│ │Stepper │ │Spindle │ │stop wait│ │processes │ ┌──┤Clockwise ├──┤ start ├──┤moves │ ┌──────┐ │ │ │ │spindle │ │ │ │G-Code│ │ └──────────┘ └───────────┘ └───────────┘ │Send ├──┤ ┌──────────┐ ┌───────────┐ ┌───────────┐ └──────┘ │ │M4 S-Value│ │Dir !same ?│ │Stepper │ ├──┤Spindle ├──┤stop wait├──┤processes │ │ │Counter │ │ start │ │moves │ │ │Clockwise │ │spindle │ │ │ │ └──────────┘ └───────────┘ └───────────┘ │ ┌──────────┐ ┌────────┐ │ │M5 │ │Wait for│ └──┤Spindle ├──┤move │ └──────────┘ │disable │ ┌──────────┐ ┌──────────┐ Sensors─────┤Fault ├──┤Disable │ └──────────┘ │power │ └──────────┘主轴方向改变SPINDLE_CHANGE_DIR时若使能SPINDLE_STOP_ON_DIR_CHANGE会先停止并等待再以新方向启动对应 Marlin/src/feature/spindle_laser.cpp 的set_reverse()。激光模式逻辑┌──────────┐ ┌─────────────┐ ┌───────────┐ │M3,M4,M5 I│ │Set power │ │Stepper │ ┌──┤Standard ├──┤Immediately ├──┤processes │ │ │Default │ │wait for move│ │moves │ │ │ │ │completion │ │ │ │ └──────────┘ └─────────────┘ └───────────┘ │ ┌──────────┐ ┌───────────┐ ┌───────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌───────────┐ ┌──────┐ │ │M3 I │ │G0,G1,G2,G4│ │Planner │ │Planner │ │Planner fan │ │Planner │ │Stepper │ │G-Code│ │ │Continuous│ │M3 receive │ │sets block │ │sync power │ │sync power │ │trap power │ │uses block │ │Send │ ├──┤Inline ├──┤power from ├──┤power using│ │? process │ │? process │ │? adjust │ │values to │ └──────┘ │ │ │ │S-Value │ │Gx S-Value │ │M3 power │ │fan power │ │for accel/ │ │apply power│ │ └──────────┘ └───────────┘ └───────────┘ └────────────┘ └────────────┘ └────────────┘ └───────────┘ │ ┌──────────┐ ┌───────────┐ ┌────────────────┐ ┌───────────┐ │ │M4 I │ │Gx F-Value │ │Planner │ │Stepper │ │ │Dynamic │ │set power │ │Calc set block│ │uses block │ └──┤Inline ├──┤or use ├──┤block power ├──┤values to │ │ │ │default │ │using F-Value │ │apply power│ └──────────┘ └───────────┘ └────────────────┘ └───────────┘ ┌──────────┐ ┌──────────┐ Sensors─────┤Fault ├──┤Disable │ └──────────┘ │Power │ └──────────┘连续内联模式下的陷阱功率计算LASER_POWER_TRAP当同时定义了LASER_FEATURE与LASER_POWER_TRAP时规划器会对传入的激光功率 S-Value 进行计算功率被分解并分配到梯形加速与减速运动中。计算原则当laser.power 0时若定义了SPEED_POWER_MIN则设置最小功率并作为laser_power_floor喂入规划器块。在 Marlin/src/module/planner.cpp 中#if ENABLED(LASER_FEATURE) laser_state_t Planner::laser_inline; // Current state for blocks const uint8_t laser_power_floor cutter.pct_to_ocr(SPEED_POWER_MIN); #endif加速阶段基于入口步进速率与巡航步进速率之比计算降低的入口激光功率因子block entry laser power laser power * ( entry step rate / cruise step rate )初始功率将被设置为不小于laser_power_floor或初始功率计算结果。减速阶段基于最终步进速率与巡航步进速率之比计算降低的最终功率因子block exit laser power laser power * ( exit step rate / cruise step rate )一旦确定入口与出口功率值就将这些值划分为步进增量在步进器中应用trap step power incr_decr ( cruize power - entry_exit ) / accel_decel_steps陷阱步进在每次加速或减速步进期间递增或递减直到块执行完毕步进功率在梯形斜坡推进过程中累加或累减。规划器代码以下是 Marlin/src/module/planner.cpp 中的实际实现if (block-laser.power 0) { NOLESS(block-laser.power, laser_power_floor); block-laser.trap_ramp_active_pwr (block-laser.power - laser_power_floor) * (initial_rate / float(block-nominal_rate)) laser_power_floor; block-laser.trap_ramp_entry_incr (block-laser.power - block-laser.trap_ramp_active_pwr) / accelerate_steps; float laser_pwr block-laser.power * (final_rate / float(block-nominal_rate)); NOLESS(laser_pwr, laser_power_floor); block-laser.trap_ramp_exit_decr (block-laser.power - laser_pwr) / decelerate_steps;相关块字段定义于 Marlin/src/module/planner.h#if ENABLED(LASER_POWER_TRAP) float trap_ramp_active_pwr; // Laser power level during active trapezoid smoothing float trap_ramp_entry_incr; // Acceleration per step laser power increment (trap entry) float trap_ramp_exit_decr; // Deceleration per step laser power decrement (trap exit) #endif规划器注释Marlin/src/module/planner.cpp还补充了重要边界说明LASER_POWER_TRAP适用于所有 Jerk 与 Curve 模式但基于圆弧的运动G2/G3可能存在问题因为线段通常太小。若功率为 0则内联模式变量被置零以防止步进器处理从而允许 G0 或 G28 等无功率移动。步进器代码以下是在加速/减速 ISR 中应用陷阱功率的实际实现Marlin/src/module/stepper.cpp 与 Marlin/src/module/stepper.cpp加速阶段if (current_block-laser.trap_ramp_entry_incr 0) { cutter.apply_power(current_block-laser.trap_ramp_active_pwr); current_block-laser.trap_ramp_active_pwr current_block-laser.trap_ramp_entry_incr;减速阶段if (current_block-laser.trap_ramp_exit_decr 0) { current_block-laser.trap_ramp_active_pwr - current_block-laser.trap_ramp_exit_decr; cutter.apply_power(current_block-laser.trap_ramp_active_pwr);实际代码中增量乘以steps_per_isr每次 ISR 的步数。巡航阶段则将活动功率直接设置为块功率Marlin/src/module/stepper.cppif (current_block-laser.trap_ramp_entry_incr 0) { current_block-laser.trap_ramp_active_pwr current_block-laser.power; cutter.apply_power(current_block-laser.power); }这一加速逐级加、减速逐级减、巡航恒功率的过程使激光功率随运动速度同步变化逼近速度梯形曲线——由于功率分辨率有限这只是近似实现。动态内联功率计算calc_dynamic_power动态模式根据 F-Value 进给率计算激光功率。该方法使用位移位将功率级别设置为 0-255简单且快速并可使用缩放器将激光功率输出平移到指定功率级别。实现位于 Marlin/src/feature/spindle_laser.h// Dynamic mode rate calculation static uint8_t calc_dynamic_power() { if (feedrate_mm_m 65535) return 255; // Too fast, go always on uint16_t rate uint16_t(feedrate_mm_m); // 16 bits from the G-code parser float input rate 8; // Take the G-code input e.g. F40000 and shift off the lower bits to get an OCR value from 1-255 return uint8_t(rate); }对应原理源自 Marlin/Configuration_adv.h 的注释动态模式下任何移动都将使用当前进给率计算激光功率进给率由移动命令的F参数设置如G1 X0 Y10 F6000激光功率通过位移除去 8 个最低有效位计算二进制上即除以 256计算得到 0-255 的 OCR 值超过F65535的值将被设为 255更精细的功率控制如加减速补偿将在未来版本中处理。动态功率在规划器与步进器中的流转规划器中Marlin/src/module/planner.cppcase CUTTER_MODE_CONTINUOUS: block-laser.power laser_inline.power; block-laser.status laser_inline.status; break; case CUTTER_MODE_DYNAMIC: if (cutter.laser_feedrate_changed()) // Only process changes in rate block-laser.power laser_inline.power cutter.calc_dynamic_power(); break;动态模式仅在进给率变化时重新计算功率避免不必要的重复计算。步进器中Marlin/src/module/stepper.cppif (cutter.cutter_mode CUTTER_MODE_DYNAMIC planner.laser_inline.status.isPowered // isPowered flag set on any parsed G1, G2, G3, or G5 move; cleared on any others. current_block // Block may not be available if steps completed cutter.last_block_power ! current_block-laser.power // Prevent constant update without change ) { cutter.apply_power(current_block-laser.power); cutter.last_block_power current_block-laser.power; }当没有移动块时!current_block动态模式会自动cutter.apply_power(0)关闭激光Marlin/src/module/stepper.cpp。此外 Marlin/src/gcode/gcode.cpp 会在解析到F参数时更新cutter.feedrate_mm_m供M4 I内联移动使用G0移动会清除isPowered标志并置零内联功率Marlin/src/gcode/gcode.cpp。内联状态标志power_status_t定义于 Marlin/src/module/planner.h三个标志控制内联功率行为bool isEnabled:1; // Set to engage the inline laser power output. bool isPowered:1; // Set on any parsed G1, G2, G3, or G5 powered move, cleared on G0 and G28. bool isSyncPower:1; // Set on a M3 sync based set laser power, used to determine active trap powerisPowered在解析任何 G1/G2/G3/G5 功率移动时置位在 G0/G28 等其他命令时清除isEnabled启用内联激光功率输出由M3 I/M4 I设置M5 I清除isSyncPower在M3同步设置激光功率时置位用于确定活动陷阱功率。apply_power最终功率输出的安全守门员无论功率来源如何标准 S-Value、连续内联、动态计算、同步块最终都通过apply_power()写入输出。其完整实现位于 Marlin/src/feature/spindle_laser.cppvoid SpindleLaser::apply_power(const uint8_t opwr) { if (enabled() || opwr 0) { // 0 check allows us to disable where no ENA pin exists if (opwr last_power_applied) return; // Test the last power used to improve performance #if ENABLED(SPINDLE_LASER_USE_PWM) if (CUTTER_UNIT_IS(RPM) unitPower 0) ocr_off(); else if (ENABLED(CUTTER_POWER_RELATIVE) || enabled() || opwr 0) { set_ocr(opwr); isReadyForUI true; } else ocr_off(); #elif ENABLED(SPINDLE_SERVO) servo[SPINDLE_SERVO_NR].move(opwr); #else WRITE(SPINDLE_LASER_ENA_PIN, enabled() ? SPINDLE_LASER_ACTIVE_STATE : !SPINDLE_LASER_ACTIVE_STATE); isReadyForUI true; #endif last_power_applied opwr; } else { #if PIN_EXISTS(SPINDLE_LASER_ENA) WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_STATE); #endif isReadyForUI false; // Only used for UI display updates. TERN_(SPINDLE_LASER_USE_PWM, ocr_off()); } }要点支持 PWMSPINDLE_LASER_USE_PWM、伺服SPINDLE_SERVO与纯开关三种输出方式通过last_power_applied缓存避免重复写入相同功率提升性能传感器故障等异常场景下可安全禁用功率——这正是流程图底部Fault → Disable Power分支的实现所在cutter.set_enabled()针对不同模式有不同的行为Marlin/src/feature/spindle_laser.h标准模式应用SPEED_POWER_STARTUP未指定值时或当前功率连续/动态模式仅设置内联启用标志功率保持上次设定CUTTER_MODE_ERROR直接禁用并使功率归零实现全局功率关闭。配置指南Configuration_adv.h激光/主轴功能在 Marlin/Configuration_adv.h 中配置。以下为关键选项及其含义基础开关与引脚//#define SPINDLE_FEATURE // 启用主轴电主轴功能 //#define LASER_FEATURE // 启用激光功能 #if ANY(SPINDLE_FEATURE, LASER_FEATURE) #define SPINDLE_LASER_ACTIVE_STATE LOW // 使能引脚有效电平 #define SPINDLE_LASER_USE_PWM // 使用 PWM 控制速度/功率 #if ENABLED(SPINDLE_LASER_USE_PWM) #define SPINDLE_LASER_PWM_INVERT false // PWM 极性反转 #define SPINDLE_LASER_FREQUENCY 2500 // (Hz) PWM 频率AVR/ESP32/LPC 等平台支持 #endif功率单位CUTTER_POWER_UNITM3 S设置与显示的功率单位可选四种Marlin/Configuration_adv.h单位S 值范围适用场景PWM255S0 - S255激光 PWMPERCENTS0 - S100百分比RPMS0 - S50000主轴转速SERVOS0 - S180伺服角度控制功率范围与启动功率激光模式默认值定义于 Marlin/src/feature/spindle_laser_types.hSPEED_POWER_MIN 0、SPEED_POWER_MAX 255、SPEED_POWER_STARTUP 255主轴模式SPEED_POWER_MIN 5000RPM、SPEED_POWER_MAX 30000RPM、SPEED_POWER_STARTUP 25000RPMCUTTER_POWER_RELATIVE使功率相对[SPEED_POWER_MIN...SPEED_POWER_MAX]范围比例输出如 SuperPID 路由器控制器S0 5000 RPM、S255 30000 RPM。SPEED_POWER_MIN同时作为LASER_POWER_TRAP的功率下限laser_power_floorMarlin/src/module/planner.cpp防止梯形功率补偿期间出现零功率输出状态。激光特有选项#define LASER_SAFETY_TIMEOUT_MS 1000 // (ms) 激光安全超时无移动一段时间后关闭激光 //#define LASER_POWER_SYNC // 使能 M3 内联功率规划器同步 //#define LASER_POWER_TRAP // 激光功率随运动速率成比例缩放梯形补偿 #define LASER_TEST_PULSE_MIN 1 // (ms) 测试脉冲最小时间 #define LASER_TEST_PULSE_MAX 999 // (ms) 测试脉冲最大时间 //#define I2C_AMMETER // 激光 I2C 电流表INA226 //#define LASER_COOLANT_FLOW_METER // 激光冷却液流量计LASER_SAFETY_TIMEOUT_MS的取值需权衡过低可能在慢速移动中误关激光过高则材料可能被点燃。设置时应考虑材料可燃性、切割速率与 G 代码顺序。内联模式说明官方注释原文要点Marlin/Configuration_adv.h 中的注释完整说明了内联模式语义任何带I参数的M3或G1/2/3/5命令均启用连续内联功率模式例如M3 I启用由规划器处理的连续内联功率功率存储在移动块中在步进器 ISR 处理块时应用M4 I设置动态模式使用当前进给率计算激光功率 OCR 值M5 I清除内联模式并将功率设为 0M5将功率输出设为 0 但保留内联模式。辅助功能AIR_EVACUATIONM10-M11控制排烟/鼓风机与AIR_ASSISTM8-M9控制辅助吹气的启用/禁用/切换实现在 Marlin/src/feature/spindle_laser.cppSPINDLE_SERVO用伺服角度控制功率激光控制菜单中的测试点火功能test_fire_pulse()Marlin/src/feature/spindle_laser.h默认以 80% 功率点火testPulse毫秒。同步块机制LASER_POWER_SYNC 与风扇同步LASER_POWER_SYNC允许在CUTTER_MODE_CONTINUOUS下将任何M3 S-Value注入块缓冲区无需等待规划器同步即可提交 M3 激光功率。其同步块位标志BLOCK_BIT_LASER_PWR定义于 Marlin/src/module/planner.h。Marlin/src/module/planner.cpp 的buffer_sync_block()是同步机制的入口#if ENABLED(LASER_SYNCHRONOUS_M106_M107) FANS_LOOP(i) block-fan_speed[i] thermalManager.fan_speed[i]; #endif TERN_(LASER_POWER_SYNC, block-laser.power cutter.power);步进器在遇到同步块时Marlin/src/module/stepper.cpp处理#if ENABLED(LASER_POWER_SYNC) if (cutter.cutter_mode CUTTER_MODE_CONTINUOUS) { if (current_block-is_sync_pwr()) { planner.laser_inline.status.isSyncPower true; cutter.apply_power(current_block-laser.power); } } #endifisSyncPower标志随后在 Marlin/src/module/stepper.cpp 的块初始化中被检查若上一个块是 M3 同步功率则跳过陷阱功率初始化避免将同步功率清零否则根据current_block-laser.status.isEnabled应用陷阱功率或内联功率。风扇同步方面LASER_SYNCHRONOUS_M106_M107为接在风扇接口的 PWM/TTL 激光器提供更精确的功率时序相比普通 M106/M107 的不久后应用更精准代价是牺牲部分冷却风扇速度选项Marlin/Configuration_adv.h。安全机制与限制传感器故障安全两幅流程图的底部都展示了传感器故障路径Sensors → Fault → Disable Power。这对应apply_power()在故障场景下的安全禁用能力以及CUTTER_MODE_ERROR模式提供的全局功率关闭机制。当前限制与注意事项主轴模式不可用 G 代码选择——主轴运行特性仍需宏定义与重新编译文档明确说明动态模式为实验性——Marlin/src/module/stepper.cpp 注释指出动态模式存在待办项为各种激光建立 Min/Max OCR 偏移以支持调优与缩放、将加减速速率集成到动态功率计算中LASER_POWER_TRAP 与圆弧移动的兼容性——规划器注释指出基于圆弧G2/G3的移动通常因线段过小而存在问题Marlin/src/module/planner.cpp内联模式下 G0 等非功率移动——G0 会清除isPowered标志并调用cutter.inline_power(0)Marlin/src/gcode/gcode.cpp但保留内联控制标志本身激光安全超时——LASER_SAFETY_TIMEOUT_MS在无移动时自动关闭激光是防止材料点燃的重要防线。实战速览一个完整的激光内联切割会话综合以上机制一个典型的连续内联激光切割流程如下M3 I S50 ; 启用连续内联模式设置功率 50%后续移动以此功率执行 G1 X50 Y0 F6000 ; 以 50% 功率执行切割移动功率写入规划器块 M3 S80 ; 内联模式下改变功率配合 LASER_POWER_SYNC 可无需等待同步 G1 X100 Y0 F6000; 以 80% 功率继续切割 M5 I ; 清除内联模式并关闭激光切回标准模式动态模式进给率驱动功率示例M4 I ; 启用动态内联模式 G1 X50 Y0 F20000; 进给率 F20000 → 功率 20000 8 ≈ 78 (OCR) G1 X100 Y0 F40000; 进给率 F40000 → 功率 40000 8 ≈ 156 (OCR) M5 I ; 关闭动态模式如需深入了解实现细节可继续阅读以下仓库文件功能核心Marlin/src/feature/spindle_laser.h 与 Marlin/src/feature/spindle_laser.cpp类型与默认值Marlin/src/feature/spindle_laser_types.hG 代码命令Marlin/src/gcode/control/M3-M5.cpp规划器实现Marlin/src/module/planner.cpp 与 Marlin/src/module/planner.h步进器实现Marlin/src/module/stepper.cpp配置入口Marlin/Configuration_adv.h【免费下载链接】MarlinMarlin is a firmware for RepRap 3D printers optimized for both 8 and 32 bit microcontrollers. Marlin supports all common platforms. Many commercial 3D printers come with Marlin installed. Check with your vendor if you need source code for your specific machine.项目地址: https://gitcode.com/GitHub_Trending/ma/Marlin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表