注释
进行以下更改也可以解决此问题。 |
@usbcnc:我只会做一个以上的检查来计算 |
@usbcnc: 没关系。这打破了 Bresenham 算法。你的方法没问题。 |
谢谢所有人,我已经更改了我的代码 -> 如果未启用 ADAPTIVE_MULTI_AXIS_STEP_SMOOTHING 并且 GRBL 发布到 ARM(定时器预分频器是 16 位),丢失的步骤已经解决。现在,AMASS Vs Not AMASS。什么是更好的 ? |
@usbcnc:我又看了 Bresenham 算法一些。你是对的,这里有一个错误。不确定它是何时添加的。我认为这是自 v0.9 发布或更早版本以来。然而,它在正常情况下不应该发生,这可能是它从未被报道过的原因。只有当你移动得非常慢,加速度非常低,并且 AMASS 被禁用时,它可能会锁定。如果启用 AMASS,它应该更罕见或不可能,因为 step_event_count 已经扩大。 我需要仔细看看步进数据是如何处理的,如果将 step[idx] 值加倍会破坏其他东西。我确实同意这样做的正确方法,但您不需要将 step_event_count 加倍。除法操作可以从步进 ISR 中移除。 无论如何,很好的收获。仅供参考,禁用 AMASS 将不再是 ARM 版本的选项,因为有更高分辨率的计时器可用。 |
@chamnit,就我而言,我并没有做得非常慢。只有一步的片段才会显示问题。 |
@usbcnc: 我没有说没有问题或我不会修复它。我说这个问题从来没有提过,因为应该是极少的。主要是因为默认情况下启用了 AMASS,并且由于 AMASS 的工作方式,这个错误在很大程度上没有浮出水面。 我检查了步进器代码,改变步数和 step_event_count 应该没有问题。以下是我要进行的更改。您可以应用这些更改并进行测试吗?对于两者,AMASS 启用和禁用,因为它确保两者都是固定的。 第 347 行:
第 635 行:
第 641 行:
|
@usbcnc: 哎呀。犯了一个错误。您最初提出的更改应该是正确的。只需进行此更改以确保 AMASS 也应用此修复程序。 第 641-642 行:
|
@chamnit. 禁用 AMASS 时存在初始错误。与进给速度或加速度无关。 要更改第 641-642 行,它适用于启用 AMASS。(我们需要这样做吗?它已经按比例放大了)。 我 但是我修改了这些行并且仍然有效,我更喜欢这些行。你怎么看? 原始代码是 counter_ 值从 1 到 st.exec_block->step_event_count。 在某些情况下它肯定会改变步骤,但我倾向于相信带有 = 的步骤是另一种选择。你怎么认为? |
@usbcnc: 现在想想。你是对的。它与进给或加速没有任何关系。仅当 g 代码块命令仅移动一步且禁用 AMASS 时才会发生这种情况,这仅适用于需要移动速度低于 1 毫米/分钟的机器。所以,这比我原先想象的还要罕见。我将其归类为非问题并关闭它。 我仍然会在禁用 AMASS 的情况下应用您的修复程序。启用 AMASS 后,我将进行编译时检查而不是修复,以防止 AMASS 级别为零。当它为零时,它会出现同样的问题。 |
我已经尝试了下面的 g-code(8.nc),这个 Y 轴不会回到 0(400steps/mm)。然后我将代码简化为 test.nc。最后我发现如果段只有一个步骤,那么该步骤就不会执行,这会导致步进器和规划器不同步。
这就是为什么
st_prep_block->step_event_count = pl_block->step_event_count;
这里st_prep_block->step_event_count等于1,
st.counter_x = st.counter_y = st.counter_z = (st.exec_block->step_event_count >> 1);
会将 st.counter_x ,st.counter_y,st.counter_z 全部设为 0。
由于只有一步
if (st.counter_y > st.exec_block->step_event_count) {
st.step_outbits |= (1<<Y_STEP_BIT);
st.counter_y -= st.exec_block->step_event_count;
如果 (st.exec_block->direction_bits & (1<<Y_DIRECTION_BIT)) { sys_position[Y_AXIS]–; }
else { sys_position[Y_AXIS]++; }
}
不会变为真,该步骤将被跳过。
我从
if (st.counter_y > st.exec_block->step_event_count) {
更改为
if (st.counter_y >= st.exec_block->step_event_count) {
问题解决了,但是我不确定这是否是正确的方法。
我尝试将 st.exec_block->step_event_count 加倍,以便每个都为偶数,但这不起作用。
对此,Sonny 可能有更好的解决方案。这个问题也存在于 0.9 代码中。
测试.zip 8.zip