开源改变世界!!

如何获得实际步数? #786

推推 grbl 2年前 (2023-01-23) 84次浏览

打开
amirm 打开了这个问题 2020 年 1 月 3 日 · 6条评论
打开

如何获得实际步数?#786

amirm 打开了这个问题 2020 年 1 月 3 日 · 6条评论

注释

如何获得实际步数? #786

这不是问题,对不起,但我不知道去哪里问 – 我没有找到 GRBL 论坛。

当 GRBL 来回移动电机时,它是否会记录给定的步数?
像“步进位置”这样的东西,当电机前进时递增,当电机后退时递减?
我可以读吗??

我想将此信息用于精确的归位程序。
运行归位循环,然后让 GRBL 来回移动一些微米,直到步数为 64 的倍数。

为什么是 64???

移动到 16 的倍数以在微步循环开始时停止。
移动到 64 (16*4) 的倍数以在步进状态 0的微步循环开始时停止。

步态??

阶跃状态 0 = 线圈 A 通电。
步骤状态 1 = 线圈 B 通电。
阶跃状态 2 = 线圈 A 通电,反向电流。
阶跃状态 3 = 线圈 B 通电,反向电流。

在 200 步/转电机上,“步进状态 0”有 50 个停止位置,每个停止位置相隔 7.2°。
“step state 1”有50个停止位置,每个停止位置相隔7.2°,距离最近的“step state 0”有1.8°。
“步进状态2”
50个停止位置,“步进状态3”50个停止位置,

谢谢

如何获得实际步数? #786

system.h中的sys_position,不知道有没有办法读取。你为什么不在归位后重置步进驱动器?这也将保证您认为的“步骤状态 0”实际上是“步骤状态 0”

如何获得实际步数? #786
作者

我为什么不重置步进驱动器……因为在大多数板上,重置信号是“全局的”,它会重置所有驱动器和 GRBL。我需要对电路板进行切割和接线以隔离复位线——然后有 3 个输出信号……并控制它们!软件更容易修改。

我挖了一点,并更改了report.c

void report_realtime_status()
{
  ...
  int32_t current_position[N_AXIS]; // Copy current state of the system position variable
  memcpy(current_position,sys.position,sizeof(sys.position));
  ...
  #ifdef REPORT_CONTROL_PIN_STATE 
    printPgmString(PSTR(",Ctl:"));
    print_uint8_base2(CONTROL_PIN & CONTROL_MASK);
  #endif

  // --- MY CODE START ------------
  printPgmString(PSTR(",STEP_COUNT:")); 
  for (idx=0; idx< N_AXIS; idx++) {
    print_uint32_base10(current_position[idx]);
    if (idx < (N_AXIS-1)) { printPgmString(PSTR(",")); }
  }
  // --- MY CODE END ------------
  
  printPgmString(PSTR(">\r\n"));
}

我一有结果就报告。可能需要一段时间…

感谢 langwadt 指路!!

如何获得实际步数? #786

对不起@amirm但我看不到该归巢有任何优势。我可能遗漏了什么。这些位置没有更多的精度和扭矩,但即使两者都有,它正在归位,工作时需要您进行改进。
当然在内部 grbl 正在计算步骤,因为它是它的工作方式。按照步骤/mm 使用。

如何获得实际步数? #786
作者

也许你是对的!可能我在追鬼……

我关心的是激光机的 Z 轴,我需要非常精确和可重复的归位才能始终获得相同的焦点。

就像我说的,还有一些测试要做,我会发布结果。到目前为止,我所做的修改已经奏效——我可以读取步数。
更重要的是,它让我有信心更改代码并编译它以满足我的需要。我会分享我的发现。

如何获得实际步数? #786
呜哇 评论了 2020 年 1 月 7 日 通过电子邮件
如何获得实际步数? #786

我报告步数如下(示例):
count=sys_position[X_AXIS]; printInteger(count);

喜欢 (0)