Contact me: hankecnc@gmail.com

任意引脚分配 #290

推推 grbl 3年前 (2023-01-21) 135次浏览

关闭
rustyoz 打开了这个问题 2013 年 11 月 25 日 · 5 条评论
关闭

任意引脚分配#290

rustyoz 打开了这个问题 2013 年 11 月 25 日 · 5 条评论

注释

任意引脚分配 #290
贡献者

只是想知道人们对允许任意引脚分配有什么想法?

一些工作由@festlvhttps://github.com/festlv/grbl-sanguinololu上为此添加了一些支持。

我也成功地将这把叉子用于 sanguinololu 板。

在我看来,虽然@festlv为 pinmaps 和一些步进代码增加了一些复杂性,它仍然非常有效并且不会妨碍 grbl 在任何现有 grbl 特定板上的使用。

任意引脚分配 #290
成员

@bungao:您链接到的分支确实为步进器 ISR 增加了一些复杂性和 CPU 开销。一般来说,最好使步进器 ISR 尽可能小,尤其是对于高步进率机器。这并不是说我们没有 CPU 开销来执行此操作,而是基于我们是否绝对需要它而不是确保最佳性能来做出决定。保持引脚映射方法是否存在特定问题?意思是我们强制步进和方向引脚必须在同一个端口上,就像限制和引出线控制一样?

任意引脚分配 #290

@chamnit- 首先,我必须说我很欣赏 grbl 步进代码的优雅。

我发现现有方法存在以下缺点:

  • 它仅限于三个轴。当然,使用另一个 step/dir 字节,您将能够完成相同的操作。
  • 与 grbl 的现成硬件相比,RepRaps 的现有硬件非常便宜(可能是因为需求和中国晶圆厂)。RepRap 硬件通常采用具有更大闪存和 RAM 大小的 MCU (Atmega1284p/2560)。

您已经提到了我的方法的明显缺点 – 最大步进速率限制现在可能更低,其他一切的时钟周期更少。

然而,还有一个中间地带——抽象写入硬件端口。即有一个函数传递一个或两个位压缩字节,并让用户轻松更改每个位映射到引脚的方式。对于原生 grbl 硬件,我相信可以内联函数调用,并且不会影响性能。对于不需要如此高的步进率或想要重新使用现有硬件的用户来说,这是一个很容易改变这种行为的地方。

任意引脚分配 #290
成员

@festlv: 明白了。这不是第一次有人以某种方式请求此功能。但这是到目前为止我给每个人的一般答案:Grbl 还没有为此做好准备。主要是由于Arduino Uno的flash限制,这一直是让新用户试用的要求。另一个原因是我现在需要尽可能多的闪存空间和 CPU,以便我可以完成安装待办事项列表中的最后几个主要项目(进给率覆盖、慢跑、受保护的规划器等)

然而,好消息是我们终于达到了这一点。最新的 v0.9 开发分支(不是边缘)有一个全新的步进算法,具有覆盖保护的显着优化的规划器,以及如何编码进给率覆盖和实时实现它们的清晰路径。代码非常紧凑,但不确定它是否仍然适合。性能几乎快了一个数量级(并且通过设计高度可扩展到其他 CPU 平台)。在 UNO 上,我能够以 7500 毫米/分钟的速度通过一些异常曲线 (braid.nc),然后步进扭矩降至零并停滞。因此,性能问题可能是也可能不是您的问题。在一切都完成之前很难说。

我同意可能存在中间立场。最有可能以编译时引脚设置的形式出现,但不像 Grbl 分支中那样需要基于软件的设置变量检查。我更喜欢这个。例如,也许可以有一个简单的#define 系统可以允许这样做,同时保持 Grbl 的代码尽可能高效。我现在不知道这是什么样子,但我认为它在可能性范围内。

为了解决您的 3 轴限制问题,我也希望看到这种增加到 4+ 轴。它不太可能出现在 Arduino Uno 版本的 Grbl 上,因为我们没有引脚(但我们可以重新安排并牺牲一些)并且内存不足。还有一些其他的困难。一方面,物理规划器需要扩展以考虑其他轴。这可能很简单,也可能非常复杂,具体取决于其实施方式。非正交轴(或依赖于其他轴的运动)会产生巨大且昂贵的数学解决方案问题。这就是使高效机器人技术如此困难的原因,即铰接式手臂等。一个简单的第 4 轴工作台就可以了,因为它主要是一个独立的轴,并且只对它所在的工作台施加重量,这对它的加速度影响最小。

就我们想要扩展到 4+ 轴的可配置引脚而言,最简单的方法是将方向引脚和步进引脚分开,两者都可以存在于一个或两个端口上。我不知道 Reprap 硬件现在的状态如何,所以我也无法告诉您这是否是一个可接受的替代方案。

任意引脚分配 #290
贡献者作者

好的,所以我想到了一个编译时抽象,我得到的最接近的是方向引脚作为一个组将在同一个端口上,而步进器引脚在不同的端口上,使用大致相同的代码。否则,在我看来,进行位移位以将位从 out_bits 变量映射到其他端口的代码效率低于 forks 实现。(我也不认为 avr 处理多字节值的位移,如果我错了请纠正我。)

我确实认为将 io 抽象为函数或可能是宏会很好。对于当前的 grbl 板,它只是当前执行的内容,但对于其他板,它允许轻松重写代码以适应它们。代替使用定义的不同引脚图,板将由修改后的 io 函数文件定义,该文件将使用通用函数名称集。

任意引脚分配 #290
成员

@bungao:同意将步进销和方向销分成两个不同的掩模。我不想引入新的设置,而是想保留旧的反转掩码,但将其更新为最多 4 个轴。例如,我们将 4 LSB 设为 (x,y,z,a) 步进引脚掩码,将 4 MSB 设为相应的方向引脚掩码。在内部,我们将掩码存储为两个单独的掩码。稍后,当我们有超过 4 个轴或更多闪存可以玩时,我们可以更新设置。

我也同意可以进一步抽象步骤代码。由于我们必须确保它尽可能高效,这可能导致每个 CPU 都有专门的步骤 ISR 代码。新的 v0.9 开发分支已努力使步骤 ISR 尽可能简单/简单,因此我们可以使这种抽象更容易。不过,我会等到 v0.9 完成。

喜欢 (0)