开源改变世界!!

常闭终端不需要下拉? 第542章

推推 grbl 2年前 (2022-10-30) 144次浏览 0个评论
关闭
matthijskooijman 打开了这个问题 on 19 Nov 2014 · 51 条评论
关闭

常闭终端不需要下拉?第542章

matthijskooijman 打开了这个问题 on 19 Nov 2014 · 51 条评论

注释

常闭终端不需要下拉? 第542章

在常见问题解答中,我读到:

Arduinos 有一个用于常开开关的小型内部上拉电阻,有助于防止在开关闭合时引脚烧坏。对于常闭开关,用户必须在开关上连接一个外部下拉电阻。这个额外的步骤通常被遗忘并导致炸针。

我不确定这应该如何工作。AFAIU 下拉/上拉,这些可防止引脚在开关打开时浮动(例如,确保在开关打开时引脚具有预定义的逻辑电平)。我看不出让大头针漂浮会如何炸它?

此外,应该可以使用内部上拉以及 AFAICS 连接常闭开关。在这种情况下,开关通常会将引脚拉至地,因此读数为低(并且有一个小电流,高达 5V/20kohm = 0.25mA 运行)。当限位器被激活并且开关打开时,接地断开,上拉将引脚拉高,因此它读取一个高电平。AFAICS支持常闭开关唯一需要做的就是在读取时反转引脚状态,因为现在低电平表示空闲,高电平表示终端停止激活。内部上拉可以保持打开,开关可以正常连接到 GND,不需要外部下拉。

有人可以指出我推理中的缺陷(如果有的话)吗?

常闭终端不需要下拉? 第542章
成员

尚尼特 评论 on 19 Nov 2014

@matthijskooijman:上拉和下拉主要用于限制流入和流出逻辑引脚的电流。没有它们,这可能会导致逻辑引脚烧毁。大多数情况下,这不会发生,但这主要是对用户的预防性警告,以防止他们因错误的接线习惯而炸掉 Arduino 引脚。

常闭终端不需要下拉? 第542章

嗯?这完全不是我(和我问过的其他人)理解下拉的方式。至少,没有下拉/上拉不应该导致引脚烧坏。使用直接连接到地或 VCC 当然有可能发生短路,也许你是这个意思?(虽然我不认为它实际上可以烧掉引脚本身——只要它被配置为输入模式,只有少量的电流可以流入它,因为它的输入阻抗很高)。

在任何情况下,下拉的主要目的是防止输入引脚在未连接输出时悬空。例如见https://learn.sparkfun.com/tutorials/pull-up-resistors/what-is-a-pull-up-resistor

至于我的提议,让我用图片澄清一下:

常闭终端不需要下拉? 第542章

这里,R1 是 Arduino 内部的内部上拉电阻,引脚配置为输入。

  • 当开关闭合时,有一点电流流过 R1(Atmega328p 为 20kohm – 50kohm)
  • 当开关打开时,流入引脚的电流可忽略不计。

如果您担心引脚被意外配置为高输出导致短路,在开关和引脚之间连接一个小电阻可能会有所帮助,尽管这也适用于常开开关(除了一个常开开关的闭合频率较低,因此触发此类问题的可能性较小,但这并非不可能)。

如果你能回应这个提议,我会很好。我想实现这样的常闭开关,但我认为这需要代码中的一些支持(反转限位开关的含义,而不禁用内部上拉)。如果您愿意接受,我很乐意为此提供代码。

常闭终端不需要下拉? 第542章

@matthijskooijman: 对不起,我的误解。它不会直接影响引脚本身,但如果没有下拉电阻,它仍然会消耗电压源。如果您的电压源与为 Arduino 供电的电压源相同,它将短路并且可以消耗足够的电流来停止处理器。

如果您已将建议的上拉电阻与 NC 开关一起使用,您仍然会以较低的速率消耗电源。但是,如果您有足够多的相同连接,例如 3 个限位开关和 3 个控制开关,累积的功率损耗可能会导致相同的问题。这一切都可以通过简单地按照推荐的方式接线来避免。

常闭终端不需要下拉? 第542章

我仍然不确定没有下拉电阻器(并使用内部上拉电阻)会比外部下拉电阻消耗更多的电流。

当您说“如果没有下拉电阻,它仍然会消耗电压源”时,您是指我之前帖子中的接线吗?或者你有没有其他的想法?

再来一张图。IIUC,这是推荐的常闭开关接线吗?

常闭终端不需要下拉? 第542章

这次下拉是 Arduino 外部的。

AFAICS,两种情况下均未按下开关时的漏电流为 5V/R1。对于内部上拉电阻 R1 >= 20k,因此漏电流 <= 0.25mA,这几乎可以忽略不计。通过外部上拉,您当然可以使 R1 更大并减少泄漏,尽管我认为这可能会导致其他问题(响应时间更慢,对静电更敏感)。无论如何,每个开关 0.25mA 对我来说似乎不是一个大问题,而且我看不出下拉如何阻止它。

常闭终端不需要下拉? 第542章

