为什么压力推进通常在固件中而不是在切片器中实现

3D打印 固件 fdm
2021-04-28 00:09:58

最近我开始研究压力推进及其工作原理,但我对它通常在哪里实施感到有些困惑。

我对 3D 打印机的想法是,它的固件相当愚蠢,只能重放 GCode,对正在打印的对象、使用的材料甚至打印机本身一无所知。

但是随着压力的推进,这一切都发生了变化,现在固件需要知道线性推进因子,该因子结合了有关使用的灯丝和灯丝路径的信息。此外,E 轴不再由 GCode 直接控制,但它的运动几乎由固件独立决定。

为什么是这样?切片机(或后处理器)是否有理由无法计算所有这些并直接将所需的挤出机轴运动存储在 GCode 中?打印机是否有切片机缺少的一些附加信息?

2个回答

此外,E 轴不再由 GCode 直接控制,但它的运动几乎由固件独立决定。

即使没有线性前进也是如此。G 代码不直接控制任何轴的运动。G 代码仅指定轴应行进的路径,而不指定与跟随该路径相关的加速度和减速度。如果您正在打印一个立方体,那么 G 代码可能会指定挤出机必须挤出一个正方形。它将指定应打印正方形的 4 边,但未指定应如何处理从一侧到另一侧的过渡。

打印机不能立即从挤压正方形的一侧过渡到挤压另一侧,因为挤压机的方向不能瞬间改变。它需要平稳减速和加速。这是由固件处理的,它将来自 G 代码的直线命令转换为挤出机的平滑加速和减速。

这正是线性前进的用武之地。它与加速和减速相关联。没有办法在 G 代码中“实现”线性前进,因为 G 代码甚至没有任何加速和减速的概念。G 代码(和切片器)不知道固件如何处理加速和减速,因此切片器不可能知道需要什么样的线性前进来匹配。

那么你可能会问:“为什么加速和减速没有在 G 代码中实现(而不是在固件中)?” 这只是一个设计选择。G 代码是一种非常简单的文件格式,它只是允许您指定直线移动命令。表示平滑的加速度曲线需要将它们分解成许多离散的小步骤,但这会大大增加文件大小。您可以建议一个更复杂的 G 代码规范,它允许更“紧凑”的加速和减速曲线表示,但随后您只是将计算转移回固件(尽管 G 代码中有更明确的规范) .

这是一个非常好的问题,它对 3D 打印机软件/固件架构提供了很多启示,在有机会写下答案之前,Tom 已经说了很多我想说的事情。基本问题是,要准确地进行压力推进(并且在不准确时不会出现严重错误的方式),您需要始终知道挤出机的实际进给率,并且在应用加速度之前无法获得配置文件,按照惯例发生在打印机固件中。

话虽如此,在切片机中进行了原始甚至有些先进的压力提升尝试。第一个似乎是“滑行”,与滑行后的额外启动一起,几乎只是“压力推进,假设进给率恒定”。如果您混合不同的挤出机进给率(不同的打印速度或线宽等),或者如果您的加速度很慢,则会出现非常错误的情况,但是如果您的加速度太快(相对于最大速度)以至于几乎是瞬时的,它可能会起作用好的。

现代 Cura 还具有流量补偿功能,类似于压力推进。它对速率敏感,因此理论上,只要加速度足够接近瞬时,它就可以在不同的线宽和打印速度下提供准确的结果。由于它是在 Marlin 添加线性推进后出现的,我从不费心去尝试使用它,所以我不能说它是否真的运行得很好。执行推进时仍然有很多微妙之处,它可能会出错,我认为您想要做一些测试用例只是为了读取 gcode 输出并评估它正在做的事情是否足够接近合理。

如果您想在切片机中进行全压推进,您需要让切片机处理加速度曲线,将线条分成小段,每个小段的标称进给率与它们应该以的速率相匹配,并且足够接近它们应该达到的速率开始,固件加速限制设置为适应变化。然后,知道实际工具头的非常好的近似值,从而了解每个段的挤出机进给率,您就会知道要应用的提前量,并且可以将其应用为上一次打印移动结束时的附加细分。然后在理论上,这一切都奏效了。但是,这会使得G-码很多大/体积更大,更苛刻的串行链路速度和微控制器与解析/规划能力跟不上。所以这几乎肯定是个坏主意。

Klipper 固件以不同方式执行此操作。它在功能更强大的计算机上运行的 Python 软件(关键路径使用一些 C)中执行 gcode 解析和规划(包括压力推进),并通过串行链路将精确生成的步进电机时序发送到操作打印机硬件的微控制器.