Contact me: hankecnc@gmail.com

GRBL 中的探测 (G38.x) #269

推推 grbl 3年前 (2023-01-21) 270次浏览

关闭
henols 打开了这个问题 2013 年 9 月 23 日 · 6条评论
关闭

GRBL 中的探测 (G38.x)#269

henols 打开了这个问题 2013 年 9 月 23 日 · 6条评论

注释

GRBL 中的探测 (G38.x) #269
贡献者

你好

我试图在 GRBL 边缘分支中实现探测,命令 G38.2 – G38.5。
但是我很难让它工作。

我已经创建了一个中断线,当我正在探测
我试图握住步进器并删除探测任务并开始下一个任务的东西时得到中断。

我还设置了运行时命令打印探测报告以获取日志中的坐标。

如果我在收到中断时尝试这样做,它几乎可以正常工作,但如果我理解 GRBL 中的设计正确,我将在运行时命令控制的协议中执行所有操作。

如果我将以下 G 代码发送到 GRBL

g0 y60
g38.2 y40
g0 y60
g38.2 y40
g0 y60
g38.2 y40

我正在尝试处理中断内的探测代码,我几乎可以正常工作。
探测 ISR

if ((PROBE_PIN & PROBE_MASK)^ PROBE_MASK) {
  block_t *current_block = plan_get_current_block();
  if (current_block != NULL && current_block->probing && (bit_isfalse(PROBE_PIN,bit(PIN_PROBE)))) {
    st_feed_hold();
    bit_true(sys.execute, EXEC_PROBE_REPORT);
    report_probe_position();
    plan_discard_current_block();
    st_reset();
    sys_sync_current_position();
    st_cycle_start();
  }
}

这段代码会给我这样的行为,如果第一个 g38.2 触发中断,第二个 g0 将移动 20mm 而不是 20mm 探测位置。
但是如果我发送

g0 y60
g38.2 y40

g0 y60
g38.2 y40

再次,它按预期工作,第二个 g0 移动 20mm 探测位置。

如果我将大部分代码移至协议(我认为更正确)

在探测 ISR 中:

if ((PROBE_PIN & PROBE_MASK)^ PROBE_MASK) {
  block_t *current_block = plan_get_current_block();
  if (current_block != NULL && current_block->probing && (bit_isfalse(PROBE_PIN,bit(PIN_PROBE)))) {
    st_feed_hold();
    bit_true(sys.execute, EXEC_PROBE_REPORT);
  }
}

在 prtocol 运行时命令中:

if (rt_exec & EXEC_PROBE_REPORT) {
  report_probe_position();
  plan_discard_current_block();
  st_reset();
  sys_sync_current_position();
  st_cycle_reinitialize();
  st_cycle_start(); 
  bit_false(sys.execute,EXEC_PROBE_REPORT);
}

如果探测中断被触发,这将挂起规划器并将状态设置为队列模式。

我完全没有想法,有人能指出我正确的方向吗?

亨里克

GRBL 中的探测 (G38.x) #269
成员

嗯,有趣的问题……我肯定需要在某个时候改进 grbl 的内部状态处理。一团糟。

深入了解你想做什么,我不知道 Grbl 是否可以按原样做你想做的事。我不认为这将是一个微不足道的修复。我认为导致问题的主要原因是 stepper.c 中的 st_cycle_reinitialize() 函数。它是在假设进给保持将从它停止的规划器块恢复的情况下构建的,但在您的情况下,您删除了该规划器块并尝试在下一个规划器块上恢复。将需要一个条件或另一个 st_cycle_reinitialize() 来重新计算这种情况下的规划器缓冲区。

除此之外,您可能需要在退出探测 ISR 之前复制当前位置。ISR 和运行时命令执行之间存在不确定的时间间隔。您将改为报告保存的位置。此外,您需要确保在重新计算规划器块并恢复运动之前等待步进模块完成进给保持。

希望有所帮助,祝你好运!

GRBL 中的探测 (G38.x) #269

@henols,前段时间我试图检查探测是否可以在 grbl 中工作,但是我放弃了,因为这似乎是一个相当大的“挑战”,你似乎表现得更好。你的自调匀整项目太棒了。

你把探测放在某个地方了吗?我会尝试再次弄脏我的手。

GRBL 中的探测 (G38.x) #269
贡献者作者

最后我做对了,探测现在正在我的边缘分支上工作(https://github.com/henols/grbl/tree/edge)。
谢谢@chamnit对于指针。

GRBL 中的探测 (G38.x) #269
贡献者

这是个好消息,您如何在实施中使用探测。是否有简短说明要做什么?

我想这一切都是真的:http ://linuxcnc.org/docs/html/gcode/gcode.html#sec:G38-probe

在哪里连接探头?你有/建立/推荐什么探测器?

关于探测过程,你还有什么重要的要说的吗?

GRBL 中的探测 (G38.x) #269
贡献者作者

你好@alpharesearch.
尚无描述,但如果您有兴趣,可以连接模拟引脚 4 并将其接地到您的探头,或者如果您没有探头,您可以连接模拟引脚A4A0 连接到您的主轴并将地面连接到您的床(如果它像我的一样由 mdf 将 ti 包裹在铝箔中制成)。

它的工作方式与 linuxcnc 中描述的一样,除了变量之外,它会将结果(机器位置)放入您的日志中。

前任。
#Probe,MPos:0.0000,0.0000,0.4250#
#Probe,MPos:85.1031,10.2188,1.5750#

我的下一步是采用自动调平器 ( http://www.autoleveller.co.uk/ ) 软件来读取日志文件,这样我就可以调平我的 cnc 文件。

我没有太多的探头经验,但我看到用 pezzoelemet 构建的非常简单

亨里克

GRBL 中的探测 (G38.x) #269
贡献者作者

经过几次重写,我终于完成了探测代码及其与坐标系的工作。可以在https://github.com/henols/grbl-probe找到源代码和一个小的解释,在https://raw.github.com/henols/grbl-release/master/bin/grbl
可以找到预编译的十六进制文件-v0_9probe.hex

下一步将完成 AutoLeveller,使其更易于使用……

如果有人测试过请告诉我。

亨里克

喜欢 (0)