注释
@doppelhub: 对不起 TLDR。但我想我明白你在问什么。是的,探测是轮询的。但它与也控制运动的步进 ISR 同步。只要在每个 ISR 都进行轮询,它就会在步进器的分辨率范围内记录探头位置。 您看到超程的原因是因为 Grbl 必须适当地使机器减速。它不能在检测到探针后立即停止它而不冒丢失步骤的风险。相反,它会记录探头位置并立即调用进给暂停来停止。报告的探头位置几乎总是与停止点不同。 此外,由于这个减速问题,无论如何您都不能真正快速移动探头。您受到减速距离和探头允许行程的限制。 我倾向于使用最少的必要中断。尽量不要有两个或更多,连同主程序,试图相互交互。如果你这样做了,跟踪状态、可变变量和调试竞争条件就会变得一团糟。 |
你好。问题不是由于 grbl 的加速。简而言之,我们的探测程序使用旋转工具,由于所述工具上的切割刀片,该工具会间歇性地接触金属表面。我们希望 grbl 在探针电压(引脚 A5)第一次降至 Vil(max) 以下(1.5 伏@ VCC=5V)时中断并停止探针程序。 我用图片来总结一下: 我知道不是每个人都会遇到这个问题,但是中断探测例程是一个更强大的实现,绝对值得中断。我将更改我们的 grbl fork 以使用中断。只是测试水域,看看你是否想为 master 分支这样做。 |
@doppelhub: 好的,这是一个噪音问题。最简单的解决方案是使用不同的探测方法(例如开关)来消除噪声。 但是,我想一个中断可以只设置一个状态变量,这样当它被步进器 ISR 轮询时,它会检查这个状态变量。我现在没有时间做这样的事情(忙于 v1.1 版本)。这是相当低的优先级和特定的。但是,我愿意查看关于您的提案的拉取请求。 |
我们不能更改为开关*,但即使使用开关,中断也会更好,因为它会在开关去抖动时立即运行(就像它应该的那样)。我现在正在研究一个干净的解决方案,它使用一个状态变量,它基本上取代了 probe_get_state 的内部逻辑。这至少可以保证我们将在步进 ISR 周期内(在我们的例子中大约 1 毫秒)捕获任何探测事件。 *在我们的应用程序中,我们在安装刀具时探测零件:我们使用 G38.3 代替快速 G0 移动,以确保如果我们碰到任何东西,我们会尽快停止;我们的主机有一个基于预期与实际探测结果的决策树。当然,如果我们在没有预料到的情况下撞到任何东西,这是一个错误,但至少机器会在没有用户交互的情况下停止。任何人,一旦我对它运行良好感到满意,我会发布拉取请求。 |
@doppelhub: 有趣的。期待你的想法。FWIW,开关将与弱低通滤波器一起使用。你会有一点滞后,但它会是一致的。 |
好的,让它与中断一起工作。我相信你可以更优雅地把它加入你的代码中,但我把它留给你。现在发布更改请求。 |
减速真的和加速一样重要吗?嘿。我知道。牛顿第一运动定律。但!我可以想象这台机器减速比加速快一点。因为如果你加速你必须克服机器摩擦,当你减速时OTOH,摩擦会帮助你!这在像我这样的 Z 轴丝杠设置中是非常正确的。惯性是不可能发生的。这就是为什么我认为你可以减速比加速更快。让 GRBL 减速得更快是有意义的。或者也许添加选项以在探测时完全禁用减速…… 如何完全禁用 Z 轴上的加速管理? 我已将 Z 加速度设置为 |
中断方法还有另一个好处:有时探针被激活仅一秒钟,然后在材料上滑动一点,然后再次停用,直到下一步。中断可以让你捕捉到反弹。(这个想法与去抖动完全相反)。 我把 LED 放到我的探头上,发现当我向下走 0.1 毫米步长时,它有时只是闪烁,因为探头在台阶前下降了一步,这使得它永久触发。 |
如果你在探测后不减速,你就有失去位置的风险,这将导致比解决更多的问题。 |
@chamnit我认为在丝杠设置中消除了惯性。 |
没有惯性力不会消失。它转化为丝杠上的扭矩。还有丝杠和电机转子的转动惯量也需要处理。这些都不可忽视。 |
这可能是在更高螺距的滚珠丝杠的情况下。滚珠丝杠能够将线性运动转化为扭矩。低螺距的丝杠摩擦力太大。 |
是的,摩擦确实在其中起作用,但是当您试图使加速度无限大时,惯性力会变得非常大。 |
我认为 Z 的线性运动不可能在我的 eshapeoko 机器中转化为旋转。由于丝杠螺距,Z轴也非常慢,但我很高兴我没有选择更便宜的螺纹杆选项:-) |
您不仅具有线性惯性,还具有旋转惯性。将电机和丝杠视为飞轮 |
直线运动将转化为您的丝杠和电机,尤其是当您快速停止时。相信我。我对动力学有很好的理解。这是我的职业。 |
分身 评论 on 29 Sep 2016
在现有代码中轮询探针架构。步进器 ISR 的工作方式,进给速度越慢,轮询探针位置的频率就越低(因为探针位置只是步进器 ISR 的一部分)。例如,使用 F40,一旦速度恒定,ISR 周期约为 1ms。我现在完全掩盖了加速梯形斜坡期间的响应率,但这更是一个问题(即,当我们加速时,周期总是更长)。简而言之,探针轮询率是进给率的函数,而且相当慢。
为什么这是一个问题?如果探针硬件实际上是一个接触金属表面的工具,那么探测到的信号实际上是相当嘈杂的。即使探针信号在探测工具接触工件时保证下降,它仍可能反弹回 VCC(特别是如果工具正在旋转并因此切割),因此当我们轮询时,之间存在不确定条件信号既低又同时轮询。如果 grbl 使用中断代替,则第一次将引脚拉至低于 VCC*0.3V(即 Vil(max))时,硬件将生成一个 ISR,该 ISR 将立即停止进一步的步进运动。结果是更准确的探测并且没有竞争条件。
我们的经验观察表明,探头可以从第一次接触的范围内移动 0.04 英寸。
实现细节:
探针引脚应通过 PCINT13 配置为中断(因为探针连接到 Arduino Uno 引脚 A5)。PCINT13 由中断向量 PCI1 处理。PCI1 可以配置为通过多个引脚进行中断,因此您需要确保设置 PCMSK1 掩码,以便只有 PCINT13 生成中断(即 0b00100000)。您在 cpu_map.h 中调用 PCMSK1“CONTROL_PCMSK”,然后在 system.c 中将其与“CONTROL_MASK”进行或运算。但是,我没有理由看到 OR “PCMSK1” 和 “CONTROL_MASK” 但也许我在那里遗漏了一些东西。
所以我们所做的是每次 G38.x 命令落入流中时,我们设置 PCMSK1(PCINT13),然后我们告诉步进器做他们的事情,然后我们等待探针跳闸。最后,在探测完成后,我们清除 PCMSK1(PCINT13),这样我们就不会收到错误的中断。
现在,在 PCI1 ISR 内部,我们应该停止步进运动(即“bit_true(sys_rt_exec_state, EXEC_MOTION_CANCEL);”)。我认为 grbl 可以在以后处理其他所有事情。
…
想法?我确定你不这样做是有原因的?