Contact me: hankecnc@gmail.com

将探测架构从轮询更改为中断 #1095

推推 grbl 3年前 (2023-01-23) 211次浏览

打开
doppelhub 打开了这个问题 2016 年 9 月 29 日 · 16条评论
打开

将探测架构从轮询更改为中断#1095

doppelhub 打开了这个问题 2016 年 9 月 29 日 · 16条评论

注释

将探测架构从轮询更改为中断 #1095

探测架构在现有代码中进行轮询。步进 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”进行或运算。但是,我没有理由看到“PCMSK1”与“CONTROL_MASK”或“PCMSK1”,但也许我在那里遗漏了一些东西。

所以我们所做的是每次 G38.x 命令进入流时,我们设置 PCMSK1(PCINT13),然后我们告诉步进器做他们的事情,然后我们等待探测器跳闸。最后,探测完成后,我们清除 PCMSK1(PCINT13),这样我们就不会收到错误的中断。

现在,在 PCI1 ISR 中,我们应该停止步进运动(即“bit_true(sys_rt_exec_state, EXEC_MOTION_CANCEL);”)。我认为 grbl 可以在以后处理其他所有事情。

想法?我确定您有理由不这样做吗?

将探测架构从轮询更改为中断 #1095
成员

@doppelhub:对不起,TLDR。但我想我明白你在问什么。是的,探测是轮询的。但它与同样控制运动的步进 ISR 同步。只要它在每个 ISR 中都被轮询,那么它就会在步进器的分辨率内记录探针位置。

您看到超程的原因是 Grbl 必须适当地使机器减速。它不能在检测到探测器后立即停止,以免丢失步骤。相反,它会记录探头位置并立即调用进给保持以停止。报告的探测位置几乎总是与停止点不同。

此外,由于这个减速问题,无论如何你都不能真正快速地移动探头。您受到减速距离和探头允许行程的限制。

我倾向于使用必要的最少中断次数。尽量不要有两个或多个,连同主程序,试图相互交互。如果你这样做,它就会变成一团乱七八糟的跟踪状态、可变变量和调试竞争条件。

将探测架构从轮询更改为中断 #1095
作者
双中心 评论了 2016 年 9 月 29 日  

你好。问题不是由于 grbl 的加速。简而言之,我们的探测例程使用旋转工具,由于所述工具上的切割刀片,它会间歇性地接触金属表面。我们希望 grbl 在探针电压(引脚 A5)首次降至低于 Vil(max)(1.5 伏 @ VCC=5V)时中断并停止探针程序。

我将用图片进行总结:
https ://postimg.org/image/u33wf76qt/#
https://postimg.org/image/j4smx0i5h/#

我知道不是每个人都会遇到这个问题,但是中断探测例程是一个更健壮的实现,绝对值得中断。我将更改我们的 grbl 分支以使用中断。只是试水看看你是否想对 master 分支这样做。

将探测架构从轮询更改为中断 #1095
成员

@doppelhub: 好的,这是一个噪音问题。最简单的解决方案是使用不同的探测方法(如开关)消除噪声。

然而,我想一个中断可以只设置一个状态变量,这样当它被步进 ISR 轮询时,它会检查这个状态变量。我现在没有时间处理类似的事情(忙于发布 v1.1)。它的优先级相当低且具体。但是,我愿意查看关于您提案的拉取请求。

将探测架构从轮询更改为中断 #1095
作者
双中心 评论了 2016 年 9 月 30 日  

我们不能更改为开关*,但即使使用开关,中断也更好,因为它会在开关去抖时立即(就像它应该的那样)运行。我现在正在研究一个干净的解决方案,它使用一个实质上取代 probe_get_state 的内部逻辑的状态变量。这至少保证我们将在步进 ISR 周期内捕获任何探测事件(在我们的例子中大约为 1 毫秒)。

*在我们的应用中,我们在安装切削刀具时探测零件:我们使用 G38.3 代替快速 G0 移动,以确保如果我们碰到任何东西,我们会尽快停止;我们的主机有一个基于预期与实际探测结果的决策树。当然,如果我们在不期望的情况下命中任何东西,那是一个错误,但至少机器会在没有用户交互的情况下停止。任何人,一旦我对它运行良好感到满意,我就会发布拉取请求。

将探测架构从轮询更改为中断 #1095
成员

@doppelhub: 有趣的。期待你的想法。FWIW,开关可以与弱低通滤波器一起使用。你会有一点滞后,但它是一致的。

将探测架构从轮询更改为中断 #1095
作者

好的,让它与中断一起工作。我相信你可以更优雅地将它融入你的代码,但我把它留给你了。现在发布更改请求。

将探测架构从轮询更改为中断 #1095
哈维 评论了 2018 年 9 月 22 日  

减速真的和加速一样重要吗?嘿。我知道。牛顿第一运动定律。但!我可以想象这台机器的减速速度会比加速速度快一点。因为如果你加速你必须克服机器摩擦,OTOH 当你减速时,摩擦会帮助你!这在像我这样的 Z 轴丝杠设置中非常正确。惯性是不可能发生的。这就是为什么我认为你可以比加速更快地减速。让 GRBL 减速得更快是有意义的。或者可能添加选项以在探测时完全禁用减速…

我怎样才能完全禁用 Z 轴上的加速管理?$122=0似乎冻结了 GRBL。

我已经将 Z 加速度设置为$122=1999999并且精度提高了一点。我在 100 和 400 毫米/分钟之间有 0.5 毫米的误差,现在我有 0.2 毫米的差异。这意味着通过增加加速度,我得到了 2 倍更精确的探测结果。

将探测架构从轮询更改为中断 #1095

中断方法还有另一个好处:有时探针只被激活一小会儿,然后在材料上滑动一点,然后再次停用,直到下一步。中断会让你抓住那个反弹。(这个想法与去抖动完全相反)。

我将 LED 放到我的探头上,发现当我向下移动 0.1 毫米步长时,它有时只是闪烁,因为探头在该步长之前降低了一步,使其永久触发。

将探测架构从轮询更改为中断 #1095
成员

如果你在探测后不减速,你就有失去位置的风险,这会导致比解决更多的问题。

将探测架构从轮询更改为中断 #1095

@chamnit我认为在丝杠设置中消除了惯性。

将探测架构从轮询更改为中断 #1095
成员

没有惯性力不会就此消失。它转化为丝杠上的扭矩。丝杆和电机转子的转动惯量也需要处理。这些都不容忽视。

将探测架构从轮询更改为中断 #1095

这可能是在螺距更高的滚珠丝杠的情况下。滚珠丝杠能够将线性运动转化为扭矩。低螺距的丝杠摩擦力太大而无法这样做。

将探测架构从轮询更改为中断 #1095
成员

是的,摩擦力确实起到了作用,但是当您试图使加速度无限大时,惯性力会变得非常大。

将探测架构从轮询更改为中断 #1095

我认为 Z 的线性运动不可能在我的 eshapeoko 机器中转化为旋转。此外,由于丝杠螺距,Z 轴非常慢,但我很高兴我没有选择更便宜的螺纹杆选项:-)

将探测架构从轮询更改为中断 #1095

您不仅具有线性惯性,还具有旋转惯性。将电机和丝杠想象成飞轮

将探测架构从轮询更改为中断 #1095
成员
香奈儿 评论了 2018 年 9 月 25 日  

线性运动将转化为丝杠和电机,尤其是当您快速停止时。相信我。我对动力学有很好的理解。这是我的职业。

喜欢 (0)