开源改变世界

问题:G00 上的 M05,G01 上的 M03,M05 结束后 – 激光 #718

推推 grbl 3年前 (2023-01-22) 98次浏览

关闭
ikalafat 打开了这个问题 2015 年 5 月 30 日 · 6条评论
关闭

问题:G00 上的 M05,G01 上的 M03,M05 结束后 – 激光#718

ikalafat 打开了这个问题 2015 年 5 月 30 日 · 6条评论

注释

问题:G00 上的 M05,G01 上的 M03,M05 结束后 - 激光 #718

你好,

我有一个相当具体的问题。我在大学做硕士论文,我正在构建 2D(无 Z 轴)激光驱动的 PCB 光刻胶“雕刻机”。当解析器遇到 G00 … 命令时,我想实现激光关闭(M05 带 pwm 控制),并在 G01、G02、G03 上启用激光(M03)。

这就是我所做的

gcode.c(第 956 行及之后……)

      switch (gc_state.modal.motion) {
        case MOTION_MODE_SEEK:
          **spindle_set_state(SPINDLE_DISABLE, gc_state.spindle_speed); **
        case MOTION_MODE_LINEAR:
          **spindle_set_state(SPINDLE_ENABLE_CW, gc_state.spindle_speed); **
        case MOTION_MODE_CW_ARC: 
         **spindle_set_state(SPINDLE_ENABLE_CW, gc_state.spindle_speed); **
        case MOTION_MODE_CCW_ARC:
        **spindle_set_state(SPINDLE_ENABLE_CW, gc_state.spindle_speed); **

(我在这里删除了不必要的代码部分以简化解释)

我注意到这种方法存在问题

当我发送 G0 X10 激光时关闭,这是好的,但是当我发送 G1 X100 并且机器仍在运动时我发送 G0 X0,激光在 G1 X100 执行之前关闭直到结束

谁能告诉我,有没有更好/更简单的方法来实现激光控制,而无需大量编辑 gcode 文件并在 G0、G1 等之前/之后添加 M03/M05 命令?

谢谢!

编辑:

到目前为止,这是我找到的最好的解决方案
http://qcgeek.com/laseroko/

完全满足我需要的 G 代码转换器

问题:G00 上的 M05,G01 上的 M03,M05 结束后 - 激光 #718 ikalafat 更改了标题 问题:M05在G00上,M03在G01上,M05结束后 问题:G00 上的 M05,G01 上的 M03,M05 结束后 – 激光 2015 年 5 月 30 日
问题:G00 上的 M05,G01 上的 M03,M05 结束后 - 激光 #718

为什么不用Z来控制激光呢?

问题:G00 上的 M05,G01 上的 M03,M05 结束后 - 激光 #718

多种软件解决方案将使用 M3、M5 和 S 代码为您生成正确的 gcode。这是您最好的选择。

您的解决方案不起作用的原因是您在命令解析器中执行激光功率的变化,而不是将其放入缓冲区以在机器到达该点时执行。一旦它读取命令,更改就会在以这种方式实现时输出到硬件。你会想做类似“gc_block.modal.spindle = SPINDLE_ENABLE_CW;”的事情 和“gc_block.modal.spindle = SPINDLE_DISABLE;” 将主轴更改放入缓冲区。你需要一个“values_words |= bit(MODAL_GROUP_M7);” 也在那里,所以缓冲区知道使用了 M 命令。

问题:G00 上的 M05,G01 上的 M03,M05 结束后 - 激光 #718
作者

@langwadt
机器物理上没有 Z 轴,因为它仅用于自制 PCB 激光光刻胶标记(大多数情况下 pcb 具有相同的高度)

@abearden
我明天会试一试。感谢指导和解释。

问题:G00 上的 M05,G01 上的 M03,M05 结束后 - 激光 #718
作者

@abearden

这就是我所做的 – 到目前为止看起来没问题,但我会进行更多测试。(第 190-193 行)

              case 0: gc_block.modal.motion = MOTION_MODE_SEEK; gc_block.modal.spindle = SPINDLE_DISABLE; word_bit |= bit(MODAL_GROUP_M7); break; // G0
              case 1: gc_block.modal.motion = MOTION_MODE_LINEAR; gc_block.modal.spindle = SPINDLE_ENABLE_CW; word_bit |= bit(MODAL_GROUP_M7); break; // G1
              case 2: gc_block.modal.motion = MOTION_MODE_CW_ARC;  gc_block.modal.spindle = SPINDLE_ENABLE_CW; word_bit |= bit(MODAL_GROUP_M7);  break; // G2
              case 3: gc_block.modal.motion = MOTION_MODE_CCW_ARC; gc_block.modal.spindle = SPINDLE_ENABLE_CW; word_bit |= bit(MODAL_GROUP_M7);  break; // G3

再次感谢!

问题:G00 上的 M05,G01 上的 M03,M05 结束后 - 激光 #718

@ikalafat什么意思是使用“虚拟”Z 轴,查看 Z 位置变量并使用它在零以下/以上打开/关闭激光

问题:G00 上的 M05,G01 上的 M03,M05 结束后 - 激光 #718
作者

@langwadt
对不起,我误会你了。我必须承认,在寻找解决方案时,我并没有想到您的想法。

作为修改建议@abearden工作正常,我会关闭这个“问题”。

谢谢!

喜欢 (0)