@matthijskooijman:我的意思是,如果您有一个没有下拉电阻的常闭开关,则将 Vcc 与地之间的连接短路。这显然会耗尽电流。至于带上拉电阻的 NC 建议,我认为 328 秒仅消耗 0.25mA 的电流并不重要。它不是一个强大的解决方案,不能保证它不会随着人们将它移植到不同的 CPU 而改变。你可以分叉它并做任何你想做的事情,但我不会直接支持只有上拉电阻的 NC 开关。此外,如果我记得,如果不将引脚设置为正常高电平,就无法启用内部上拉电阻。我可能错了。

常闭终端不需要下拉? 第542章

想多了,我就糊涂了。我上一条评论中的接线使用了下拉,但实际上并没有反转引脚的含义——高电平仍然表示开关未激活,低电平仍然表示开关已激活。因此接线需要关闭上拉电阻,而不是引脚含义反转。我发布的第一个原理图需要打开上拉电阻,但引脚含义倒置。但是,当您启用限制引脚的反转时,代码会同时执行这两种操作 – 它会关闭上拉电阻反转引脚含义。对于常闭开关,您推荐什么接线?

我的意思是,如果您有一个没有下拉电阻的常闭开关,则将 Vcc 与地之间的连接短路。

那么 Vcc 连接在哪里,地连接在哪里呢?我显然不是在建议短路的接线。

至于带上拉电阻的 NC 建议,我认为 328 秒仅消耗 0.25mA 的电流并不重要。它不是一个强大的解决方案,不能保证它不会随着人们将它移植到不同的 CPU 而改变。

AFAIK 所有的 AVR 都有一个相当高的上拉电阻值。根据您的推理,您根本不应该使用内部上拉电阻 – 谁保证没有 CPU 的 1 个引脚的泄漏电流(按下该开关时)不会太多?

请注意,我并不想在这里变得令人讨厌或固执,我只是不相信需要外部下拉(自从这篇文章以来,我不完全确定即使使用外部下拉也可以使用什么接线……)。

常闭终端不需要下拉? 第542章

大家好!只要您正确连接您的 nc 开关,这与无开关完全相同,应该没有问题,只要在开关关闭时引脚没有设置为高!

如果我没记错的话,所有引脚在启动时都设置为低电平,所以不要尝试将开关连接到 vcc,这可能会在启动时将其炸毁。

常闭终端不需要下拉? 第542章

只要您正确连接 nc 开关,这将与 no 开关完全相同

嗯?您如何连接“与没有开关相同”的东西?

如果我没记错的话,所有引脚在启动时都设置为低电平

AVR 处理器将其所有引脚配置为输入模式(== 高阻抗/浮动),而不是输出。或者 GRBL 是否明确地使所有引脚输出为低电平?

@chamnit,我突然想到,使用“下拉”电阻器,您可能是指串联电阻器来限制电流?就像是:

常闭终端不需要下拉? 第542章

(但这会在开关打开时使引脚悬空 – 它仍然需要(内部)上拉才能工作)。

常闭终端不需要下拉? 第542章

嗯?您如何连接“与没有开关相同”的东西?
我猜我不清楚,我的意思与常开开关的方式相同,pin -> gnd,这是推荐的方式吗?

常闭终端不需要下拉? 第542章

@skrutt,但是如果我像常开开关一样连接它,添加一个下拉并让 grbl 禁用内部上拉,你会得到:

常闭终端不需要下拉? 第542章

在这种情况下,无论开关状态如何,引脚都将始终为低电平,对吧?那可不好:-)

常闭终端不需要下拉? 第542章

是的,只需移除那里的电阻并反转配置中的引脚即可。并且不要禁用内部上拉!;)

常闭终端不需要下拉? 第542章

是的,只需卸下电阻器(…)并且不要禁用内部上拉!;)

这正是我最初提出的,参见#542 中的示意图(注释)

反转配置中的引脚,应该就是这样。并且不要禁用内部上拉!;)

我不能 – 启用反转限制引脚配置会反转引脚的含义禁用内部上拉。我看不到前者但不是后者?

常闭终端不需要下拉? 第542章

没问题,加个外接上拉电阻,1000到20Kohm就可以了!或者找到一种在引脚反转时仍然启用内部上拉的方法,但连接外部上拉可能更容易。

是的,你是对的!这么多来回,我错过了。

常闭终端不需要下拉? 第542章

@skrutt,好的,所以我可以使用外部上拉来解决这个问题,但是如果有足够的内部上拉,为什么还要麻烦呢?为什么不允许在软件中这样做。显然@chamnit认为这在某种程度上不安全或浪费太多电力,但我仍然不确定为什么

此外,所有文档都在讨论常闭开关的外部 pull_down_,因此他们必须在讨论另一种推荐的接线。@chamnit,您能评论一下您推荐的常闭开关接线方式吗?

常闭终端不需要下拉? 第542章

如果您希望常闭开关具有与推荐的无开关相同的行为,您可以连接这样的东西
常闭终端不需要下拉? 第542章

然而,这有点矛盾,因为禁用内部上拉是合适的。但在实践中,您可以只使用一个低阻值电阻,它应该可以正常工作。

常闭终端不需要下拉? 第542章

@matthijskooijman: 没必要大惊小怪开始提出要求。

我想我开始理解你的原点了。您只需在 AVR IO 引脚中使用上拉电阻并将其拉高以用于常开和常闭开关。Grbl 中的逻辑管理它是否将信号解释为开关正在接合。无论是上拉还是下拉,您都将始终拥有一个带有常闭开关的通电电路。这个对吗?

