开源改变世界

请使用浮点数学 #57

推推 grbl 3年前 (2023-02-10) 312次浏览
关闭
BalashovK 打开了这个问题 2021 年 2 月 24 日 · 9条评论
关闭

请使用浮点数学#57

BalashovK 打开了这个问题 2021 年 2 月 24 日 · 9条评论

评论

请使用浮点数学 #57

我将 atmel328p grbl 与 CNC 一起使用,但由于它无法处理更大半径的弧,所以我遇到了硬件损坏。
他们竭尽所能——在如此有限的空间内用整数进行数学运算,这是一个工程奇迹。哪种工作但不适合与昂贵的硬件一起工作(它不能处理 G2、G3 命令的 I 和 J 中的大值并且不识别它)

您正在将 GRBL 移植到支持浮点数的 CPU。但是你仍然保留所有整数数学(在 gcode.c 中)

拜托,请重构它以使用浮点数学。无论你在哪里看到单词“尾数”——用浮点数替换它。无论您在哪里看到乘法和除法,请确保参数和结果的类型为“float”

您最终将获得工业级电路板。整数数学确实是 GRBL 的限制因素。
(328p GRBL 的另一个限制因素是 USB 通信速度慢,这使得快速激光雕刻不太可能实现,但使用带有集成 USB 的 CPU 解决了这个问题)

感谢您的伟大工程!

请使用浮点数学 #57

这是一个示例 G 代码(由 Inkscape 插件“J Tech Photonics”生成),在 G 代码查看器中看起来不错,但使 GRBL 驱动电机超出该区域的左下角:

M05 S0
G90
G21
;
G1 X-26.4249 Y49.0743 F2400
G3 X-26.4352 Y49.0642 I33030.0384 J-33718.6545 F2400
;
M05 S0
G1 F2400
G1 X0 Y0

请使用浮点数学 #57

很明显,对于 33030.0384,您超出了int
的范围。 快速解决方法是将所有内容更改为 longint(32 位芯片无论如何都会使用 int)。

原则上是一个全局搜索和替换操作,但它需要一些人工干预来防止意外匹配,因为“int”太短了,可能会出现在类型声明以外的地方。

由于舍入误差和比较,迁移到 fp 可能需要更多考虑。

请使用浮点数学 #57

J-Dunn,没那么简单。
G3 X-26.4352 Y49.0642 I20194.000 J0.0000 F2400 – 工作
G3 X-26.4352 Y49.0642 I20195.000 J0.0000 F2400 – 触发错误。
所以是的,它溢出了,但不完全在 32767 边界处。

与此同时,我为自己写了一个转换器,它已经被 cutter 保存了几次,免于进一步损坏。当 I 和 J 很大时,我只是用 G1 替换 G2 和 G3。

我不确定为什么从整数数学切换到浮点数学会导致舍入错误。

请使用浮点数学 #57

溢出可能发生在计算过程中,而不是 gcode 的最终数字。为什么你的数字这么大?
那是在你里面吗?

请使用浮点数学 #57

J-Dunn,是的,我猜,计算路径时发生了溢出。
现在,为什么数字这么大。我正在用激光切割 Inkscape 中的一些设计并使用插件“J Tech Photonics”生成 g 代码
也许,有些曲线几乎是直线。G 代码支持的唯一曲线是圆弧。因此,在从贝泽曲线到圆弧的转换过程中,插件生成了一个具有如此巨大半径的圆弧。遗憾的是,该插件没有最大曲线半径的设置。这是我所知道的故障最少的 Inkscape g 代码插件。

请使用浮点数学 #57

是的,我很快就放弃了 Inkscape for Gcode。

请使用浮点数学 #57

好吧,Inkscape 仍然非常强大,我在我的项目中经常使用它。如果没有别的办法,它可以导出为矢量图形格式,如 dfx。

请使用浮点数学 #57

这不是 gcode/mantissa 的问题。正确读取所有值。问题发生在弧形计算中,例如@J-Dunn 说。但是半径为 33 米的圆弧并不是现实生活中的场景