注释
“motion_control.c”中的注释表明它可以添加到
|
@ashelly:plan_buffer_line() 的目的是与系统的其余部分隔离,以便它可以保持独立。这就是为什么在 mc_line() 区域中提到反冲补偿的主要原因。跟踪你需要的东西很简单。 backlash comp 上有许多已关闭的问题线程。请在那里查看更多信息。简而言之,它在我的优先级列表中并不高,我们在 Uno 上也没有太多空间来做复杂的事情。 |
肯定 uno 是内存有限的!我相信我已经阅读了所有试图解决我的问题的反冲/ grbl 相关线程。 |
@austinblanco:我会说大多数 CNC 切割系统都有齿隙,但不是全部。Grbl 及其衍生产品的大多数用户都使用皮带驱动系统。这实际上没有反冲,但以轴刚度为代价。您不能对这些进行太多的侧面加载,但它们非常适合 ShapeOko、3d 打印机和激光/等离子切割机等业余爱好者工厂。我确实有一个 Sherline 磨机,并且必须将消隙螺母保持得很紧。但是,我的轴上的齿隙小于 0.001″,但我的扭矩裕度略有牺牲。 |
感谢您的快速回复!是的,我机器上的 acme 螺纹杆有很多作用,我的目的是将其垫片调整到一个可容忍的水平 – 我知道我可以选择典型的选项并将运动控制转换为滚珠丝杠设置,但我试图让我的蛋糕也吃 – 手动机器,顶部有 CNC 操作 我想我已经读了足够多的书,确信第一要务应该是解决机械反弹问题,看看这对我有什么好处。我有一台车床,所以我可以转动一些精确的垫片来解决梯形螺钉间隙 – 至少现在应该提供一个有用的系统 我确实了解功能蔓延和资源限制,并想对代码的当前状态表示非常感谢,用大约 200 美元的设备移动大型工厂真是太棒了,虽然不是完美的,但嘿,这比转动手轮要好目前! 如果您对 GRBL 控制器的当前设置感兴趣,请注意您可以听到跳过的步骤,这已经得到解决,并且电机现在已经完全安装以及 Y 轴解决方案…… |
感谢您的推荐!我确实下载并尝试了这个脚本,但由于某种原因它没有咀嚼我的 Gcode 文件 – 嗯,也许我应该针对这个问题,因为如果我能让它工作它应该可以解决问题。好决定。 附带说明 – 我拆掉了磨机并拧紧了驱动器,并且能够将背隙降低到大约 0.020″。 |
ashelly – 感谢您实际实施它的指导。我为大学项目做了类似的事情。我在该代码中也有一个自动反冲识别逻辑。算法如下:
我是这个社区的新手。谁能帮我在 GRBL 中实现这个算法?我想自己做,但我还处于学习阶段,还没有完全掌握整个代码流程。 |
这对我的限位开关 2016-02-12 13:13 GMT-03:00 abhijithcr notifications@github.com:
|
然后尝试光学限位开关 |
您不需要在 GRBL 上实现它,归位后您可以 2016-02-12 18:42 GMT+00:00 abhijithcr notifications@github.com:
|
大家好, |
@bjao1– 我已经成功地编写了一个 g 代码修饰符(迎合直线操作,最重要的是;弧操作(G2 和 G3) – 我有一个小错误,很快就会解决。我需要更多的 G 代码来正确测试它。(到目前为止,我的反弹从 0.35mm 下降到小于 0.01mm 理想情况下,它将被添加到 GRBL 中——最近几天我一直在尝试熟悉代码。我有一些想法如何在 GRBL 中实现它——但仍在努力。 如果有人将此添加到代码库中-请您分享一下吗? |
我已将旧版本添加到 stepper.c 中。stepper.c 保存使用的方向引脚的本地副本,如果新计算的 dir 引脚不同,则基于 xor,它会将额外的所需反冲步数(在步进器启用时计算)添加到需要执行的步数中。由于该版本适用于 6-11 Axis ,因此 step 和 dirs 已经分离,并且始终使用完整端口固定分配,如果需要更多端口,则端口拆分为 bit0-5 和 bit6-10 。xz=bit0-2 uw=bit3-5 。在 6 轴上,ac 与 uw 相同,如果启用了更多轴,则 ae 为 bit6-10,例如 backlash[AXIS_X] 为 20,即预先计算的间隙值。如果方向改变,该值将被复制到 blash[AXIS_X] 并进一步添加到所需值的步骤。if(blash[AXIS_X]) blsah[AXIS_X]–; 否则 code_to_update_system_position(); 它可能不适合 coreXY 或者可能是,但必须对其进行审查以确保它适合。当我在轴上循环,或者使用大宏来做轴代码时,代码不是那么可读,如果你告诉我基本代码库,我可以插入那个代码。2017-12-04 13:34 GMT+01:00,雅克 <notifications@github.com>:
|
@cri-s– 惊人的! 我正在使用最新的 v1.1f (2017-08-01) 版本 我正在考虑仅在 X 和 Y 中进行反冲,并将其改变方向时的步数存储在 $ 变量中 – 但也可以硬编码。 如果您更改该 stepper.c 或只是告诉我您做了哪些更改,那么我可以查看它们并将它们添加到我的版本中:) 雅克 |
正如我为 0.9 实现的那样,1.1 有点不同,我至少需要进行一个模拟。并且只有在周末之后才能做到,在我忙碌而无法做到之前。2017-12-04 16:14 GMT+01:00 雅克 <notifications@github.com>:
|
我也对齿隙补偿感兴趣,愿意在我的 CNC 铣床上测试/调试代码,@cri-s/@jacquesbotha. |
我病了,所以我对这个模组没有明确的想法。从 0.9 到 1.1 有一些变化。正如我所看到的,它应该在 plan_buffer_line() 中实现,添加类似于 steps[idx] 的 ignore[idx] 变量。如果进行了 step,并且 ignore 不为零,则不应进行全局位置更新。这个变量应该如何命名?,反冲?.ignore_steps ?唯一的问题是探测,在探测过程中,如果应施加反向间隙,则应始终驱动该反向间隙。还有其他的难点吗?2017-12-14 22:26 GMT+01:00,hahnpv <notifications@github.com>:
|
恕我直言,强烈反对应该== #steps。这样,我们将其保留在 uController/电机空间中,而不是在机器空间上校准运动。 |
@austinblanco以 mm 或 um 为单位输入反向间隙是有意义的,然后根据该值计算步数并在脉冲 STEP/DIR 的代码中处理它。这样我们就不应该丢失任何关于位置的信息。 |
@cri-s您可以在某处上传您的反向间隙补偿代码吗? |
我在修改后的源上使用它,6轴…… 我现在已经从源代码中提取它并将其添加到普通的 0.9j grbl 中。我已将变量插入设置,但未导入设置集和报告代码,我对其进行了一些更改,可能您使用了不同的代码库(gnea)。进入设置,间隙是内部步数,而不是毫米。backlash_N 为负齿隙,backlash_P 为正齿隙。如果您需要该代码进行设置,请告诉我您打算使用的代码库。它并不完美,对我来说已经足够了。例如,如果使用“%”命令或重置控制器停止和移除运动,则反向间隙处于未定义状态,在其他特定条件下也是如此。在正常使用情况下,它适用于我。这个想法是:计划器将反向间隙步骤添加到计划步骤中,步进器忽略用于更新位置计数器的反向间隙步骤。因为我不使用 AMASS,所以反冲对 amass 来说是错误的。再次告诉我分支,我将其插入。下面是 diff: 常见子目录:grbl-master/grbl/cpu_map 和 grbl/cpu_map 常见子目录:grbl-master/grbl/defaults 和 grbl/defaults 仅在 grbl 中:diff 常见子目录:grbl-master/grbl/examples 和 grbl /examples — grbl-master/grbl/motion_control.c +++ grbl/motion_control.c @@ -349,6 +349,10 @@主轴停止();冷却剂停止();+ 计划同步位置();+ gc_sync_position(); + + // 仅当处于任何运动状态时才终止步进器,即循环、主动保持或归位。// 注意:如果步进器通过步进空闲延迟设置保持启用,这也通过完全避免 go_idle 调用来保持步进器的启用,除非运动状态是 — grbl-master/grbl/planner.c +++ grbl/planner.c @@ -241,7 +241,9 @@ 返回(假);} +uint8_t 方向位;// todo + /* 向缓冲区添加一个新的线性运动。target[N_AXIS] 是有符号的绝对目标位置,以毫米为单位。进给率指定运动的速度。如果进给速率反转,则进给速率被视为“频率”,并将在 1/feed_rate 分钟内完成操作。@@ -281,14 +283,17 @@ block->steps[B_MOTOR] = labs((target_steps[X_AXIS]-pl.position[X_AXIS]) – (target_steps[Y_AXIS]-pl.position[Y_AXIS])) ; #endif – for (idx=0; idx<N_AXIS; idx++) { + for (idx=0; idx<N_AXIS; idx++) { uint8_t bl /* for backlash */; // 以绝对步数计算目标位置,每个轴的步数,并确定最大步数事件。// 此外,计算移动和准备单位矢量计算的各个轴距离。// 注意:根据转换后的步长值计算真实距离。+ bl= get_direction_pin_mask(idx); #ifdef COREXY if ( !(idx == A_MOTOR) && !(idx == B_MOTOR) ) { target_steps[idx] = lround(target[idx]*settings.steps_per_mm[idx]); block->steps[idx] = labs(target_steps[idx]-pl.position[idx]); + if ((bl^direction_bits)&bl) + block->steps[idx]+=(delta_mm<0)?settings.backlash_N[idx]:settings.backlash_P[idx]; // 反向间隙加法 } block->step_event_count = max(block->step_event_count, block->steps[idx]); if (idx == A_MOTOR) { @@ -301,13 +306, 15 @@ #else target_steps[idx] = lround(target[idx]*settings.steps_per_mm[idx]); block->steps[idx] = labs(target_steps[idx]-pl.position[idx]); – block->step_event_count = max(block->step_event_count, block->steps[idx]); delta_mm = (target_steps[idx] – pl.position[idx])/settings.steps_per_mm[idx]; + if (delta_mm < 0 ) { uint8_t t; 块->direction_bits |= bl; } + if ((bl^direction_bits)&bl) + block->steps[idx]+=(delta_mm<0)?settings.backlash_N[idx]:settings.backlash_P[idx]; // 反向间隙加法 + block->step_event_count = max(block->step_event_count, block->steps[idx]); #endif unit_vec[idx] = delta_mm; // 存储单位向量分子。分母稍后计算。// 设置方向位。位启用总是意味着方向是负的。- if (delta_mm < 0 ) { block->direction_bits |= get_direction_pin_mask(idx); } // 通过欧几里得范数增量计算总移动距离。首先添加每个术语的平方。块->毫米 += delta_mm*delta_mm; — grbl-master/grbl/planner.h +++ grbl/planner.h @@ -38,6 +38,7 @@ // bresenham 算法用于跟踪线的字段 // 注意:由步进算法以正确执行该块。不要更改这些值。uint8_t 方向位;// 为该块设置的方向位(参考 config.h 中的 *_DIRECTION_BIT) + uint8_t direction_old; // 为该块设置的方向位(参考 config.h 中的 *_DIRECTION_BIT) uint32_t steps[N_AXIS]; // 沿每个轴的步数 uint32_t step_event_count;
|
@cri-s哦,我已经失去了希望你能回答并终于让它工作的希望。但无论如何,谢谢:) 我会研究你的实施,也许会改进我的。 |
@Harvie实际上,我很高兴已经在 1.1f ( https://github.com/mkaluza/grbl-Mega/commits/edge ) 上的 RAMPS+Mega 上使用它。配置和你想象的完全一样。还有一些其他功能(扩展的 g2/3 语法、倾斜校正、相对 u、v、w 坐标),但我不确定其中有多少被推送。 移植到 Uno 正在进行中,但由于我还没有任何机器,所以速度有点慢。但我最终会做到的。它可能不会与上游合并,因为作者反对它,而 Uno 的资源非常有限,几乎已经全部使用。上面的代码不是很干净(并且二进制文件没有更新,所以你需要编译它),因为我认为它只适合我。但如果需要,我会清理它并发布更新版本。 |
有一些原因让我认为这可能会被合并: 1.) 很多人要求这个 @chamnit你怎么看?您是否愿意将其合并到 1.1,以防它在默认情况下被禁用 |
还有一些其他的,这让我觉得它可能不会:)
不相关 – 他原则上不同意它,并说其他软件应该照顾它。虽然我不同意他的论点(因此我提出了我的分叉),但这是他的项目,他可以随心所欲。无论如何 – 如果他改变主意,我会让代码尽可能地合并
我不知道它是什么以及如何使用它,但可能没关系 – Uno 太小了,AVR 有点慢 – Arduino Due 是解决问题的方法所有当前的资源问题。 话虽如此 – 我对原始代码进行了一些优化,以减少代码大小,因此最终带有反冲和偏斜补偿的代码比原始代码占用更少的空间(尽管内存成本很小)
同意 |
@mkaluza– 首先 – 很棒的工作! 将您的 grbl-Mega 前叉装载到新的 Arduino Mega 2560 Pro Mini 上。 我完全同意这是特定于机器的,并且应该是控制机器的软件的一部分! 我的部分工作流程是通过我创建的 gcode 修改器运行它,唯一的问题是,我可以看到反冲随着时间的推移而增加,这意味着我必须继续修改 gcode,并保留几个版本,也意味着我的 gcode 赢了不能在其他机器上运行… 到目前为止有一个奇怪的问题(我有一个解决方法),否则一切都很好。 感谢代码!!! |
有任何关于Uno港口的消息吗?周末我的第一个 GRBL 系统刚刚启动并运行,但我的铣床有一些间隙,机器补偿需要拆下大约 200 磅的铸铁才能得到它。我很乐意帮助测试或其他什么,我只是在这些东西上编码还不够好。另外,为什么要重新发明轮子,对吧?:) 感谢您的所有努力! |
@brianthornock – 你需要使用Uno吗? 我几乎一无所有地得到了一个 Arduino Mega 2560 Pro Mini,而且@mkaluza的代码在这方面效果很好! |
@jacquesbotha, 因为我是从一台并口 PC 搬来的,所以我的控制箱也是并口的。我买了一块 DB25 转 Arduino uno 转接板,但没有适用于 mega 或 mega pro mini 的。我想我可以设计和制造一个,我只是希望有不需要我购买或设计任何额外硬件的代码。 |
@jacquesbotha– 如果您能指出我的引脚映射,那就太好了!我最终可能会布置一个简单的电路板,只是因为我喜欢一切都干净整洁! |
肯定瘦@brianthornock – 我会在周末抽出一些时间为你拍些照片和做一些别针布局。 |
好的,引脚布局按照 Wiki 遵循 Arduino Mega:https ://github.com/gnea/grbl-Mega/wiki/Connecting-Grbl-Mega 所以一切都正确,应该是: DB25 |
奥斯汀布兰科 评论 on 9 Apr 2014
我很好奇是否有人可以指出如何在主构建或 /edge 分支中引入反向间隙补偿。我已经使用一些 3D 打印齿轮和 NEMA 19 步进器将旧圆柱铣刀转换为 CNC,但机器上的 ACME 螺钉永远不会调整到 0 背隙,因此我必须在轴的控制中引入背隙补偿,而不是试图机械地消除它。我正在考虑是否在自定义 gcode 编辑器中执行此操作(即在 CAM 中生成,然后运行转换脚本)但这似乎是一个补丁,而传统系统(LinuxCNC、Mach3 等)直接在机器配置设置中处理反冲. 无论如何,如果我能获得一些关于它应该在当前构建中的位置的输入,我愿意编写反冲补偿代码。任何建议将不胜感激!