正如您所说,这对于基于 AVR 的设计可能很好,但是对于所有 ARM,其 IO 引脚上都有内部上拉电阻并且行为方式相同?

常闭终端不需要下拉? 第542章

没有必要大惊小怪并开始提出要求。

我也不是故意的。如果遇到这种情况,我很抱歉。我只是想弄清楚这一点(并且可能会在此过程中改进一些文档):-)

您只需在 AVR IO 引脚中使用上拉电阻并将其拉高以用于常开和常闭开关。Grbl 中的逻辑管理它是否将信号解释为开关正在接合。

是的。

无论是上拉还是下拉,您都将始终拥有一个带有常闭开关的通电电路。这个对吗?

是的,假设“通电”意味着“电流流动”。我看不出有一种方法可以使常闭开关在空闲时没有电流流动(与常开开关相反,常开开关只有在激活时才有电流流动)。

正如您所说,这对于基于 AVR 的设计可能很好,但是对于所有 ARM,其 IO 引脚上都有内部上拉电阻并且行为方式相同?

AFAIK the Due 和 Teensy 拥有它们,我不知道任何其他(官方)基于 ARM 的 Arduinos。此外,如果有人将 GRBL 移植到没有它们的板上,或者有上拉导致问题,他们应该能够禁用内部的并根据需要添加外部的。

软件方面,我赞成添加一个“限位开关上拉”设置来控制限位开关上的上拉,独立于已经存在的“反向限位开关”设置。听起来怎么样?不过,不确定 GRBL 是否有优雅地处理升级的机制?

常闭终端不需要下拉? 第542章

@matthijskooijman: 好的,我会考虑改变限位开关的方法。可能有几个用户已经连接了外部电阻,并且需要充分通知他们此类更改。不确定是否存在相关风险。

允许配置引体向上的目的是什么?此时,您必须管理 4 种可能的开关状态,而不是两种。我想保持简单。

常闭终端不需要下拉? 第542章 chamnit 重新打开了这个 2014 年 11 月 20 日
常闭终端不需要下拉? 第542章

允许配置引体向上的目的是什么?此时,您必须管理 4 种可能的开关状态,而不是两种。我想保持简单。

好吧,我可以想象可能存在内部上拉不起作用或不需要的非标准接线方案,但我现在想不出任何具体情况。

更重要的是向后兼容性——对于已经有外部电阻或依赖内部上拉关闭的人来说,事情可能会中断。添加设置将允许升级以在设置反转标志时禁用上拉。OTOH,也许您可​​以期望人们在升级时阅读更改日志,并在引起问题时让他们调整接线…

常闭终端不需要下拉? 第542章

我的两分钱将是内部上拉的编译时间选项,默认打开(按原样)并且反转限制引脚选项不会影响这一点。

简单,干净,支持默认接线,对于那些想要/需要更改它的人来说,这样做非常简单。但是,当某人(如果有人)因为使用旧的倒置上拉选项而遇到问题时,wiki 应该有新的明确说明来涵盖这一点。就我个人而言,我对 grbls 选项感到非常自在,但我仍然发现自己经常阅读 wiki!

常闭终端不需要下拉? 第542章

@skrutt听起来不错。

我还不清楚一件事:是否有任何接线实际上需要电流反转+上拉禁用实现?我想知道是否有人实际使用该选项,如果有,他们有什么接线?会不会像#542(评论)中那样,但使​​用外部上拉而不是内部上拉?是否还有任何使用此选项的接线和文档中的下拉菜单,或者文档可能是错误的?

常闭终端不需要下拉? 第542章

@matthijskooijman有点像那个评论,但你会希望引脚像往常一样被读取,但仍然禁用内部上拉。考虑到有人正在使用 av 常开开关到 vcc,并使用高电阻作为下拉。如果下拉电阻是内部上拉电阻的值,并且它在更新中突然被激活,则限制引脚上的电压将为 2.5 V,这可能会产生一些非常不稳定的行为。

这种情况很可能很容易重新布线,例如使用较小的电阻器,但添加代码中的支持也可能很简单,并为 grbl 提供更大的灵活性。

如果您要将 grbl 安装到商业机器上并且已经定义了止动装置的逻辑电平,那么无论是否使用反向限位销,您都可能希望禁用上拉。

常闭终端不需要下拉? 第542章

我不会依赖它们太大的内部上拉电阻,所以它会对噪音敏感,而且大多数开关都会像一点电流一样帮助清洁触点

常闭终端不需要下拉? 第542章

@langwadt: 很高兴知道。那么,话虽如此,这是否意味着没有理由改变现在的工作方式?我希望如此,因为我不想再次重写。

常闭终端不需要下拉? 第542章

@chamnit,根据我的经验,内部上拉对于简单的开关来说很好,到目前为止从未出现过任何问题(在非 CNC 应用中)。我怀疑@langwadt在某些情况下是正确的(长电线,嘈杂的环境),但内部上拉并非普遍无用。

如果在某些环境中上拉确实太大,这可以通过添加较小的上拉来解决,不需要内部上拉 AFAICS。

