注释
我的第一个镜头是使用第二个定时器两次,首先是设置步进销,然后重置它们。方向仍将在第一个定时器中断中设置。但显然这需要一些仔细的额外编码和测试。在我看来,在主定时器中断中保持步进引脚的设置并在方向和步进引脚之间设置延迟不是一个选项。 |
我同意延斯。考虑到我们没有额外的计时器来轻松处理此问题,或者需要一些仔细且耗时的编码和测试,因此要使其可配置将相当困难。 但我认为有一些解决方法可能会奏效。根据步进驱动器的不同,它们中的一些只在脉冲的下降沿上步进,因此如果您将脉冲时间设置为大于您需要的 15 微秒延迟,您的步进器应该朝正确的方向移动。或者,如果您的步进器步进上升沿,您可以尝试使用“步进端口反转引脚”设置(这些反转方向和步进引脚)来反转步进器引脚。这应该会让你得到相同的结果。 试一试,让我们知道它是否有效,我们会将其作为解决方案发布在 Wiki 中。 |
反转时钟应该工作。方向和步长之间的延迟和时间步长在边缘将绑定到相同的值之前处于非活动状态,但假设它们具有相同的要求应该没问题 我使用 AVR 的次数不多,但我认为在 timer2 上使用溢出中断和比较中断应该很容易。 |
如您所知,Timer2 用于清除步进引脚。我遇到了一个问题,如果它在步进脉冲之间没有被禁用,Timer2 偶尔会在重置定时器计数器和设置步进引脚之间的时间内中断。这会导致步进脉冲被严重截断为大约 2 微秒或根本没有步进的问题。因此,让 Timer2 执行双重任务可能会导致一些问题。 |
我只是让溢出 irq 保持原样,清除步骤并禁用中断。 在timer1中,设置timer2,使比较在需要的延迟之后,溢出在延迟+步进脉冲宽度之后 |
啊。我明白你的意思了。我想这是可以做到的。溢出应为步进脉冲宽度以不改变功能,并且比较延迟必须短于步进脉冲宽度,发生在步进清除和定时器被禁用之前。 就个人而言,除非真正需要,否则我不太喜欢添加另一个中断,但这个技巧可能会在以后的其他事情中派上用场。我认为引脚反转解决方法也适用于此,而无需添加任何内容。谢谢你的主意! |
大家好! 到目前为止,我已经按照 chamnit 的建议,在两个 dir/step 引脚上测试了具有上升/下降沿的不同组合。 问题是电机确实会旋转,并且会像您预期的那样改变方向,但是如果您让电机在两个位置之间反复切换,它们会随着时间的推移开始朝一个方向偏离。 将速度和加速度更改为较低的值无济于事,只会花费更长的时间才能看到问题。 我已经使用 Mach3 完成了完全相同的测试,没有任何问题。 所以这让我得出结论,mach3 和 grbl 处理 dir/step 引脚的方式肯定有所不同。 GRBL 在 dir 引脚的状态变化与 step 引脚激活之间有 0.25 微秒的延迟。 我认为延迟不必那么长,但据我所知没有办法改变它来测试它。 我认为 langwadt 有所作为,但我还没有时间思考 GRBL 如何生成 dir/step 脉冲。 如果有人愿意,我很乐意测试任何尝试在我的装备中解决此问题的代码。 |
让我试着根据 langwadt 的建议给你写一个快速的“补丁”: ISR(TIMER2_COMPA_vect) {
STEPPING_PORT = (STEPPING_PORT & ~STEP_MASK) | out_bits;
}
并从中删除 out_bits 行 启用新中断并设置它应该触发的时间将这两行添加到 TIMSK2 |= (1<<OCIE2); // Enable Timer2 Compare Match A interrupt
OCR2A = -(((settings.dir_step_delay_microseconds-2)*TICKS_PER_MICROSECOND) >> 3); // set delay between direction pin write and step command
当然 TCNT2 = -(((settings.pulse_microseconds+settings.dir_step_delay_microseconds-2)*TICKS_PER_MICROSECOND) >> 3); // Reload timer counter
确保总延迟远低于 255/16*8=127 微秒,否则 TIMER2_COMPA_vect 可能会在定时器被禁用之前触发第二次! |
嗯,我希望您的测试不是 Grbl 固有的更深层次问题的先兆。通常方向引脚只需要几分之一微秒即可触发正确方向的步骤。我之前在我的设置上做过方向性测试,偶尔注意到一些小的漂移,但我将其归因于惯性。在我的设置中,漂移(如果存在)从来没有大到足以导致加工零件出现问题。 只是好奇,你能提供你的步进驱动器的品牌和型号吗?另外,您对电机等的一般设置是什么?我想看看数据表,看看我是否能找出 Grbl 可能遇到的任何特定于硬件的问题。 最后,倒置引脚会使事情变得更糟到底是什么意思?为何如此?它还动吗?或者漂移似乎变得更糟?需要多长时间才能看到这种漂移以及漂移多少(例如 0.1 度或整个旋转)? |
TML22 说他的驱动器是光电耦合的,所以我不会太担心 grbl 中更深层次的“问题”。我不是电子工程师,但我想光电晶体管可能会有某种抖动延迟。 |
延斯:是的。光电晶体管可能会有抖动延迟,但我想确定步进输入感应有多少以及如何不同。我这样说是因为步进输入引脚反转应该适用于我使用的 Allegro IC。 此外,现在查看 Allegro 数据表,这些数据表需要 0.2 微秒的延迟才能感测步骤的方向变化。如果 TML22 的 0.25 微秒时间测量值是正确的,则非常接近。我想知道缺乏回旋余地或缓冲区是否会导致某些步骤非常间歇地错误移动。几乎察觉不到,但足以在某些设置上引起问题。 我正在搬家(有 x3 的车间空间!),所有东西都收拾好了,但我希望我能得到示波器设置,看看我是否能测试和可视化其中的一些。 |
你好! 来自 avr 的 Step 和 dir 引脚被路由到低侧驱动器 (ULN2803A),后者又驱动步进驱动器中的每个光电耦合器。 我希望瑞典的零售商能提供一些关于使用过的驱动芯片的进一步信息。 我对“反相引脚”的意思是我将阶跃信号从高电平有效更改为低电平有效。 这实际上是用 Mach3 完成的,低电平有效设置会使电机性能更差。 很难给出漂移的任何确切细节,但我注意到的是: Jens 我将在本周末抽出时间来实施您的补丁。 |
光耦合器在一个方向上比另一个方向慢的可能性不大,如果延迟 dir-to-step 正好在边缘,这可以解释为什么它在一个方向上丢失步数 但是倒转时钟不起作用是没有意义的。如果你让延迟足够大 请记住,延迟还会设置步进引脚上的脉冲宽度,某些驱动器需要数十个 我认为在你开始发明之前你可以尝试的一个快速的事情是添加一个 delay_us(25); 设置方向销后。它应该告诉您添加延迟是否可以解决问题 (假设不会使中断太慢) |
感谢 TML22。我会查看您的 IC,看看是否能挖掘出任何东西。如果您发现有关驱动程序的更多详细信息,请告诉我们。 我同意 langwadt 的观点,即倒转时钟不起作用或导致其行为不同的原因并没有多大意义。当您更改步进输入时,您是否尝试过增加微秒步进脉冲值?这将有效地使这项工作延迟。(langwadt:我们不能在中断中使用 delay_us(),因为它正在阻塞并且还使用其中一个定时器。) 还有,你是怎么跑动作的?您是手动输入并让 Grbl 完成动作吗?或者您是从文件中流式传输动作吗?这可能很重要,因为如果队列中没有剩余的运动,Grbl 将禁用步进电机。默认情况下,它将暂停 25 微秒以锁定电机,以防止其漂移,然后禁用它们。我想知道这两种方法之间是否有区别。 最后,您是否更改了实验中的距离量?这会改变您看到的漂移量或方向吗?(编辑:已经回答了。我的错。) |
有点 OT 但是,你确定你不能在中断中使用 delay_us() 并且它使用定时器吗?它不只是围绕从定义的 CPU clk 计算的一些 nop 的繁忙等待循环吗? 繁忙的等待会在中断中浪费时间,但只要步进率不是太高,步进中断仍然可以跟上,就可以进行快速测试 |
你或许是正确的。我一直认为 delay_us() 函数使用 AVR 定时器之一,或者这可能是 Arduino IDE 执行此操作而不是 avr-gcc。无论哪种方式,它通常不应该在中断中使用,因为它是阻塞的,但对于您建议的测试,这应该没问题。 对困惑感到抱歉。当天晚些时候,精疲力尽,有一段时间没有参加比赛。 |
对 langwadt 评论的一些简短回复: 光耦合器在一个方向上比另一个方向慢的可能性不大,如果延迟 dir-to-step 正好在边缘,这可以解释为什么它在一个方向上丢失步数 “这正是我认为这里正在发生的事情。” 但是倒转时钟不起作用是没有意义的。如果你让延迟足够大 请记住,延迟还会设置步进引脚上的脉冲宽度,某些驱动器需要数十个 “我明白,我将通过在 GRBL 中反转步进引脚来重做这个测试,正如我之前提到的,我使用 Mach3 进行了这个测试,但现在意识到我在步进脉冲上使用的时间太短,这使得该测试完全无用. 我认为在你开始发明之前你可以尝试的一个快速的事情是添加一个 delay_us(25); 设置方向销后。它应该告诉您添加延迟是否可以解决问题。 “我通过使用 Mach3 进行了该测试,当在步进引脚上使用正确的时间时,它起作用了。 钱尼特: 我从文件流式传输。 我不使用 GRBL 的禁用功能,因为我的驱动程序确实有自动节电模式。 |
非常感谢更新 TML22。文件流排除了一些“到达”的东西,但有时你永远不知道编程。如果我理解正确,在 Mach3 上增加步进脉冲宽度和反相与正常操作完全相同,而且您还没有在 Grbl 上尝试过。让我们知道会发生什么。 langwadt:现在我已经睡了,你不延迟中断的原因之一是这些中断会阻止其他中断。对于步进脉冲,这不是问题,但对于串行中断,这是问题。如果我们安装此延迟,则可能会出现接收位可能丢失或传输位未按时发送的情况。 |
中断在 timer1 中断中重新启用,它可以被串行中断中断,所以这应该不是问题。 中断延迟也只是接收的问题,因为您有丢失一个字节的风险,对于传输,字节之间只会有一个短暂的延迟,这不是问题 |
好吧,只有在设置步进器位后才能启用中断,并且为了精确计时,我会保持这种状态。但由于 UART 在硬件中,接收中断最多每 1 毫秒(10 位/9600 位/秒)调用一次。所以,几十微秒的延迟应该不会有什么坏处。传输确实完全不受影响。 |
啊,谢谢你的澄清。我的印象是串行通信是可中断的,但只有从硬件到 CPU 的数据字节传输可能会被中断。我的错。我只是想说清楚,为中断添加过多的处理时间可能会产生意想不到的后果,并且可能导致比解决问题更多的问题。在这种情况下,这不应该,但这绝不应该是应该在发布中完成的事情,而只是一个测试。 TML22:你们有什么新进展吗? |
大家好! 我尝试了 langwadt 的反转步进引脚的建议以增加一些时间,因为我的步进驱动器将读取反转脉冲的上升沿。 但是,我的驱动程序似乎不喜欢阶跃输入时的正常高状态。 我还尝试在设置方向引脚后插入延迟。 直到我决定将延迟从 20us 减少到 15us,因为 delay_us(20) 导致总延迟大约 27us,这超出了需要。 我还快速尝试实施 jgeisler0303 的补丁。 |
TML22:很高兴听到反转步进器引脚有效。我假设你这次增加了步进脉冲时间来让它工作? 奇怪的是,您的电机嗡嗡声越来越大。我不确定是什么原因造成的,除非它由于某种原因使您的设置更容易受到电子噪音的影响。 延斯:你怎么看这个?很难判断这个电机嗡嗡声是否是一个孤立的问题,但是,如果不是,我仍然拒绝向核心步进模块添加另一个中断,假设添加 timer2 比较中断会增加另一层中断开销. 我担心它会影响 Grbl 可以支持的最大步进频率或其他可能有问题的东西。 我认为添加此延迟功能是个好主意,但不太倾向于使其成为标准功能,因为步进器引脚反转应该可以工作。所以我认为我们应该将其安装为针对特定用户问题的编译时选项。这应该很容易集成。 |
Chamnit:我同意你的观点,a) 仅将 nop-delay 用于测试,b) 仅在真正需要时才实施中断驱动的延迟,即作为编译时选项。 关于嗡嗡声,我不知道。我只知道那些看似漂亮干净的数字电子设备 – 在最低级别 – 也只是模拟电路,数学否定与芯片内部发生的事情相去甚远。因此,如果某些芯片开发人员想要节省一些资源,他可能会使用一些技巧来节省几个门,但无法处理更长的高状态时间。你永远不会知道。在 TML22 报告信号反转原则上确实有效之前,我认为也许方向只有在步进引脚为低电平时才会被确认……你永远不知道……所以,这个芯片的规格真的很不错。 |
AVR 真的那么强调额外的中断很重要吗?我刚刚查看了列表文件,ovf2 irq(比较 irq 中的代码应该类似)是 ~20 个周期,即使进入和退出中断所需的周期只有 ~2-3us |
不幸的是,它可能是。在 v0.6 中,G02/03 圆弧生成或具有快速、短线段的复杂曲线会导致 Grbl 阻塞,尤其是在较高的进给率下。从那时起,我们在优化加速规划器、弧线生成功能和整体内部流程方面做了很多工作,同时还增加了更多的功能和特性。现在,我们很幸运没有遇到任何重大问题,也没有任何似乎影响稳健性能的事情。如果我们添加另一个中断,这可能会在没有大量测试和验证的情况下破坏这种平衡。无论如何,如果我们有任何空闲周期,我想将这些投入到所有人的新功能中,而不是一个很好的(可能作为不受支持的编译时功能添加。) |
TML22:不确定你是否已经解决了这个问题,但我已经在今晚的“边缘”分支中向 Grbl 发布了方向针时间延迟的必要更改。要启用它,您需要下载边缘分支代码并将 STEP_PULSE_DELAY 更改为 0 以外的值(对于您的情况,大约 25 应该有效。)编译并刷新它,您应该开始了。 我已经在我的示波器上测试了代码,看起来不错。但我还没有机会设置我的工厂,因为我仍在搬入和设置过程中。如果您碰巧使用它,请告诉我它是如何工作的。 |
嗨桑尼! 我在边缘分支中找不到您的更改,并且提交历史记录没有显示任何更改? |
嗨桑尼! 我在边缘分支中找不到您的更改,并且提交历史记录没有显示任何更改? |
诡异的。Github for Mac 迫使我提交没有任何更改的文件。它正在保持向上分支同步。现在应该修好了。 |
Ok now it’s updated. |
你好!
我想知道如何在方向引脚的状态变化和步进脉冲激活之间添加延迟。
问题是我的步进驱动器是光电耦合的,在它可以处理步进脉冲之前,方向引脚上至少需要 15 微秒的稳定状态。
步进器 .c 中的当前代码只有很短的延迟。
// 在我们步进步进器之前将方向引脚设置几纳秒 (out_bits & DIRECTION_MASK);
// 然后脉冲步进引脚
STEPPING_PORT = (STEPPING_PORT & ~STEP_MASK) | 输出位;
// 问候
TML22