注释
我的第一枪是使用第二个计时器两次,首先设置步进销,然后重置它们。方向仍将在第一个定时器中断中设置。但显然这需要一些仔细的额外编码和测试。在我看来,在主定时器中断中保持步进引脚的设置,并在方向引脚和步进引脚之间有延迟,这不是一个选择。 |
我同意延斯。考虑到我们没有额外的计时器来轻松处理这个问题,或者需要一些仔细和耗时的编码和测试,所以要使这个可配置是相当困难的。 但我认为有一些工作可能会奏效。根据步进驱动器的不同,其中一些仅在脉冲的下降沿上步进,因此,如果您将脉冲时间设置为大于所需的 15 微秒延迟,则步进器应朝正确的方向移动。或者,如果您的步进器在上升沿上步进,您可以尝试使用“步进端口反转引脚”设置(这些反转方向和步进引脚)反转您的步进引脚。这应该会得到相同的结果。 试一试,让我们知道它是否有效,我们会将其作为解决方案发布在 Wiki 中。 |
倒转时钟应该可以工作。方向和步长之间的延迟和时间步长在边缘将绑定到相同值之前处于非活动状态,但假设它们具有相同的要求,应该可以 我没有太多使用 AVR,但我认为在 timer2 上同时使用溢出和比较中断应该很容易。 |
如您所知,Timer2 用于清除步进引脚。我遇到了一个问题,如果在步进脉冲之间没有禁用它,Timer2 偶尔会在重置定时器计数器和设置步进引脚之间的时间中断。这将导致阶跃脉冲被严重截断到大约 2 微秒或根本不阶跃的问题。因此,让 Timer2 拉双重任务可能会导致一些问题。 |
我只是让溢出中断保持原样,清除步骤并禁用中断。 在 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 的步进和 dir 引脚被路由到低端驱动器 (ULN2803A),该驱动器反过来驱动步进驱动器中的每个光耦合器。 我希望瑞典的零售商可以提供一些关于使用的驱动芯片的更多信息。 我对“反相引脚”的意思是我将阶跃信号从高电平有效更改为低电平有效。 这实际上是使用 Mach3 完成的,并且低电平有效设置会使电机性能更差。 很难给出漂移的任何确切细节,但我注意到的是: Jens 我会在这个周末找一些时间来实施你的补丁。 |
光耦合器在一个方向上比另一个方向慢的可能性不大,如果延迟 dir-to-step 正好在边缘,这可以解释为什么它在一个方向上丢失步骤 但是倒转时钟不起作用是没有意义的。如果你让延迟足够大 请记住,延迟也会设置步进引脚上的脉冲宽度,一些驱动器在步进上需要几十我们的脉冲 我认为在你开始发明之前你可以尝试的一件快速的事情是添加一个 delay_us(25); 设置方向引脚后。它应该告诉您添加延迟是否可以解决问题 (假设不会使中断太慢) |
谢谢TML22。我会看看你的集成电路,看看我能不能挖掘出任何东西。如果您发现有关您的驱动程序的更多详细信息,请告诉我们。 我同意 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:很高兴听到反转步进销有效。我假设您增加了步进脉冲时间以使其这次工作? 奇怪的是,您正在经历越来越多的电机嗡嗡声。我不确定是什么原因造成的,除非它使您的设置由于某种原因更容易受到电子噪声的影响。 Jens:你怎么看这个?很难判断这个电机嗡嗡声是否是一个孤立的问题,但如果不是,我仍然拒绝向核心步进模块添加另一个中断,假设添加 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 应该可以工作。)编译并刷新它,您应该可以走了。 我已经在我的示波器上测试了代码,它看起来不错。但我还没有机会设置我的工厂,因为我仍在搬入和设置的过程中。如果您碰巧使用它,请告诉我它是如何工作的。 |
嗨桑尼! 我在边缘分支中找不到您的更改,并且提交历史记录没有显示任何更改? |
嗨桑尼! 我在边缘分支中找不到您的更改,并且提交历史记录没有显示任何更改? |
诡异的。Mac 版 Github 迫使我提交没有任何更改的文件。它正在保持向上分支同步。现在应该修好了。 |
好的,现在它已更新。 |
@TML22: 这对你有什么影响?希望无线电沉默意味着一切都好。:) |
如果发布到已关闭的问题是禁止的,请原谅这个新手;我知道我参加这个特定的聚会迟到了,特别是因为已经编写了实现此功能的代码,但是我有一个想法困扰着我,我很好奇你们对此有何看法; 我知道“通常” grbl 在同一个中断中快速连续设置 dir 然后 step 信号,而边缘版本使用额外的中断来执行此操作,以便在它们之间创建延迟(如果这样编译),并且这个新中断是不可取的,因为它对 MCU 施加的额外压力。我也知道反转脉冲极性的建议解决方法,但这有其自身的一系列缺点,它并不是一个真正干净的解决方案。 所以这就是想法 – 如果 dir 引脚不会通过使用额外的中断从活动步进边沿延迟,而是由已经存在的实现步进脉冲下降沿的中断设置,该怎么办?如,给定步进的方向引脚将设置在前一个步进脉冲的下降(无效)边缘?这似乎不需要任何额外的中断。显然,在第一步脉冲之前第一次设置 dir 显然需要一次“额外”触发,但我认为这听起来还不错。我只是在这里愚蠢吗…? |
没有。你是对的。当我写最后一篇文章时,这个想法突然出现在我的脑海中。但是,我认为我们必须确保这适用于所有步进驱动器。我不确定它们是否都检测到上升沿或下降沿。 我也不喜欢添加另一个中断,尤其是在步进脉冲序列运行的高频下。这就是它是实验性的原因。我认为我们可以做的是在下降沿或上升沿为方向引脚的设置位置添加一个编译时选项。对于我认为的大多数人来说,这将是一个非常好的解决方案。如果您同意,我会在下一次推送时添加此选项。 |
很高兴你喜欢它。我的想法是,由于步进脉冲极性也是可逆的,因此将 dir 设置附加到步进脉冲的“非活动”边缘(即定时脉冲的“结束”),无论最终是实际下降沿还是上升沿将保证与任何驱动器的兼容性——无论它们需要的边沿极性如何,只要它们在定时脉冲的开始时锁存方向信号,它们都可以。 |
嗨桑尼! |
TML22 评论 on 23 May 2012
你好!
我想知道如何在方向引脚的状态变化和步进脉冲的激活之间添加延迟。
问题是我的步进驱动器是光耦合的,在它可以处理步进脉冲之前,方向引脚上需要至少 15 微秒的稳定状态。
stepper .c 中的当前代码只有很短的延迟。
// 在我们踏步前几纳秒设置方向引脚
STEPPING_PORT = (STEPPING_PORT & ~DIRECTION_MASK) | (out_bits & DIRECTION_MASK);
// 然后脉冲步进引脚
STEPPING_PORT = (STEPPING_PORT & ~STEP_MASK) | out_bits;
//
关于 TML22