此外,我认为这一切都不受常开与常闭的影响——如果内部上拉对于 NC 开关来说太大了,那么它对于 NO 开关来说也太大了。因此,禁用内部上拉以及反转限制引脚是没有意义的 – 您实际上是在无缘无故地强制使用带有 NC 开关的外部上拉。

由于上述原因,我仍然支持建议的解决方案:让反转限制设置只是反转开关含义并允许禁用内部上拉仅作为编译时选项。

我刚刚完成了一台带有双 NC 终端挡块的小型 Mantis CNC 铣床的重新布线。由于我使用的 protoneer 的 grblshield 没有任何外部上拉,我将使用上述建议修改代码,并在下周在我的硬件上进行测试。一旦我有东西要展示,我会提交 PR :-)

常闭终端不需要下拉? 第542章

从我的角度来看,实现限位和停止开关的最安全方法是将 grbl 置于正常操作低电平并启用内部上拉开关或在内部不足时添加一些。这样做您还可以确保如果一些断线或没有连接,引脚被内部电阻拉高并停止呼叫。

常闭终端不需要下拉? 第542章

刚才我正在查看 git 日志以找出我的提交消息使用什么样式,当我发现#289时,它最初引入了禁用上拉和反转限制引脚设置。显然@Travis-Snoozy具有在达到限制时将限制引脚驱动为高电平的硬件,需要下拉(参见此评论中的示意图)。

看到那是反转代码的原始用例,我现在更好地理解了为什么事情是这样的。我仍然相信我们改变事物的建议是好的,@Travis-Snoozy仍然可以使用编译时选项支持他的设置。

常闭终端不需要下拉? 第542章

我已经实施并测试了该提案,该提案在我的 NC 机器上运行良好。欢迎在其他机器上测试!

常闭终端不需要下拉? 第542章

这里有一点混淆。:)

我最初的签入不支持反转输入/引脚(尽管看起来随后的重写/重构在翻译中丢失了这一事实),也不支持将上拉作为“功能”本身禁用。我的签到支持主动高开关,作为一个单一的功能。据我所知,当时 Grbl支持常开开关,这对于理解为什么该更改会关闭上拉电阻至关重要。

如果您的(常开)开关处于高电平有效状态,那么让上拉电阻处于活动状态绝对没有意义:开关在处于活动状态时应该驱动为高电平,或者驱动为低电平或被拉低(外部),以便信号在所有其他时间保持低电平。在这些情况下拉高只会与开关硬件发生冲突,这会适得其反。

这个新问题是对常闭开关的支持,如上所述,这与我的补丁解决的问题不同。常闭开关在逻辑上可以解释为“高电平有效”,即使它们的正常(闭合)状态连接到地(如果它们连接到 VCC,则为“低电平有效”)。但是,现在系统需要知道两条信息来设置引脚反转和上拉设置:开关硬件是常开还是常闭,开关是高电平有效还是低电平有效?

我建议建议的补丁令人困惑并且可能有害,并且应该使用两个配置值来准确描述终端停止硬件:LIMIT_SWITCHES_ACTIVE_HIGH(如前)和 LIMIT_SWITCHES_NORMALLY_CLOSED(支持常闭硬件)。默认应该是两者都默认为 false,以继续支持现有硬件。

是的,这意味着您需要支持四种配置(高电平有效/常闭;T/T、T/F、F/T、F/F;反转 = A;上拉 = !(A ^ B)),但最终就是这样如果您想同时支持常开和常闭开关(以及高电平有效/低电平有效行为),这是不可避免的。

常闭终端不需要下拉? 第542章

感谢您分享您的想法。我会在下面回复。

我原来的签到不支持反相输入/引脚

嗯?似乎它确实反转了输入:https ://github.com/Travis-Snoozy/grbl/commit/e8345fdb88c2dae2040320a24ea3888e556c142e#diff-c81f6f990f69f2b61b8212f541336935R96

无论如何,我看到您最初的目标是支持高电平有效开关,并且我怀疑该功能在某个地方被改编和/或误认为是常闭开关支持。

我建议建议的补丁令人困惑并且可能有害,并且应该使用两个配置值来准确描述终端停止硬件:LIMIT_SWITCHES_ACTIVE_HIGH(如前)和 LIMIT_SWITCHES_NORMALLY_CLOSED(支持常闭硬件)。默认应该是两者都默认为 false,以继续支持现有硬件。

我明白你的观点,但不同意。首先,请注意,这两种方法都支持相同的四种配置,只是获取它们的设置略有不同。但是,您的建议侧重于外部连接的交换机,而不是GRBL在不同配置中的作用。这可能适用于常见配置,但当某人具有非标准配置时(例如,驱动高电平低,不需要任何上拉/下拉),弄清楚需要什么配置更加棘手。通过将配置集中在 GRBL 的作用上,可以更直接地找出需要什么(以标准配置稍微复杂一些为代价,但我认为让人们真正了解限位开关的工作原理并没有什么坏处而不是仅仅设置他们认为适用于他们情况的配置值,然后把它搞砸)。

希望这有助于理解我的观点:-)

常闭终端不需要下拉? 第542章

我原来的签到不支持反相输入/引脚

嗯?似乎它确实反转了输入:Travis-Snoozy@e8345fd#diff-c81f6f990f69f2b61b8212f541336935R96

