Contact me: hankecnc@gmail.com

为CNC模型修改grbl #1611

推推 grbl 3年前 (2023-01-24) 255次浏览

关闭
SanZamoyski 打开了这个问题 2020 年 3 月 2 日 · 7条评论
关闭

为CNC模型修改grbl#1611

SanZamoyski 打开了这个问题 2020 年 3 月 2 日 · 7条评论

注释

为CNC模型修改grbl #1611

你好,你好,

我知道这不是问题,但我需要您的帮助,因为我正在尝试解决此问题两天…
我的目标是将主轴行为更改为:

  • 当它打开时 – PWM 50%,
  • 关闭时 – 低
  • 当开启且 Z 工作位置 < 0 时,PWM 100%。

我在代码的许多地方尝试了很多变量,但没有运气。我在第 ~522 行(在 float wco[] 下)以 report.c 文件结束 – 它是在打印之前计算 WPos/MPos 的地方。

我这里有这个(脏)代码:

    if(current_position[Z_AXIS] - gc_state.coord_system[Z_AXIS]+gc_state.coord_offset[Z_AXIS] <= 0){
        pinMode(13, 1);
        digitalWrite(13, 1);
    }else{
        pinMode(13, 1);
        digitalWrite(13, 0);
    }

我试过了

sys_position[Z_AXIS] - (gc_state.coord_system[Z_AXIS] + gc_state.coord_offset[Z_AXIS] + gc_state.tool_length_offset )< 0
gc_state.position[Z_AXIS] - gc_state.coord_offset[Z_AXIS]
gc_state.coord_system[idx]+gc_state.coord_offset[idx]

以及我想到的所有分析代码的东西,但都没有奏效。
结果是,当机器位置低于零时,LED(连接到第 13 个引脚)亮起,而不是工作位置。

请,请,请帮助我。我只需要知道这里有没有我可以使用的变量,如果没有——如何计算它。

我很确定 sys_position 是机器位置,所以 [Z_AXIS] 应该给我 UGS 在机器位置下显示的内容。WCO 是 MPos 和 WPos 之间的区别,所以加/减应该给我正确的值。但它不是以某种方式……

最好的祝福…

为CNC模型修改grbl #1611
whitetd 评论了 2020 年 3 月 3 日 通过电子邮件
为CNC模型修改grbl #1611

不幸的是,这不是一种选择。我忘了提到我正在尝试为学生的 CNC 模型修改 grbl。X 和 Y 轴由常规步进器制成。Z 轴和主轴被激光取代——这就是为什么我需要对过零和零下使用不同的 PWM。学生将不得不手动编程动作(课程侧重于 G 代码,而不是机器/程序)。这就是为什么后处理选项不是一个选项。

我已经修改了 GRBL,将 h 桥用于步进器(第三个步进器可能会牺牲一些引脚但没有微步进)所以我永远不会怀疑这个目标对我来说很难实现,但它是……

我知道 report.c 不是添加此功能的正确位置。一开始我试图在步进运动函数的末尾添加它,但是已经提到了问题所以我把它移到这里以确保这与错误选择的变量有关。它是。

为CNC模型修改grbl #1611

你能不能在步进中断的顶部添加几行,根据最后一个方向是向上还是向下将 pwm 设置为 50/100%?

为CNC模型修改grbl #1611
作者
圣扎莫伊斯基 评论了 2020 年 3 月 3 日  

这几乎是一个很好的解决方案,但不幸的是,如果“主轴”在材料上方,它会错误地将 PWM 设置为 100%。请记住,它会被对 G 代码几乎一无所知的人使用,所以这种情况很有可能发生。
这真的是非常复杂的问题,我们需要寻找解决方法吗?

此外,还有来自 grbl 的 WPos 输出(在 UGS 中设置详细并更改一些设置)。这对我来说是一个解决方法。但要达到“正常”应该不难……

为CNC模型修改grbl #1611

我猜是这样的,

float zpos;
zpos = sys.position[Z_AXIS]/settings.steps_per_mm[Z_AXIS];
zpos -= gc_state.coord_system[Z_AXIS]+gc_state.coord_offset[Z_AXIS];
zpos -= gc_state.tool_length_offset;

为CNC模型修改grbl #1611

我相信我尝试过这样的事情:
if(sys_position[Z_AXIS] - (gc_state.coord_system[Z_AXIS] + gc_state.coord_offset[Z_AXIS] + gc_state.tool_length_offset ) < 0){ ... }
基于:

  float wco[N_AXIS];
  if (bit_isfalse(settings.status_report_mask,BITFLAG_RT_STATUS_POSITION_TYPE) ||
      (sys.report_wco_counter == 0) ) {
    for (idx=0; idx< N_AXIS; idx++) {
      // Apply work coordinate offsets and tool length offset to current position.
      wco[idx] = gc_state.coord_system[idx]+gc_state.coord_offset[idx];
      if (idx == TOOL_LENGTH_OFFSET_AXIS) { wco[idx] += gc_state.tool_length_offset; }
      if (bit_isfalse(settings.status_report_mask,BITFLAG_RT_STATUS_POSITION_TYPE)) {
        print_position[idx] -= wco[idx];
      }
    }
  }

其中 print_position 由 system_convert_array_steps_to_mpos() sys_position 复制和转换。也就是说,深入挖掘,steps[idx]/settings.steps_per_mm[idx].
然后在这里使用 print_position:

static void report_util_axis_values(float *axis_value) {
  uint8_t idx;
  for (idx=0; idx<N_AXIS; idx++) {
    printFloat_CoordValue(axis_value[idx]);
    if (idx < (N_AXIS-1)) { serial_write(','); }
  }
}

但是我错过了对mm的计算。你是对的。谢谢你指出这一点。我还认为我不需要重新计算为毫米/英寸或任何东西。我明天会检查您的解决方案。谢谢你。

为CNC模型修改grbl #1611

谢谢@langwadt我找到了解决问题的方法。在文件 report.c 中,我把//Report machine position这段代码放在前面:

float zpos;
 zpos = sys_position[Z_AXIS]/settings.steps_per_mm[Z_AXIS] - wco[Z_AXIS];
 //zpos -= gc_state.coord_system[Z_AXIS]+gc_state.coord_offset[Z_AXIS];
 //zpos -= gc_state.tool_length_offset;
  
 if(spindle_get_state() != SPINDLE_STATE_DISABLE){
   if(zpos <= 0){
     SPINDLE_OCR_REGISTER = 255;
   }else{
     SPINDLE_OCR_REGISTER = 32;
   }
 }
   

还评论了//SPINDLE_OCR_REGISTER = pwm_value; // Set PWM output level。在 spindle_control.c 中。

它现在似乎工作得很好,没有任何解决方法;)
可能有更好的地方可以放置这段代码,但我不确定是否需要它。

喜欢 (0)