注释
谢谢布鲁斯!代码看起来很可靠,我会在这个周末尝试一下。希望在我制定出 XON/XOFF 流量控制后不久。 |
我回去只做了一点代码美化。我计划今天广泛测试归位和去抖动例程。 我等不及 XON/XOFF 流量控制了!!! chamnit:你想让我为 0.8 版做一个 limits.c 吗?我认为有一些小的代码更改使其适用于您的边缘版本,但我想先从主版本开始。 |
听起来不错。我宁愿不必更改主版本,除非它与错误修复有关。所以,如果可以的话,请制作一个边缘版本,以便我可以将它正式集成。我一直在想,v0.8 已经发生了很多变化,我可能很快就会关闭它的开发并转向 v0.9。不确定那是什么时候。 |
chamnit:我打算开始处理 .8 版本的 limit.c 文件,但我想在 EEPROM 中添加 2 个变量。首先,我想添加一个步进率(或至少一些延迟值)并且我想添加一个去抖动延迟。现在,步进值被硬编码到例程中,去抖动延迟只是使用步进延迟,这对于某些开关来说可能不够长。 布鲁斯 |
听起来很合理。将这些放入底部的 config.h 文件中。它是设置的临时占位符的位置,最终可能会放入 EEPROM 中。在提交新的 EEPROM 设置菜单之前,我一直在等待将所有东西放在一起,主要是为了防止必须支持多个设置版本。当事情发展到这一点时,这将作为一个问题主题提出。 |
我已经更新了 grbl 的边缘版本,以包含带有开关去抖动的归位例程。它还需要更新 config.h 文件,因为有两个值应该成为用户可配置并存储在 EEPROM 中。 我有兴趣了解寻的例程如何对其他人起作用。可以在我的 fork 上的“edge”下找到更改。 布鲁斯 |
我有兴趣在我的一个测试台上实现这个,你有任何可用的接线信息吗?另外,除了编译你的边缘版本还需要做什么? |
你真的不需要做任何事情,但如果是我,我会下载 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”。一旦所有轴归位, 让我知道它是如何为您工作的,如果您有任何其他问题,请询问。 |
感谢您的反馈。我昨晚把开关挖了出来,把它们接线了。今晚我会把所有东西都放在一起,试一试! |
媒体 评论 on 10 Mar 2012
感谢您的工作。 我有一个关于归位过程的突然问题。 虽然对于 Grbl 这并不重要,但您只是不在 G 代码中发出 Z 坐标,但正如我从代码中读到的,以及您在此处的描述,归位例程依赖于 Z 轴,如果 Z 可能会挂起控制器轴不存在,试图找到不存在的原点/限位开关,不是吗? 丹尼斯 |
在过去一周左右的时间里,我一直在考虑这类问题。此时,运动被硬编码到 limits.c 源文件中,并且仅支持 3 轴。现在的想法是让人们尽可能简单地编辑和更改他们有的任何需求。虽然布鲁斯重新启动了归位循环工作,但我认为可能需要修改一些东西,比如考虑不同的轴步进分辨率,并添加一种无需使用主步进器代码即可进行加速的简单方法。(这对于慢跑也很有用)。 对于您的应用程序,我建议您下载源代码并将该 limit.c 文件编辑为您需要的内容。在那之前,我正在努力更新这段代码。 |
媒体 评论 on 10 Mar 2012
谢谢你。我会尝试编辑代码。 |
你能硬连线一个z轴的开关吗?如果您将其连接为 NC,那么当调用 z 轴例程进行归位时,它会看到开关已关闭并继续下一个轴?不知道这是否属实,但如果是这样,它可能比破解代码更容易。 |
我为 TinyG 处理此问题的方式是在 G28.1 命令中指定要归位的轴。 3 轴原点指令为 G28.1 X0 Y0 Z0 我要担心 6 个轴,所以有很多可能性。 |
埃德:好点。您可以在 Z 限位销上添加一个手动瞬时开关。我认为您所要做的就是击打它一次或两次以使其跳过 z 轴归位。 Alden:也许我们可以将其添加到 EEPROM 设置列表中。就像回家的轴和顺序一样。 |
媒体 评论 on 11 Mar 2012
谢谢大家的建议。 |
大家好。恢复这个对话。因此,我一直在查看 Bruce 的归位代码,并一直在寻找非归位操作期间的硬限制。另外,我还一直在研究为物理按钮确定运行时控制功能。所有这些都需要某种去抖动程序来准确检测开关的状态。Bruce 的方法可以很好地处理延迟调用,因为归位完全独立于其他所有内容。但是,当 Grbl 正在运行并按下开关时,我们不能使用延迟调用。真的会把事情搞砸。 我一直在研究去抖动技术,但没有想出太多。几乎每个人都使用某种不易携带的计时器计数。有谁知道没有计时器的软件去抖的方法?或者有什么想法可以完全规避这个问题? |
我想到了几个解决方案。首先是使用芯片上的实时时钟。这需要中断,并且可能很少。第二个是在某处建立自己的计数器寄存器,因为去抖动并不需要非常精确。您可以在每次步进中断时增加一些东西。将阅读器放在主协议循环中。或者,主循环多久进入一次? |
媒体 评论 on 18 Mar 2012
我们需要软件去抖动吗? |
dmmedia:好点。那么我们是否需要软件去抖动呢?我不确定。这就是我提出这个问题的原因。有很多方法可以进行硬件去抖动或仅使用非机械开关(如光学开关)来消除问题。但我想确保大多数新用户不会在不知不觉中遇到这个问题,并且我们有适当的解决方案。 另一个问题是我们是否可以设计 grbl 来抵抗弹跳信号?例如,假设我们已经确定了循环开始并且用户按下了机械开关。它是否多次向该引脚发出信号是否重要?它不应该。或者说按下了硬限位开关,这里也可以这样说。那么,在什么情况下这很重要?我可以看到微动开关输入是一个可能的问题。 奥尔登:谢谢你的想法。我想避免使用时钟,但软件去抖动可能是不可能的。步进中断不是一个坏主意,但很难预测它的速度有多快。虽然,可能有一种方法可以以不同的方式使用这个想法。此外,很难说主循环进入了多少次,但我会说在流式传输时不频繁,特别是当串行缓冲区中总是有数据时。 |
我首选的软件去抖动方法不是进行积分(这会延迟信号的开始),而是在开关开始后 20 到 200 毫秒之间引入锁定 – 取决于开关的弹性。某些应用程序不适用于此方法,但对于此处讨论的情况,它应该可以正常工作。所以问题是,有没有办法在开关关闭(或打开 – 在 NC 开关的情况下)设置一个标志,这样你就可以合理地保证它不会在至少 20 毫秒内被清除。在此范围内的系统中可以找到哪些事件? |
媒体 评论 on 19 Mar 2012
应该有一种方法可以使用外部中断来设置标志。 |
这里有一些想法: 如果您想要超快速响应,您需要在引脚更改中断中读取开关。如果您有一个非硬件去抖动开关,则该中断将在开关弹跳时以高频率调用。所以,这里的计算应该保持在最低限度。 我们需要去抖动吗?: |
有趣的点。 我开始倾向于要求对容易弹跳的机械开关进行硬件去抖动。如果可以的话,我宁愿不要通过软件去抖动来增加另一层复杂性。听起来好像没有使用计时器或延迟的简单解决方案,我们可以在很大程度上围绕这个问题进行设计。 Jens:我一直在重新考虑如何在不使用规划器的情况下实现归位和慢跑运动,而你的解决方案可能是要走的路。基本上,我会创建一个静态规划器块,步进器例程将重复处理该块,直到状态发生变化。我可能需要稍微重构步进模块以使其简单和模块化,但这可能是在不需要规划器的情况下实现简单的加速和归位运动的方式。 |
媒体 评论 on 20 Mar 2012
Jens:我没说过,硬件去抖动不会有任何延迟。我已经说过,延迟可以比软件小得多。 chamnit:在这里,您可以比较不同的硬件和软件去抖动技术:http Jens 再次:我同意你关于慢跑的观点,但不同意限位开关。软件可能会挂起或出现故障。我现在正在制作限位开关以停止硬件并通知软件。我希望开关关闭步进驱动器输出使能信号的开关方向,允许同时继续沿相反方向移动。这应该有两个目的:1)当开关被按下并处于按下状态时不会锁定硬件;2)允许在 Arduino 挂起或故障时停止运动。我的紧急开关将只是硬件,只会切断步进驱动器的电源。 我刚刚看到故障和以下挂起,当时没有更改轴 Y 和 Z 的默认值,而我的 CNC 上只有 X 轴,现在正在建设中。默认值与我的 X 轴速度相结合,总共得到 44kHz 的步进率。我使用不存在的 Z 轴编写了 G 代码,只是为了让我的 X 轴在命令之间停止,这导致 arduino 行为异常,在 X 轴上进行随机运动,击中限位开关,停止电机,丢失步骤并挂在最后。 |
谢谢丹尼斯。我以前看过这个页面。那里有很多好东西。我想我会把它放在关于去抖动限位开关的 Wiki FAQ 中。 无论如何,我认为这里的问题是去弹跳要求,无论是硬件还是软件,都非常依赖于机器/用户。我希望有一些已经建立的简单软件解决方案,但看起来它将涉及获得一个干净、便携、通用的解决方案,如果我们需要它的话。我开始感觉到 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 轴。 我想我认为 estop 和 limit 是非常独立的功能。急停是急停,但限位开关命中可能会导致重新校准。限位开关为归位和校准提供了良好的输入。因此,您肯定想在软件中编写限位开关的行为。E stop 需要中断、断电或两者兼而有之。 如果你碰巧有闭环控制,我认为分离变得更加重要。鉴于我最近发现 arduino 代码来读取 I 测量正交传感器,闭环不会是那么大的飞跃。它可能需要多个处理器,但是,计算周期是其中最便宜的部分。我可以很容易地看到 grbl 控制器近乎实时地询问传感器控制器的位置。 |
感谢您的输入!其中大部分已经讨论过很多。 Estop 和 limits 是分开的,但它们有很多相同的行为。 将添加的另一件事是软限制。一旦 LCD 支持会很好,但在我看来不是高优先级。它可能会 2012 年 10 月 4 日晚上 9:14,komradebob notifications@github.com写道: 位掩码很容易设置 我想我认为 estop 和 limit 是非常独立的功能。急停是急停, 如果你碰巧有闭环控制,我认为分离变得 — |
好的,所以我想提出一个我不能 100% 确定答案的问题。 根据我多次阅读的内容,不应使用 Arduino Timer0,因为某些库取决于其可用性。经过更多研究,这应该仅限于使用 Arduino IDE 时,而不是 avrgcc。所以,如果这是真的,我想看看大家对如何使用 Timer0 的看法。 需要记住的一件事是,添加另一个异步中断,即步进脉冲序列和串行读/写中断,可能会导致冲突,其中一个可以延迟另一个几微秒。这听起来可能不是很多,但如果我们想确保步进脉冲序列尽可能干净和可靠,我们不能在 Grbl 中添加另一个高频中断。 所以,我一直在想,我们可以将 Timer0 用作任何引脚开关的去抖定时器,例如循环启动、点动、进给保持等。我看到这个工作的方式是让每个开关调用引脚更改中断检测到变化,然后使 Timer0 溢出定时器在去抖延迟设置周期后超时。如果有问题的开关仍处于同一水平,则确认已触发。之后,Timer0 被禁用,直到下一个引脚更改事件。 如果你们都认为这会奏效,我会开始努力的。只是想在投入大量时间之前做一个健全性检查。 |
关于 Timer0 仅由 Arduino 内核使用是正确的(millis() 和 micros() 将其用作挂钟)。avr-libc -only 不会以任何方式触及它(或任何其他 AVR 外围设备,就此而言),所以这一切都是你的。 |
去吧!我保存了 Timer0 用于 PWM 控制主轴速度。事实证明,将主轴连接到您的 arduino 是一个非常糟糕的主意,所以没有奏效。Lasersaurus 人使用它进行动态激光功率控制以补偿速度变化,但我认为他们很久以前就离开了我们,这不是问题。 另一方面,我可以看到常规“系统滴答”类型的中断用于更多低频定时事物(可能对归位周期和驻留有用)。这可以以某种方式结合吗?也许通过在每个系统滴答声中对输入进行采样,并在采取行动之前需要两个相同的读数。(我的意思是:如果您要等待去抖动确认,就没有理由使用中断来读取它们)。另一方面,这可能会使步进脉冲略微不规则,我们不希望这样! |
可能对许多目的有用。按键开关扫描,看门狗定时器 2012 年 10 月 5 日星期五下午 4:03,Simen Svale Skogsrud <
|
嗯,我们可以做很多事情。系统滴答想法可以与运行时命令模块一起使用,并且也可以定期向 GUI 发送状态报告。就像 simen 说的那样,我们必须想办法在不使用中断(至少太多)的情况下做到这一点……有很多事情要考虑。因此,我将计划推动清除其中一些用户设置和状态报告,然后将边缘分支移至主分支。(这似乎是正确的时间。)然后计划在新的边缘分支上启动 Timer0 的东西。 获取我们希望系统滴答做的事情的列表并计划我们希望如何进行可能是一个好主意? |
下载并编译。比以前好多了。 评论: 从“?”报告的另一件事 Cmd 将是限位开关的状态。方便调试。 2012 年 10 月 5 日 19:59,Sonny Jeon notifications@github.com写道:
|
啊好抓。我需要对其应用反转蒙版。今晚晚些时候我会更新它。 要获得要打印的限制状态,只需将此行放在 protocol.c 中的 protocol_status_report() 函数中: print_uint8_base2(LIMIT_PIN); 这应该打印高位数字引脚状态的二进制文件。 |
喔好吧。我以为我把它弄丢了,或者在睡梦中换了电机引线:) 感谢您提供有关引脚状态打印的信息。 在相关的说明中,我今天下午看着我的桌子来回走动 2012 年 10 月 10 日星期三晚上 7:43,Sonny Jeon notifications@github.com写道:
|
固定的。现在应该可以了。 |
1只大猪 评论 on 15 Feb 2012
我的cnc路由器上有工作限位开关似乎是grbl。此代码有我的 debounce 例程的 alpha 版本。我计划进行一些广泛的物理测试,但到目前为止它似乎有效。它是 Master .7d 分支,唯一更改的文件是 limit.c。在我的叉子上可用。
布鲁斯