注释
谢谢布鲁斯!代码看起来很可靠,这个周末我会尝试一下。希望在我制定出 XON/XOFF 流量控制后不久。 |
我回去做了一点代码美化。我计划今天广泛测试归位和去抖例程。 我等不及 XON/XOFF 流控制了!!! chamnit:你想让我为 .8 版做一个 limits.c 吗?我认为有一些小的代码更改可以使其与您的边缘版本一起使用,但我想先从主版本开始。 |
听起来不错。我宁愿不必更改主版本,除非它与错误修复有关。所以,如果可以的话,请制作一个边缘版本,这样我就可以正式集成它了。我一直在想 v0.8 已经有了很多变化,我可能很快就会结束对它的开发并继续使用 v0.9。不确定那会是什么时候。 |
chamnit:我打算开始处理 limit.c 文件的 .8 版本,但我想向 EEPROM 添加 2 个变量。首先,我想添加一个步进速率(或至少一些延迟值)并且我想添加一个去抖动延迟。现在,步进值被硬编码到例程中,去抖动延迟仅使用步进延迟,这对于某些开关来说可能不够长。 布鲁斯 |
听起来很合理。将这些放入底部的 config.h 文件中。它是设置的临时占位符的位置,最终可能会被放入 EEPROM。在提交新的 EEPROM 设置菜单之前,我一直在等待将所有东西放在一起,主要是为了避免必须支持多个设置版本。当事情发展到这个地步时,这将作为一个问题话题提出来。 |
我已经更新了 grbl 的边缘版本,以包含带有开关去抖动的归位例程。它还需要更新 config.h 文件,因为有两个值应该成为用户可配置的并存储在 EEPROM 中。 我有兴趣了解归巢程序如何为其他人工作。可以在我的叉子上的“边缘”下找到更改。 布鲁斯 |
我有兴趣在我的一个测试台上实现这个,你有任何可用的接线信息吗?另外,除了编译你的边缘版本还需要做什么? |
你真的不需要做任何事情,但如果是我,我会下载 chamnit 的边缘版本,然后拉出我的 limit.c 并将我的 config.h 文件合并到他的最新版本中(这正是我现在正在做的)。然后做一个 make clean 并 make all 你应该有工作的归位开关。 至于硬件,我在我的机器上使用现有的限位开关。当开关闭合时,它们只是将端口 B 引脚 1、2、3(Arduino D9、D10、D11)拉低。归位例程将引脚设置为“高”并且开关通常打开但在闭合时将引脚拉至接地(机器触摸开关)。 希望我的漫无边际足够清楚…… 布鲁斯 如果您发现归巢程序有任何有趣或错误,请告诉我。虽然它对我 100% 有效,但对其他人可能无效…… |
布鲁斯, 只是为了让我理解正确:将每个开关的一侧连接到 arduino 9,10,11(X,Y,Z),另一侧连接到 gnd。 在那之后实际回家机器的过程是什么? |
这在归位开关上是完全正确的。至于开关类型,Cherry micro 正是我路由器上的开关。我的路由器不是自制的(Larken 15/15 — http://www.larkencnc.com/cam15/index.shtml),我最初是用 Mach3 改装的,现在我正在尝试 grbl。 连接好开关后,您可以键入 G28 或 G30(两者在当前 grbl 中是相同的),机器将启动归位程序。现在,Z 向正方向移动,直到开关闭合,然后 X 和 Y 都向负方向移动,直到这些开关闭合。一旦所有 3 个开关都关闭,程序就会以 1/5 的归位速率缓慢地将所有轴移离开关。Debounce 目前已实施,似乎对我来说效果很好。此外,从当前版本开始,它以 8 位二进制数显示限制引脚的状态。小端位是“步进器启用”,接下来的 3 个是限位开关的状态。“1”表示开关打开,一旦关闭就变为“0”。一旦所有轴归位, 让我知道它是如何为你工作的,如果你有任何其他问题,请询问。 |
感谢您的反馈。我昨晚把开关挖了出来并接上了线。今晚我会把所有东西都连接起来,试一试! |
感谢您的工作。 我突然有一个关于归位过程的问题。 虽然对于 Grbl 这并不重要,你只是不在 G 代码中发出 Z 坐标,但正如我从代码中读取的以及你在这里的描述,归位例程依赖于 Z 轴并且如果 Z 可能会挂起控制器轴不存在,试图找到不存在的原点/限位开关,不是吗? 丹尼斯 |
在过去一周左右的时间里,我一直在思考这类问题。此时,运动被硬编码到 limits.c 源文件中并且仅支持 3 轴。现在的想法是让人们尽可能简单地编辑和改变他们的任何需要。虽然 Bruce 重新开始了归位循环工作,但我认为有些事情可能需要修改,例如考虑不同的轴步分辨率和添加一种简单的方法来进行加速而无需使用主步进代码。(这对慢跑也很有用)。 对于您的应用程序,我建议您下载源代码并将 limit.c 文件编辑为您需要的内容。在那之前,我正在努力更新这段代码。 |
谢谢你。我会尝试编辑代码。 |
你能为 z 轴硬接线一个开关吗?如果您将其连接为 NC,那么当调用 z 轴例程进行归位时,它会看到开关已经关闭并继续到下一个轴?不知道那是不是真的,但如果是的话,它可能比破解代码更容易。 |
我为 TinyG 处理这个问题的方法是在 G28.1 命令中指定你想要归位的轴。 3 轴归位指令为 G28.1 X0 Y0 Z0 我有 6 个轴要担心,所以有很多可能性。 |
埃德:好点。您可以在 Z 限位销上添加一个手动瞬时开关。我认为您所要做的就是敲击它一次或两次以使其跳过 z 轴归位。 Alden:也许我们可以将其添加到 EEPROM 设置列表中。就像回家的轴和顺序一样。 |
谢谢大家的建议。 |
大家好。恢复这段对话。因此,我一直在审查 Bruce 的归巢代码,并一直在寻找非归巢操作期间的硬限制。另外,我也一直在研究固定物理按钮的运行时控制功能。所有这些都需要某种去抖程序来准确检测开关的状态。Bruce 的方法适用于延迟呼叫,因为归巢完全独立于其他一切。但是,当 Grbl 正在运行并且按下开关时,我们不能使用延迟调用。这真的会把事情搞砸。 我一直在研究去抖动技术,但没有想出太多。几乎每个人都使用某种不易移植的计时器计数。有谁知道没有定时器的软件去抖的方法?或者关于试图完全规避这个问题的任何想法? |
我想到了几个解决方案。第一种是使用芯片上的实时时钟。这需要中断,而且可能很少。第二种是在某处构建您自己的计数器寄存器,因为去抖并不需要非常精确。您可以在每个步进器中断时增加一些东西。将阅读器置于主协议循环中。或者,主循环多久进入一次? |
我们是否需要软件去抖动? |
dmmedia:好点。那么我们是否需要软件去抖动?我不确定。这就是我提出这个问题的原因。有很多方法可以进行硬件去抖动或仅使用非机械开关(如光学开关)来解决问题。但我想确保大多数新用户不会在不知不觉中遇到这个问题,并且我们有适当的解决方案。 另一个问题是我们是否可以设计 grbl 来抵抗弹跳信号?例如,假设我们将周期开始固定,用户按下机械开关。如果它多次向该引脚发出信号是否重要?它不应该。或者说硬限位开关被击中,这里也可以这样说。那么,在什么情况下这很重要?我可以将慢跑开关输入视为一个可能的问题。 奥尔登:谢谢你的想法。我想避免使用时钟,但软件去抖动可能是不可能的。步骤中断是个不错的主意,但很难预测它的速度。虽然,可能有一种方法可以以不同的方式使用这个想法。此外,很难说进入主循环的次数,但我会说在流式传输时很少,尤其是当串行缓冲区中始终有数据时。 |
我首选的软件去抖动方法不是进行积分(这会延迟信号的开始),而是在开关开始后的 20 – 200 毫秒之间引入锁定 – 这取决于开关的弹性。某些应用程序不适用于此方法,但对于此处讨论的情况,它应该可以正常工作。所以问题是,有没有办法在开关闭合(或 opensure – 对于 NC 开关)上设置一个标志,这样你就可以合理地确信它至少在 20 毫秒内不会被清除。在这个范围内可以在系统中找到哪些事件? |
应该有一种方法可以使用外部中断来设置标志。 |
这里有一些想法: 如果您想要超快速响应,您需要在引脚更改中断中读取开关。如果您有一个非硬件去抖动开关,则在开关弹跳时将以高频率调用中断。因此,此处的计算应保持在最低限度。 我们是否需要去抖动?: |
所有有趣的点。 我开始倾向于要求对易跳动的机械开关进行硬件去抖动。如果可以的话,我宁愿不通过软件去抖来增加另一层复杂性。听起来好像没有不使用计时器或延迟的简单解决方案,我们可以在大多数情况下围绕这个问题进行设计。 Jens:我一直在重新考虑如何在不使用规划器的情况下实现归位和慢跑运动,您的解决方案可能就是可行的方法。基本上,我会创建一个静态规划器块,步进器例程将重复处理该块,直到状态发生变化。我可能不得不稍微重构步进模块以使其简单和模块化,但这可能是实现简单的交流/减速运动的方式,无需规划器即可进行慢跑和归位。 |
Jens:我没说,硬件debouncing不会有任何延迟。我已经说过,延迟可以比软件小得多。 chamnit:在这里,您可以比较不同的硬件和软件去抖动技术:http Jens 再次:我同意你关于慢跑的看法,但不同意限位开关。软件可能会挂起或发生故障。我现在正在制作限位开关以停止硬件并通知软件。我希望开关关闭开关方向的步进驱动器输出使能信号,同时允许继续沿相反方向移动。这应该有两个目的:1)当开关被按下并处于按下状态时不会锁定硬件,以及 2)允许停止运动以防 Arduino 挂起或发生故障。我的紧急开关只是硬件,只会切断步进驱动器的电源。 我刚刚看到故障和挂起,当时没有更改 Y 轴和 Z 轴的默认值,而我的 CNC 上只有 X 轴,现在正在建设中。默认值与我的 X 轴速率相结合给出了 44kHz 的总步进速率。我已经使用不存在的 Z 轴编写了 G 代码,只是为了让我的 X 轴在命令之间停止,这导致 arduino 行为异常,在 X 轴上随机运动,击中限位开关,电机失速,丢失步骤并在最后挂起。 |
谢谢丹尼斯。我以前看过这个页面。那里有很多好东西。我想我会把它放在 Wiki 常见问题解答中关于去抖动限位开关。 无论如何,我认为这里的问题是去抖动要求,无论是硬件还是软件,都非常依赖于机器/用户。我希望有一些已经建立的简单软件解决方案,但看起来它将涉及到一个干净、便携、通用的解决方案,如果我们需要的话。我开始觉得 Grbl 可能不需要支持这个,或者这可能会被推回 v0.9+ 开发项目。我这样说是因为当前版本的 Grbl 除了需要任何形式的去抖动的限位开关之外没有输入引脚。Bruce 的归巢程序或类似的程序应该适用于 v0.8。 所以我的想法是,除非另一个维护者有时间处理它,否则我们应该把这个问题推回到下一个开发版本并完成 v0.8。我认为唯一剩下的(主要)事情是归巢程序、慢跑程序、高级设置和状态报告。有人同意吗? |
我同意。让我们不要太纠结。简洁的质量发布应该是要走的路。功能一旦加入就很难退出。如果没有考虑周全,它可能会成为一种真正的痛苦。 在需要时要求硬件去抖动的另一个论点是:grbl 的普通用户可能是构建或修改了他或她的机器的黑客。因此,他(或她)应该能够修补一些 RC 电路。对于其余部分,随着 grbl 和 CNCing 变得更加主流,也许 grbl shield v2.0 将包含去抖开关(或者已经包含?)。 |
很抱歉遇到一个老问题; |
不,这不会那么难做。问题是你是否关心 Grbl 在它发生后知道它在哪里。这是开环控制的问题,步进电机不向控制器提供实时反馈。如果你立即停止机器,你就会失去位置。 我认为 Grbl 通常支持的步进电机尺寸没有足够的扭矩来对螺杆或电机造成任何损坏。我个人认为安装在软件中设置的“软”限制会更容易。它需要用户执行归位循环才能使用它们,但这将允许 Grbl 执行受控减速直至停止并保持其定位。 |
(更新一个旧线程) 限制例程刚刚更新为包括加速度和多个轴的正确运动,但除此之外,它的行为应该与以前类似。这是第一次提交,还有很多事情要做。现在,我正在寻找一种简单的方法供用户设置限位开关,即不存在的正常高/低开关。 我也在考虑创建一个硬停止限制中断,当在正常操作期间触发限位开关时,它基本上会执行紧急停止。它将强制 Grbl 关闭所有电机和主轴,然后进入无限循环并锁定所有其他进程。只有 Arduino 的物理重置才会重新启动 Grbl。这适用于每个轴设置的任何多个限位开关。此外,用户应该能够将急停开关连接到任何限位销以获得急停功能。 请让我知道你们是否希望我稍微改变一下或发现任何问题。谢谢! |
位掩码很容易设置引脚的存在/不存在和方向。8 位足以覆盖 4 个轴。 I guess I see estop and limit as very separate functions. E-stop is e stop, but a limit switch hit might cause a recalibration for example. Limit switches make good inputs for homing and calibration. As such, you definitely want to code the behavior of limit switches in software. E stop either needs to be interrupt, power cutoff or both. If you happen to have closed loop control, I think the separation gets even more important. Given a recent discovery I found of arduino code to read I-gauging quadrature sensors, closed loop would not be that far a leap. It might require multiple processors, however, compute cycles is the cheapest part of this. I could easily see the grbl controller interrogating the sensor controller for position in near real time. |
Thanks for the input! Much of this has already been discussed quite a bit. Estop and limits are separate true, but they share a lot of same behavior. |
我的 cnc 路由器上有一个看起来像 grbl 的工作限位开关。此代码具有我的去抖例程的 alpha 版本。我计划进行一些广泛的物理测试,但到目前为止它似乎有效。它是 Master .7d 分支,唯一更改的文件是 limit.c。在我的叉子上可用。
布鲁斯