是的,当然它会反转引脚。如果不这样做就行不通。但它也会关闭引体向上。如果不这样做就行不通。该功能既不是“支持反转引脚”,也不是“支持关闭上拉电阻”。该功能是“支持主动高限位开关”,但需要注意的是它们必须是常开或始终驱动的(可以认为是具有自身上拉电阻的常闭开关)。在当时,常开或始终驱动的模块是唯一支持的开关类型。

这就是您引用的那句话的其余部分,它所在的段落以及之后的段落都在传达的内容。

[…]我怀疑该功能在某处被改编和/或误认为是常闭开关支持。

非常非常可能是真的。

我明白你的观点,但不同意。

你当然可以这样做……

[…]当某人具有非标准配置(例如,驱动高低的开关,不需要任何上拉/下拉)时,要弄清楚需要什么配置会更加棘手[…]

[…] 以标准配置稍微复杂一些为代价 […]

…但是,在我看来,以牺牲普通情况为代价来优化奇怪的情况是愚蠢的……

[…]这两种方法都支持相同的四种配置[…]

… 尤其是当奇怪的情况可以得到同样好的支持时。

[…]我不认为让人们真正了解他们的限位开关是如何工作的,而不是仅仅设置他们认为适用于他们情况的配置值[…]

在所有情况下,您都需要在配置 GRBL 之前知道您的硬件是什么。

通过将配置集中在 GRBL 的功能上,可以更直接地确定需要什么 […]

然而,通过描述 GRBL 的胆量而不是设置要使用的硬件类型来描述正在发生的事情,除了了解硬件的工作原理之外,您还需要了解 GRBL 的胆量是如何工作的。

现在,说了这么多,当我真正提出问题时:

  • 我的开关是高电平有效吗?
  • 我的开关是否依赖其他东西来拉高其输出?

对于熟悉的人来说,它们在配置方面并非不合理。一定:

  • 我的开关是高电平有效吗?
  • 我的开关是常闭的吗?

对于 n00b 来说,即使不是更难回答也同样困难。因此,我必须扭转我之前的立场,承认这是正确的选择,尽管我们在指导原则上存在分歧。:)

但是,高电平有效开关的默认设置仍应禁用上拉。如果明确要求该配置,则仅应为高电平有效开关打开上拉电阻。例如:

#if (DEFAULT_INVERT_LIMIT_PINS == 0)
#define ENABLE_LIMIT_PULLUPS
#endif

#ifdef DISABLE_LIMIT_PULLPS
#ifdef ENABLE_LIMIT_PULLUPS
#undef ENABLE_LIMIT_PULLPS
#endif
#endif

使用禁用覆盖启用(在您既不需要反转也不需要上拉的情况下),并允许合理的默认设置。另外请记住,如果您将上拉启用/禁用作为构建的一部分(而不是运行时),GRBL 将不支持在不进行重建的情况下交换具有不同上拉要求的模块。如果将其合并为一个完整的运行时行为系统,或者作为一个完全静态的编译时特性,这似乎是最合理的;把它分开似乎……没用。

无论如何,在这一点上,我可能已经提出了超过 2.00 美元的意见。:P

常闭终端不需要下拉? 第542章

但是,高电平有效开关的默认设置仍应禁用上拉。如果明确要求该配置,则仅应为高电平有效开关打开上拉电阻。例如:

我明白你的意思,但是根据你的建议,将默认值设置为反转也会禁用上拉,但是将默认值设置为反转然后在运行时启用反转不会禁用上拉,这对我来说似乎更令人困惑。

如果将其合并为一个完整的运行时行为系统,或者作为一个完全静态的编译时特性,这似乎是最合理的;把它分开似乎……没用。

我最初建议在运行时有两种配置,但@chamnit 不喜欢有太多选项@skrutt 建议在 compiletime 禁用 pullup。假设在很多情况下不需要禁用上拉,这对我来说是有意义的——您可以仅通过反转设置 AFAICS 来支持 NC 和 NO 开关。

常闭终端不需要下拉? 第542章

