Grbl代码分析 motion.c

本文详细介绍了Grbl运动控制代码的`mc_line`和`mc_arc`函数,这两个函数分别处理线性和弧线运动。`mc_line`用于执行线性运动,考虑了软限位、实时命令处理和激光模式。`mc_arc`则用于生成逼近圆弧的线性段,涉及弧线的矢量变换和误差控制。通过对这两个函数的理解,可以深入掌握Grbl的运动规划原理。
摘要由CSDN通过智能技术生成

2.7.2 motion.c

/*以绝对毫米坐标执行线性运动。进给率以毫米/秒为单位,除非invert_feed_rate为true。那么feed_rate意味着运动应该在(1分钟)/feed_rate时间内完成。注意:这是通往grbl规划器的主要通道。所有的直线运动,包括弧形线段,在传递给规划器之前必须通过这个例程。*/

void mc_line(float *target, plan_line_data_t *pl_data)

{

  // 如果软限位触发.

  if (bit_istrue(settings.flags,BITFLAG_SOFT_LIMIT_ENABLE)) {

    // 如果系统状态是不是JOG模式,检查目标点是否触发软限位

    if (sys.state != STATE_JOG) { limits_soft_check(target); }

  }

  // 如果检查模式下,直接返回。

  if (sys.state == STATE_CHECK_MODE) { return; }

  do {

    protocol_execute_realtime(); // 处理实时命令

    if (sys.abort) { return; }

    if ( plan_check_full_buffer() ) { protocol_auto_cycle_start(); } // 如果指令块缓存器

//(block_buffer)满,循环运行启动,等待指令块缓存器有空间

    else { break; }//否则跳出

  } while (1);

  // 规划和排队指令进入规划缓冲区。

  if (plan_buffer_line(target, pl_data) == PLAN_EMPTY_BLOCK) {//如果是一个空运动指令

    if (bit_istrue(settings.flags,BITFLAG_LASER_MODE)) {//如果是激光模式

      /* 需要缓冲区同步。 如果启用,立即通过PWM设置主轴运行状态,包括方向和主轴转速。同步后由spindle_sync()调用。*/

    if (pl_data->condition & PL_COND_FLAG_SPINDLE_CW) {//主轴顺时针旋转

        spindle_sync(PL_COND_FLAG_SPINDLE_CW, pl_data->spindle_speed);

      }

    }

  }

}

/*position=起点xyz,target =终点xyz,offset =从起点xyz开始的偏移量,axis_X定义了工具空间中的圆平面,axis_linear是螺旋运动的方向,radius==圆半径,isclockwise为布尔值。用于矢量变换方向。弧线是通过生成大量微小的线性段来近似的。每个线段的弦向公差在settings.arc_tolerance中配置,它被定义为当端点都位于圆上时,线段到圆的最大法线距离。把圆弧分割成直线*/.

void mc_arc(float *target, plan_line_data_t *pl_data, float *position, float *offset, float radius,

  uint8_t axis_0, uint8_t axis_1, uint8_t axis_linear, uint8_t is_clockwise_arc)

{

  float center_axis0 = position[axis_0] + offset[axis_0];  //圆心点X

  float center_axis1 = position[axis_1] + offset[axis_1]; //圆心点X

  float r_axis0 = -offset[axis_0];  // 起点相对圆心位置X

  float r_axis1 = -offset[axis_1]; // 起点相对圆心位置Y

  float rt_axis0 = target[axis_0] - center_axis0; // 终点相对圆心位置X

  float rt_axis1 = target[axis_1] - center_axis1; // 终点相对圆心位置Y

  float angular_travel = atan2(r_axis0*rt_axis1-r_axis1*rt_axis0, r_axis0*rt_axis0+r_axis1*rt_axis1);//计算起点相对圆心的矢量和终点相对圆心的矢量得夹角

  if (is_clockwise_arc) { //如是G02(顺时针运动),且大于负角度设置误差,置顺时针角度

    if (angular_travel >= -ARC_ANGULAR_TRAVEL_EPSI

ain()主函数首先执行下面初始化函数 serial_init(); // Setup serial baud rate and interrupts settings_init(); // Load Grbl settings from EEPROM stepper_init(); // 配置步进方向和中断定时器 system_init(); // 配置引脚分配别针和pin-change中断 memset(&sys, 0, sizeof(system_t)); // Clear all system variables sys.abort = true; // Set abort to complete initialization 完成初始化设置中止 sei(); // Enable interrupts #ifdef HOMING_INIT_LOCK //宏运算(settings.flags & (1 << 4)) != 0结果flags等于执行sys.state = STATE_ALARM //系统状态赋值为报警状态 if (bit_istrue(settings.flags,BITFLAG_HOMING_ENABLE)) { sys.state = STATE_ALARM; } #endif _____________________________________________________________________________________________________________________________________ 接下来是一些主要初始化循环 for(;;) { serial_reset_read_buffer(); // Clear serial read buffer gc_init(); // Set g-code parser to default state spindle_init(); //主轴 coolant_init(); //冷却液 limits_init(); //极限开关 probe_init(); //探测 plan_reset(); // Clear block buffer and planner variables 清晰块缓冲区和规划师变量 st_reset(); // Clear stepper subsystem variables. 清晰的步进系统变量。 // Sync cleared gcode and planner positions to current system position. 同步清除gcode和策划师职位当前系统位置。 plan_sync_position(); gc_sync_position(); // Reset system variables. sys.abort = false; //系统中止标志 sys_rt_exec_state = 0; //系统执行标志状态变量状态位清零。 sys_rt_exec_alarm = 0; //系统执行警报标志变量清零。 sys.suspend = false; //系统暂停标志位,取消,和安全的门。 sys.soft_limit = false; //系统限制标志状态机复位。(布尔) protocol_main_loop(); //主协议循环 } // ___________________________________________________________________________
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值