// 回零过程.
void limits_go_home(uint8_t cycle_mask)
{
if (sys.abort) { return; } // 是否系统中止.
// 初始化规划直线运动的数据寄存器,为回零运动准备,关闭主轴和冷却..
plan_line_data_t plan_data;
plan_line_data_t *pl_data = &plan_data;
memset(pl_data,0,sizeof(plan_line_data_t));
//设置规划器的条件,表明是系统运动,进给倍率无效
pl_data->condition = (PL_COND_FLAG_SYSTEM_MOTION|PL_COND_FLAG_NO_FEED_OVERRIDE);
#ifdef USE_LINE_NUMBERS //是否需要设置本指令行号
pl_data->line_number = HOMING_CYCLE_LINE_NUMBER;
#endif.
uint8_t n_cycle = (2*N_HOMING_LOCATE_CYCLE+1);//设置找零次数
uint8_t step_pin[N_AXIS];
#ifdef ENABLE_DUAL_AXIS //如果定义了双轴
uint8_t step_pin_dual;
uint8_t dual_axis_async_check;
int32_t dual_trigger_position;
#if (DUAL_AXIS_SELECT == X_AXIS)//如果X轴是双轴,计算回零运动失败的距离阈值
//如果两个限位在给定的失败距离内都触发表正常,否则失败,
float fail_distance = (-DUAL_AXIS_HOMING_FAIL_AXIS_LENGTH_PERCENT/100.0)*settings.max_travel[Y_AXIS];
#else//如果Y轴是双轴,计算回零运动失败的距离阈值
float fail_distance = (-DUAL_AXIS_HOMING_FAIL_AXIS_LENGTH_PERCENT/100.0)*settings.max_travel[X_AXIS];
#endif //防止回零失败距离过小或过大
fail_distance = min(fail_distance, DUAL_AXIS_HOMING_FAIL_DISTANCE_MAX);
fail_distance = max(fail_distance, DUAL_AXIS_HOMING_FAIL_DISTANCE_MIN);
int32_t dual_fail_distance = trunc(fail_distance*settings.steps_per_mm[DUAL_AXIS_SELECT]);//把距离变成步进数目
#endif
float target[N_AXIS];
float max_travel = 0.0;
uint8_t idx;
for (idx=0; idx<N_AXIS; idx++) {
// 获取对应轴步进端口的掩码
step_pin[idx] = get_step_pin_mask(idx);
#ifdef COREXY//如果是COREXY结构,设置相关掩码
if ((idx==A_MOTOR)||(idx==B_MOTOR)) { step_pin[idx] = (get_step_pin_mask(X_AXIS)|get_step_pin_mask(Y_AXIS)); }
#endif
if (bit_istrue(cycle_mask,bit(idx))) {//判断哪个轴回零,并计算回零过程可运动的最大距离
max_travel = max(max_travel,(-HOMING_AXIS_SEARCH_SCALAR)*settings.max_travel[idx]);
}
}
#ifdef ENABLE_DUAL_AXIS //定义双轴的步进输出端口
step_pin_dual = (1<<DUAL_STEP_BIT);
#endif