|
@@ -389,7 +389,7 @@ static const char *injected_commands_P = NULL;
|
389
|
389
|
* Feed rates are often configured with mm/m
|
390
|
390
|
* but the planner and stepper like mm/s units.
|
391
|
391
|
*/
|
392
|
|
-float constexpr homing_feedrate_mm_s[] = {
|
|
392
|
+static const float homing_feedrate_mm_s[] PROGMEM = {
|
393
|
393
|
#if ENABLED(DELTA)
|
394
|
394
|
MMM_TO_MMS(HOMING_FEEDRATE_Z), MMM_TO_MMS(HOMING_FEEDRATE_Z),
|
395
|
395
|
#else
|
|
@@ -397,6 +397,8 @@ float constexpr homing_feedrate_mm_s[] = {
|
397
|
397
|
#endif
|
398
|
398
|
MMM_TO_MMS(HOMING_FEEDRATE_Z), 0
|
399
|
399
|
};
|
|
400
|
+FORCE_INLINE float homing_feedrate(const AxisEnum a) { return pgm_read_float(&homing_feedrate_mm_s[a]); }
|
|
401
|
+
|
400
|
402
|
float feedrate_mm_s = MMM_TO_MMS(1500.0);
|
401
|
403
|
static float saved_feedrate_mm_s;
|
402
|
404
|
int feedrate_percentage = 100, saved_feedrate_percentage,
|
|
@@ -1504,7 +1506,7 @@ inline float get_homing_bump_feedrate(const AxisEnum axis) {
|
1504
|
1506
|
SERIAL_ECHO_START;
|
1505
|
1507
|
SERIAL_ECHOLNPGM("Warning: Homing Bump Divisor < 1");
|
1506
|
1508
|
}
|
1507
|
|
- return homing_feedrate_mm_s[axis] / hbd;
|
|
1509
|
+ return homing_feedrate(axis) / hbd;
|
1508
|
1510
|
}
|
1509
|
1511
|
|
1510
|
1512
|
/**
|
|
@@ -1631,7 +1633,7 @@ void do_blocking_move_to(const float &x, const float &y, const float &z, const f
|
1631
|
1633
|
// If Z needs to raise, do it before moving XY
|
1632
|
1634
|
if (destination[Z_AXIS] < z) {
|
1633
|
1635
|
destination[Z_AXIS] = z;
|
1634
|
|
- prepare_uninterpolated_move_to_destination(fr_mm_s ? fr_mm_s : homing_feedrate_mm_s[Z_AXIS]);
|
|
1636
|
+ prepare_uninterpolated_move_to_destination(fr_mm_s ? fr_mm_s : homing_feedrate(Z_AXIS));
|
1635
|
1637
|
}
|
1636
|
1638
|
|
1637
|
1639
|
destination[X_AXIS] = x;
|
|
@@ -1641,14 +1643,14 @@ void do_blocking_move_to(const float &x, const float &y, const float &z, const f
|
1641
|
1643
|
// If Z needs to lower, do it after moving XY
|
1642
|
1644
|
if (destination[Z_AXIS] > z) {
|
1643
|
1645
|
destination[Z_AXIS] = z;
|
1644
|
|
- prepare_uninterpolated_move_to_destination(fr_mm_s ? fr_mm_s : homing_feedrate_mm_s[Z_AXIS]);
|
|
1646
|
+ prepare_uninterpolated_move_to_destination(fr_mm_s ? fr_mm_s : homing_feedrate(Z_AXIS));
|
1645
|
1647
|
}
|
1646
|
1648
|
|
1647
|
1649
|
#else
|
1648
|
1650
|
|
1649
|
1651
|
// If Z needs to raise, do it before moving XY
|
1650
|
1652
|
if (current_position[Z_AXIS] < z) {
|
1651
|
|
- feedrate_mm_s = fr_mm_s ? fr_mm_s : homing_feedrate_mm_s[Z_AXIS];
|
|
1653
|
+ feedrate_mm_s = fr_mm_s ? fr_mm_s : homing_feedrate(Z_AXIS);
|
1652
|
1654
|
current_position[Z_AXIS] = z;
|
1653
|
1655
|
line_to_current_position();
|
1654
|
1656
|
}
|
|
@@ -1660,7 +1662,7 @@ void do_blocking_move_to(const float &x, const float &y, const float &z, const f
|
1660
|
1662
|
|
1661
|
1663
|
// If Z needs to lower, do it after moving XY
|
1662
|
1664
|
if (current_position[Z_AXIS] > z) {
|
1663
|
|
- feedrate_mm_s = fr_mm_s ? fr_mm_s : homing_feedrate_mm_s[Z_AXIS];
|
|
1665
|
+ feedrate_mm_s = fr_mm_s ? fr_mm_s : homing_feedrate(Z_AXIS);
|
1664
|
1666
|
current_position[Z_AXIS] = z;
|
1665
|
1667
|
line_to_current_position();
|
1666
|
1668
|
}
|
|
@@ -2778,11 +2780,11 @@ static void do_homing_move(const AxisEnum axis, const float distance, const floa
|
2778
|
2780
|
SYNC_PLAN_POSITION_KINEMATIC();
|
2779
|
2781
|
current_position[axis] = distance;
|
2780
|
2782
|
inverse_kinematics(current_position);
|
2781
|
|
- planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], current_position[E_AXIS], fr_mm_s ? fr_mm_s : homing_feedrate_mm_s[axis], active_extruder);
|
|
2783
|
+ planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], current_position[E_AXIS], fr_mm_s ? fr_mm_s : homing_feedrate(axis), active_extruder);
|
2782
|
2784
|
#else
|
2783
|
2785
|
sync_plan_position();
|
2784
|
2786
|
current_position[axis] = distance;
|
2785
|
|
- planner.buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], fr_mm_s ? fr_mm_s : homing_feedrate_mm_s[axis], active_extruder);
|
|
2787
|
+ planner.buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], fr_mm_s ? fr_mm_s : homing_feedrate(axis), active_extruder);
|
2786
|
2788
|
#endif
|
2787
|
2789
|
|
2788
|
2790
|
stepper.synchronize();
|
|
@@ -3397,7 +3399,7 @@ inline void gcode_G4() {
|
3397
|
3399
|
const float mlx = max_length(X_AXIS),
|
3398
|
3400
|
mly = max_length(Y_AXIS),
|
3399
|
3401
|
mlratio = mlx > mly ? mly / mlx : mlx / mly,
|
3400
|
|
- fr_mm_s = min(homing_feedrate_mm_s[X_AXIS], homing_feedrate_mm_s[Y_AXIS]) * sqrt(sq(mlratio) + 1.0);
|
|
3402
|
+ fr_mm_s = min(homing_feedrate(X_AXIS), homing_feedrate(Y_AXIS)) * sqrt(sq(mlratio) + 1.0);
|
3401
|
3403
|
|
3402
|
3404
|
do_blocking_move_to_xy(1.5 * mlx * x_axis_home_dir, 1.5 * mly * home_dir(Y_AXIS), fr_mm_s);
|
3403
|
3405
|
endstops.hit_on_purpose(); // clear endstop hit flags
|
|
@@ -3540,7 +3542,7 @@ inline void gcode_G4() {
|
3540
|
3542
|
|
3541
|
3543
|
// Move all carriages together linearly until an endstop is hit.
|
3542
|
3544
|
current_position[X_AXIS] = current_position[Y_AXIS] = current_position[Z_AXIS] = (Z_MAX_LENGTH + 10);
|
3543
|
|
- feedrate_mm_s = homing_feedrate_mm_s[X_AXIS];
|
|
3545
|
+ feedrate_mm_s = homing_feedrate(X_AXIS);
|
3544
|
3546
|
line_to_current_position();
|
3545
|
3547
|
stepper.synchronize();
|
3546
|
3548
|
endstops.hit_on_purpose(); // clear endstop hit flags
|
|
@@ -3853,7 +3855,7 @@ void home_all_axes() { gcode_G28(true); }
|
3853
|
3855
|
const float old_feedrate_mm_s = feedrate_mm_s;
|
3854
|
3856
|
|
3855
|
3857
|
#if MANUAL_PROBE_HEIGHT > 0
|
3856
|
|
- feedrate_mm_s = homing_feedrate_mm_s[Z_AXIS];
|
|
3858
|
+ feedrate_mm_s = homing_feedrate(Z_AXIS);
|
3857
|
3859
|
current_position[Z_AXIS] = LOGICAL_Z_POSITION(Z_MIN_POS) + MANUAL_PROBE_HEIGHT;
|
3858
|
3860
|
line_to_current_position();
|
3859
|
3861
|
#endif
|
|
@@ -3864,7 +3866,7 @@ void home_all_axes() { gcode_G28(true); }
|
3864
|
3866
|
line_to_current_position();
|
3865
|
3867
|
|
3866
|
3868
|
#if MANUAL_PROBE_HEIGHT > 0
|
3867
|
|
- feedrate_mm_s = homing_feedrate_mm_s[Z_AXIS];
|
|
3869
|
+ feedrate_mm_s = homing_feedrate(Z_AXIS);
|
3868
|
3870
|
current_position[Z_AXIS] = LOGICAL_Z_POSITION(Z_MIN_POS); // just slightly over the bed
|
3869
|
3871
|
line_to_current_position();
|
3870
|
3872
|
#endif
|
|
@@ -3900,7 +3902,7 @@ void home_all_axes() { gcode_G28(true); }
|
3900
|
3902
|
#if ENABLED(MESH_G28_REST_ORIGIN)
|
3901
|
3903
|
current_position[Z_AXIS] = LOGICAL_Z_POSITION(Z_MIN_POS);
|
3902
|
3904
|
set_destination_to_current();
|
3903
|
|
- line_to_destination(homing_feedrate_mm_s[Z_AXIS]);
|
|
3905
|
+ line_to_destination(homing_feedrate(Z_AXIS));
|
3904
|
3906
|
stepper.synchronize();
|
3905
|
3907
|
#endif
|
3906
|
3908
|
}
|
|
@@ -5502,7 +5504,7 @@ void home_all_axes() { gcode_G28(true); }
|
5502
|
5504
|
// If any axis has enough movement, do the move
|
5503
|
5505
|
LOOP_XYZ(i)
|
5504
|
5506
|
if (fabs(destination[i] - current_position[i]) >= G38_MINIMUM_MOVE) {
|
5505
|
|
- if (!parser.seen('F')) feedrate_mm_s = homing_feedrate_mm_s[i];
|
|
5507
|
+ if (!parser.seen('F')) feedrate_mm_s = homing_feedrate(i);
|
5506
|
5508
|
// If G38.2 fails throw an error
|
5507
|
5509
|
if (!G38_run_probe() && is_38_2) {
|
5508
|
5510
|
SERIAL_ERROR_START;
|