到目前为止,基于我的 PR 的提交已被合并@chamnit(虽然概括了一点,也适用于探针和控制引脚,很好!)。但是,我确实有一些关于限制引脚的进一步评论和建议。其中一些可能会引起他们自己的问题,但现在我将在这里将它们组合在一起。

  1. 代码现在包含此注释,关于DISABLE_*_PIN_PULL_UP
    宏:

    // The following options disable the internal pull-up resistors,
    // sets the pins to a normal-low operation, and switches much be
    // now connect to Vcc instead of ground. This also flips the
    // meaning of the invert pin Grbl setting, where an inverted
    // setting now means the user should connect a normal-open switch
    // and vice versa.
    

    在我第一次阅读时,我感到困惑,因为反转
    设置的含义根本没有改变 – 禁用反转时,开关为
    低电平有效,启用反转时为高电平有效。

    然而,当我仔细观察时,我想这个想法是,
    上拉,非倒置意味着 NO 开关,倒置意味着
    NC,而下拉,非倒置意味着 NC 开关,倒置
    意味着 NO 打开开关,所以反转设置在这个
    意义上是翻转的。

    不过,这起初让我感到困惑,所以也许这个评论需要
    改进?如果有帮助,我可以提出一个改进的版本吗?

  2. 似乎用于软件去抖动的代码具有
    反转引脚翻转的含义。查看代码,当未
    反转时,它会检查是否有任何引脚读数为,然后触发
    警报。因此,这意味着限制引脚为高电平有效,尽管其
    目的是让默认的非反相状态为低电平有效。

    我可以提供一个 PR 来解决这个问题吗?

  3. 我之前报告过有一些杂散的限制针触发器。我
    进一步调查并发现这些随机发生,但
    在打开或关闭附近的工业真空吸尘器时,
    或者在运行我的磨机并且磨头接触
    我正在铣削的 PCB 的铜时(我在想铜充当
    主轴产生的噪声的天线)。

    记住一个评论@langwadt上面关于内部
    上拉的大小,我添加了外部 1K 上拉,甚至一个 1uF 电容
    接地,形成一个低通滤波器。这有助于降低
    真空吸尘器的噪音,但似乎几乎不会影响我的主轴
    和 PCB 的噪音。我不是这方面的专家,但我在想
    不知何故在滤波器之后拾取了噪音,或者滤波器
    离输入引脚太远(我只是将滤波器连接到
    第二个限位开关引脚,也许在
    GRBL 屏蔽 PCB 上安装滤波器会有所帮助)。

    进一步的调查表明,即使 PCINT 中断
    触发,引脚在引脚处理程序中始终读取为非活动状态。更重要的是,如果我写一个只 在无限循环中直接
    检查引脚状态的小草图(没有中断处理程序),引脚总是读取为非活动状态。我认为这意味着 PCINT 触发非常敏感(IIRC 它也是异步的,因此非常 短的脉冲可以触发它),但是实际的引脚读取是 引脚状态的更好指示。

    我通过简单地读取
    PCINT 处理程序中的限制引脚来修复这里的问题 – 如果没有激活任何引脚,则
    无需执行任何操作即可返回。这解决了我所有的噪音问题,到目前为止,
    我还没有遇到任何意外警报的问题。此外,
    在我的测试中按下限位开关时总是会触发警报,
    即使我只是非常短暂地触摸它。

    将其添加到主代码中似乎合理吗?如果这以某种方式
    给人们带来了问题,我们可以添加一个编译时
    SENSITIVE_LIMIT_PINS宏或其他东西来启用原始的
    过敏行为吗?

常闭终端不需要下拉? 第542章

@matthijskooijman: 首先感谢您提出这个问题并帮助提出解决方案。

  1. 你的评估是正确的。当然这有点令人困惑,但我认为这最适合解释如何为 Grbl 正确连接开关的好 wiki 页面。我与一位电气工程师朋友交谈,我们讨论了引脚配置的可能性以及潜在的接线方式。一般而言,您永远不需要使用 DISABLE_PULLUPS,因为内部上拉电阻做得很好。如果你这样做,你需要在你自己的下拉列表中连接。对于大多数人来说,这是他们不需要采取的额外步骤。
  2. 我在 v1.0 中删除了硬件去抖动代码。它不是很有用。如果您有一个嘈杂的开关,那将无济于事。您确实应该具有良好的信号调理能力,以首先防止噪声。
  3. 早些时候,我在争论是否检查 ISR 内部的极限状态。如果 ISR 引脚更改触发并且开关弹起,则 ISR 在检查引脚状态时可能会读取错误。为了消除这种可能性,我决定不在那里做。这一点尤为重要,因为无论如何此 ISR 都是硬限制的主要内容。无论如何,如果引脚更改 ISR 非常敏感,则良好的信号调理是更好的解决方案。
常闭终端不需要下拉? 第542章
  1. 你的评估是正确的。当然这有点令人困惑,但我认为这最适合解释如何为 Grbl 正确连接开关的好 wiki 页面。我与一位电气工程师朋友交谈,我们讨论了引脚配置的可能性以及潜在的接线方式。一般而言,您永远不需要使用 DISABLE_PULLUPS,因为内部上拉电阻做得很好。如果你这样做,你需要在你自己的下拉列表中连接。对于大多数人来说,这是他们不需要采取的额外步骤。

同意。

  1. 我在 v1.0 中删除了硬件去抖动代码。它不是很有用。如果您有一个嘈杂的开关,那将无济于事。您确实应该具有良好的信号调理能力,以首先防止噪声。

我认为你的意思是软件去抖动。如果它要被移除,我们就不要再碰它了。

  1. 早些时候,我在争论是否检查 ISR 内部的极限状态。如果 ISR 引脚更改触发并且开关弹起,则 ISR 在检查引脚状态时可能会读取错误。为了消除这种可能性,我决定不在那里做。这一点尤为重要,因为无论如何此 ISR 都是硬限制的主要内容。无论如何,如果引脚更改 ISR 非常敏感,则良好的信号调理是更好的解决方案。

嗯,我实际上弹跳应该不会在这里造成问题。让我们探讨一下会发生什么(我假设这里是默认的低电平有效设置)。乍一看,一个似乎会引起问题的情况是当按下开关时,导致高到低的转换,触发中断。现在,发生了一些弹跳,就在 ISR 读取行时,行再次读取高,使 ISR 认为根本没有按下按钮。

这似乎是个问题,其实不是:如果行读为高,但按钮真的被按下,它不能保持高,所以会引起至少一个高到低的转换,从而触发一秒钟的中断时间。最终,中断将触发并将该行读取为低电平,从而触发警报。

由于清除中断标志发生在 ISR 执行开始时,因此在 ISR 执行期间发生的任何转换都会导致标志被设置并再次触发 ISR。这意味着这里没有竞争条件(例如,在读取高输入之后,但在再次启用中断触发之前,不可能发生从高到低的转换)。

不过,我明白你关于信号调理的观点,我确实更喜欢在硬件中正确修复这个问题。但是,有两个问题:

  • 我正在使用 protoneer 的 grblshield,它没有任何过滤。我可以添加一些外部组件,但结果不会那么好和健壮。
  • 我尝试添加一个外部低通滤波器(一个相当大的滤波器 – 1kOhm + 1uF),但实际上并没有帮助。我刚刚意识到,也许添加一个与我的开关串联的电阻器也可能会有所帮助,因为我的电流滤波器只有一个 1k 电阻器连接到 VCC。这应该会减慢由打开我的 NC 开关引起的从低到高的转换,但我想当干扰实际上将开关线驱动到高电平时,它并没有真正的帮助,将电流直接流入电容充电。

您在限位开关上使用什么样的信号调理?

常闭终端不需要下拉? 第542章

多想一下串联电阻的事情,不确定这是否真的有帮助 – 空闲时已经有 5V/1k = 5mA 的电流在运行,我认为这意味着任何干扰都应该首先反转 5mA,然后才能真正开始充电电容器,虽然我不完全确定…

常闭终端不需要下拉? 第542章

根据这篇文章,串联电阻器似乎实际上很有用。

无论如何,一些谷歌搜索表明有很多人对限位开关、屏蔽、过滤等有疑问,所以对于我在此之上添加的额外噪音,我深表歉意。现在,假设我将在硬件过滤方面多花点时间 – 请随意忽略我在该领域的问题。

但是,如果您可以查看我关于在软件中修复此问题的分析,那就太好了 – 我认为读取 ISR 中的引脚实际上可能会大大减少开箱即用的人的噪音问题,并且 AFAICS 它不应该引起警报被错过。它可能并不能完全解决所有噪音问题,但如果它将无效触发器从每秒几次减少到每年几次,或者类似的事情,这是一个很大的胜利?

常闭终端不需要下拉? 第542章

关于去抖开关的详尽论文:http ://www.eng.utah.edu/~cs5780/debouncing.pdf

它详细描述了 2 个电阻和 1 个电容方法的理论以及软件去抖动技术。

格里特

常闭终端不需要下拉? 第542章

@gerritv,谢谢你的链接,好好读。然而,这侧重于去抖动开关,这与过滤噪声相似但不完全相同。

至于硬件解决方案,我怀疑是接地问题。逻辑接地和 USB 接地已经在 Arduino 上连接在一起,grbl 屏蔽连接在步进接地中。我发现与电网的安全接地(实际接地)相比,产生的接地显示出 50Hz 的纹波(10-15Vpp)。我使用的步进电源是浮动的,USB 接地来自笔记本电脑。将我笔记本电脑的电源连接到将纹波降低到 < 1Vpp,将步进电源接地连接到安全接地完全消除了纹波。这些都没有解决我的干扰问题。

我还尝试添加一个与我的开关串联的电阻器(尽可能靠近 Arduino 输入引脚),但没有帮助。我自己尝试了一个 100 欧姆电阻,以及一个 1k 外部上拉电阻和 1uF 接地电容。这应该真的过滤掉任何短脉冲,但显然没有。

我仍然不明白为什么硬件方法不起作用,但软件方法仍然按预期工作,所以让我们考虑用软件解决这个问题?

常闭终端不需要下拉? 第542章

@matthijskooijman: grbl 不可能对所有人和所有事情都有一个通用的解决方案。我必须选择可以保证在硬限制下停止的东西。除非您可以保证检查 ISR 内的引脚状态不会错过正确的读数,否则我们可以进一步讨论这个问题。但是,我会说你不能,特别是有其他 ISR,每个都有自己的执行优先级,同时运行。因为您的问题是噪音,而不是弹跳开关,所以我建议您尝试确定导致噪音的组件并从您的设置中消除。

常闭终端不需要下拉? 第542章

@chamnit, 感谢您的答复。我认为我提出的解决方案永远不会错过实际事件,请参阅上面的分析。我相信它会起作用,但是,我不能保证——如果硬件的行为与我想象的不同,事情可能会以意想不到的方式表现。

我理解您的担忧,并同意默认设置应保持不变。但是,我希望使用运行时或编译时选项将其添加到代码中。这可以接受吗?我怀疑这也可能对其他人有益——它可能不会是所有干扰问题的一站式解决方案,但它为工具箱增加了一个工具。

我也明白修复噪音本身会更好,但到目前为止我所有的尝试都没有成功。由于软件解决方案似乎彻底解决了问题,我倾向于不花更多的调试时间,而是开始构建东西:-)

常闭终端不需要下拉? 第542章

@matthijskooijman: 我不同意。我认为您的代码添加建议是针对您的系统特定问题的补丁。(我有几个 CNC,没有一个像你一直在处理的问题。)我宁愿让用户正确使用已经存在的东西,也不愿错误地尝试所有这些“附加工具”并指责 Grbl 不起作用。

电噪声不是 Grbl 问题。这是一个电气问题,应该这样处理。

常闭终端不需要下拉? 第542章

我会怀疑其他地方的问题..你用什么样的驱动程序与protoner shield一起使用?a4988 还是 drv8825?

常闭终端不需要下拉? 第542章

@chamnit, 我想你是对的。我现在将软件更改保留为本地解决方法,但我将继续寻找潜在的问题。

我们还在我们的实验室中建造了一个更大的 CNC 铣床,两天前我们发现我们在大型机器的终端挡块上存在相同(或至少相似)的噪音问题。电缆运行时间更长,主轴也更大,因此使用测试草图我计算出每秒多达 20,000 个无法解释的中断。这让我可以确认软件解决方案不是实际解决方案:在 ISR 内部,我仍然每秒读取几次错误的引脚值。我认为这意味着中断和读取引脚之间的区别不是灵敏度问题,而是时间问题。干扰足够强,可以在中断和输入逻辑上读到一样高的值,但干扰尖峰发生的可能性恰好在正确的时钟边沿非常小。这意味着软件方法实际上并没有解决问题,它只是降低了它发生的可能性(这是进一步寻找硬件解决方案的另一个论据)。

@xP373Rx,在小工厂,我使用的是 Polulu 模块,我认为它们是 4983(旧类型)。

常闭终端不需要下拉? 第542章

在逻辑迹线附近运行的快速变化的高电流(例如在质子屏蔽上)基本上是在寻求干扰。特别是如果您使用的是高阻抗电路,例如由 2k 电阻拉高的正常操作。我相信它在 arduino 上的 2k .. 驱动器也可能对 5v 电路产生噪声,因为在质子器上屏蔽 arduino 必须为驱动器逻辑端供电..

我正在使用 drv8825 。从来没有这个问题。这些驱动器的不同之处在于它们从电机电源为逻辑端供电。我还使用了另一个屏蔽,其中高电流走线与逻辑侧完全分开。我不知道 GND 如何在 drv8825 芯片内部连接到 VMOT GND,但逻辑 GND 引脚和 VMOT GND 引脚之间可能存在某种安全电路/滤波器。

但是从我的角度来看,您应该弄清楚如何摆脱噪音..在软件方面处理它没有意义。

常闭终端不需要下拉? 第542章

我相信它在 arduino 上的 2k ..

328(Arduino Uno)甚至是 20-50k

我确实尝试添加 1k pullup 和 1uF cap,但没有任何运气。我怀疑将它们粘在屏蔽板上的排针上可能会使它们离输入引脚太远并且太开放。将它们焊接到盾牌上可能会有所改善,但我必须重新设计盾牌。

至于步进电机电源的泄漏,我想即使在禁用步进电机的情况下,我也能够触发问题,甚至可能在步进电机电源关闭的情况下,对我的主轴产生干扰。不过,我必须仔细检查一下。

我想我也应该改进布线。我现在使用的是单双绞线,可能使用一些屏蔽电缆会有所改善。AFAIU 我应该确保将屏蔽连接到 Arduino 一侧的(Arduino)接地,但在另一端断开连接,以防止返回电流使用屏蔽?我没有合适的机箱接地来连接屏蔽,我的机器有一个木制外壳:-)

常闭终端不需要下拉? 第542章

好吧,我做了我能做的最糟糕的事情,并将开关置于正常模式下短路到地,并将 grbl 重新编程为在引脚反转时上拉。它工作正常,你的阻抗小于 1 欧姆。但为了安全起见,你可以添加电阻以防止引脚磨损 470Ω 或 1k 以防止引脚意外切换到输出模式时磨损。

常闭终端不需要下拉? 第542章

@matthijskooijman
制作适当的去抖/滤波电路需要 2 个电阻器和一个电容器。上限可能为 0.1uf。http://www.eng.utah.edu/~cs5780/debouncing.pdf的第 12 页提供了详细信息和数学。
如果您的电机有刷子,则每个都需要用盖子过滤。如果您有继电器,请使用二极管和盖子来防止尖峰。

格里特

常闭终端不需要下拉? 第542章

您可能遇到接地回路问题。

我也遇到了偶尔触发硬限制的问题,并且重置/中止引脚似乎被无故触发。我在运行 LinuxCNC 时从未遇到过这种情况,但是在将调试信息添加到 Grbl 后,它确实指向了电气问题。

当我切换到 Grbl 时,我也切换到一台新的笔记本电脑来控制它,这台新笔记本电脑的电源上有一个三孔插头,有效地关闭了接地回路。拔下笔记本电脑的电源也解决了电气问题。可能有一天必须找到更好的解决方法,但现在我只需将笔记本电脑的电源插入未接地的插座……

常闭终端不需要下拉? 第542章

@poelstra,我考虑过这个选项,但是当我的笔记本电脑没有插入电源并使用电池运行时,我也遇到了问题。我尝试了各种接地方式(通过我的笔记本电脑电源接地,通过步进电源接地,两者都或都不),但对我的问题没有影响……

@xP373Rx私下联系了我,提供了一些关于尝试和衡量的建议。当我做这些时我会报告,但我已经有一段时间没有靠近机器了:-)

无论如何,谢谢大家的建议!

常闭终端不需要下拉? 第542章
喜欢 (0)

您必须 登录 才能发表评论!