New Feature: Z_DUAL_ENDSTOPS
Z_DUAL_ENDSTOPS is a feature to enable the use of 2 endstops for both Z steppers - Let's call them Z stepper and Z2 stepper. That way the machine is capable to align the bed during home, since both Z steppers are homed. There is also an implementation of M666 (software endstops adjustment) to this feature. After Z homing, this adjustment is applied to just one of the steppers in order to align the bed. One just need to home the Z axis and measure the distance difference between both Z axis and apply the math: Z adjust = Z - Z2. If the Z stepper axis is closer to the bed, the measure Z > Z2 (yes, it is.. think about it) and the Z adjust would be positive. Play a little bit with small adjustments (0.5mm) and check the behaviour. The M119 (endstops report) will start reporting the Z2 Endstop as well.
This commit is contained in:
parent
512a0056a9
commit
0ce3576685
|
@ -67,6 +67,9 @@
|
||||||
*
|
*
|
||||||
* filament_size (x4)
|
* filament_size (x4)
|
||||||
*
|
*
|
||||||
|
* Z_DUAL_ENDSTOPS
|
||||||
|
* z_endstop_adj
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
#include "Marlin.h"
|
#include "Marlin.h"
|
||||||
#include "language.h"
|
#include "language.h"
|
||||||
|
@ -165,6 +168,10 @@ void Config_StoreSettings() {
|
||||||
EEPROM_WRITE_VAR(i, delta_radius); // 1 float
|
EEPROM_WRITE_VAR(i, delta_radius); // 1 float
|
||||||
EEPROM_WRITE_VAR(i, delta_diagonal_rod); // 1 float
|
EEPROM_WRITE_VAR(i, delta_diagonal_rod); // 1 float
|
||||||
EEPROM_WRITE_VAR(i, delta_segments_per_second); // 1 float
|
EEPROM_WRITE_VAR(i, delta_segments_per_second); // 1 float
|
||||||
|
#elif defined(Z_DUAL_ENDSTOPS)
|
||||||
|
EEPROM_WRITE_VAR(i, z_endstop_adj); // 1 floats
|
||||||
|
dummy = 0.0f;
|
||||||
|
for (int q=5; q--;) EEPROM_WRITE_VAR(i, dummy);
|
||||||
#else
|
#else
|
||||||
dummy = 0.0f;
|
dummy = 0.0f;
|
||||||
for (int q=6; q--;) EEPROM_WRITE_VAR(i, dummy);
|
for (int q=6; q--;) EEPROM_WRITE_VAR(i, dummy);
|
||||||
|
@ -326,7 +333,12 @@ void Config_RetrieveSettings() {
|
||||||
EEPROM_READ_VAR(i, delta_radius); // 1 float
|
EEPROM_READ_VAR(i, delta_radius); // 1 float
|
||||||
EEPROM_READ_VAR(i, delta_diagonal_rod); // 1 float
|
EEPROM_READ_VAR(i, delta_diagonal_rod); // 1 float
|
||||||
EEPROM_READ_VAR(i, delta_segments_per_second); // 1 float
|
EEPROM_READ_VAR(i, delta_segments_per_second); // 1 float
|
||||||
|
#elif defined(Z_DUAL_ENDSTOPS)
|
||||||
|
EEPROM_READ_VAR(i, z_endstop_adj);
|
||||||
|
dummy = 0.0f;
|
||||||
|
for (int q=5; q--;) EEPROM_READ_VAR(i, dummy);
|
||||||
#else
|
#else
|
||||||
|
dummy = 0.0f;
|
||||||
for (int q=6; q--;) EEPROM_READ_VAR(i, dummy);
|
for (int q=6; q--;) EEPROM_READ_VAR(i, dummy);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -459,6 +471,8 @@ void Config_ResetDefault() {
|
||||||
delta_diagonal_rod = DELTA_DIAGONAL_ROD;
|
delta_diagonal_rod = DELTA_DIAGONAL_ROD;
|
||||||
delta_segments_per_second = DELTA_SEGMENTS_PER_SECOND;
|
delta_segments_per_second = DELTA_SEGMENTS_PER_SECOND;
|
||||||
recalc_delta_settings(delta_radius, delta_diagonal_rod);
|
recalc_delta_settings(delta_radius, delta_diagonal_rod);
|
||||||
|
#elif defined(Z_DUAL_ENDSTOPS)
|
||||||
|
z_endstop_adj = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef ULTIPANEL
|
#ifdef ULTIPANEL
|
||||||
|
@ -629,6 +643,14 @@ void Config_PrintSettings(bool forReplay) {
|
||||||
SERIAL_ECHOPAIR(" R", delta_radius );
|
SERIAL_ECHOPAIR(" R", delta_radius );
|
||||||
SERIAL_ECHOPAIR(" S", delta_segments_per_second );
|
SERIAL_ECHOPAIR(" S", delta_segments_per_second );
|
||||||
SERIAL_EOL;
|
SERIAL_EOL;
|
||||||
|
#elif defined(Z_DUAL_ENDSTOPS)
|
||||||
|
SERIAL_ECHO_START;
|
||||||
|
if (!forReplay) {
|
||||||
|
SERIAL_ECHOLNPGM("Z2 Endstop adjustement (mm):");
|
||||||
|
SERIAL_ECHO_START;
|
||||||
|
}
|
||||||
|
SERIAL_ECHOPAIR(" M666 Z", z_endstop_adj );
|
||||||
|
SERIAL_EOL;
|
||||||
#endif // DELTA
|
#endif // DELTA
|
||||||
|
|
||||||
#ifdef PIDTEMP
|
#ifdef PIDTEMP
|
||||||
|
|
|
@ -98,7 +98,32 @@
|
||||||
// Only a few motherboards support this, like RAMPS, which have dual extruder support (the 2nd, often unused, extruder driver is used
|
// Only a few motherboards support this, like RAMPS, which have dual extruder support (the 2nd, often unused, extruder driver is used
|
||||||
// to control the 2nd Z axis stepper motor). The pins are currently only defined for a RAMPS motherboards.
|
// to control the 2nd Z axis stepper motor). The pins are currently only defined for a RAMPS motherboards.
|
||||||
// On a RAMPS (or other 5 driver) motherboard, using this feature will limit you to using 1 extruder.
|
// On a RAMPS (or other 5 driver) motherboard, using this feature will limit you to using 1 extruder.
|
||||||
//#define Z_DUAL_STEPPER_DRIVERS
|
#define Z_DUAL_STEPPER_DRIVERS
|
||||||
|
|
||||||
|
#ifdef Z_DUAL_STEPPER_DRIVERS
|
||||||
|
|
||||||
|
// Z_DUAL_ENDSTOPS is a feature to enable the use of 2 endstops for both Z steppers - Let's call them Z stepper and Z2 stepper.
|
||||||
|
// That way the machine is capable to align the bed during home, since both Z steppers are homed.
|
||||||
|
// There is also an implementation of M666 (software endstops adjustment) to this feature.
|
||||||
|
// After Z homing, this adjustment is applied to just one of the steppers in order to align the bed.
|
||||||
|
// One just need to home the Z axis and measure the distance difference between both Z axis and apply the math: Z adjust = Z - Z2.
|
||||||
|
// If the Z stepper axis is closer to the bed, the measure Z > Z2 (yes, it is.. think about it) and the Z adjust would be positive.
|
||||||
|
// Play a little bit with small adjustments (0.5mm) and check the behaviour.
|
||||||
|
// The M119 (endstops report) will start reporting the Z2 Endstop as well.
|
||||||
|
|
||||||
|
#define Z_DUAL_ENDSTOPS
|
||||||
|
|
||||||
|
#ifdef Z_DUAL_ENDSTOPS
|
||||||
|
#define Z2_STEP_PIN E2_STEP_PIN // Stepper to be used to Z2 axis.
|
||||||
|
#define Z2_DIR_PIN E2_DIR_PIN
|
||||||
|
#define Z2_ENABLE_PIN E2_ENABLE_PIN
|
||||||
|
#define Z2_MAX_PIN 36 //Endstop used for Z2 axis. In this case I'm using XMAX in a Rumba Board (pin 36)
|
||||||
|
const bool Z2_MAX_ENDSTOP_INVERTING = false;
|
||||||
|
#define DISABLE_XMAX_ENDSTOP //Better to disable the XMAX to avoid conflict. Just rename "XMAX_ENDSTOP" by the endstop you are using for Z2 axis.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
// Same again but for Y Axis.
|
// Same again but for Y Axis.
|
||||||
//#define Y_DUAL_STEPPER_DRIVERS
|
//#define Y_DUAL_STEPPER_DRIVERS
|
||||||
|
|
|
@ -242,6 +242,8 @@ extern float home_offset[3];
|
||||||
extern float delta_diagonal_rod;
|
extern float delta_diagonal_rod;
|
||||||
extern float delta_segments_per_second;
|
extern float delta_segments_per_second;
|
||||||
void recalc_delta_settings(float radius, float diagonal_rod);
|
void recalc_delta_settings(float radius, float diagonal_rod);
|
||||||
|
#elif defined(Z_DUAL_ENDSTOPS)
|
||||||
|
extern float z_endstop_adj;
|
||||||
#endif
|
#endif
|
||||||
#ifdef SCARA
|
#ifdef SCARA
|
||||||
extern float axis_scaling[3]; // Build size scaling
|
extern float axis_scaling[3]; // Build size scaling
|
||||||
|
|
|
@ -248,6 +248,8 @@ float current_position[NUM_AXIS] = { 0.0, 0.0, 0.0, 0.0 };
|
||||||
float home_offset[3] = { 0, 0, 0 };
|
float home_offset[3] = { 0, 0, 0 };
|
||||||
#ifdef DELTA
|
#ifdef DELTA
|
||||||
float endstop_adj[3] = { 0, 0, 0 };
|
float endstop_adj[3] = { 0, 0, 0 };
|
||||||
|
#elif defined(Z_DUAL_ENDSTOPS)
|
||||||
|
float z_endstop_adj = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
float min_pos[3] = { X_MIN_POS, Y_MIN_POS, Z_MIN_POS };
|
float min_pos[3] = { X_MIN_POS, Y_MIN_POS, Z_MIN_POS };
|
||||||
|
@ -973,7 +975,7 @@ XYZ_CONSTS_FROM_CONFIG(signed char, home_dir, HOME_DIR);
|
||||||
|
|
||||||
static float x_home_pos(int extruder) {
|
static float x_home_pos(int extruder) {
|
||||||
if (extruder == 0)
|
if (extruder == 0)
|
||||||
return base_home_pos(X_AXIS) + add_homing[X_AXIS];
|
return base_home_pos(X_AXIS) + home_offset[X_AXIS];
|
||||||
else
|
else
|
||||||
// In dual carriage mode the extruder offset provides an override of the
|
// In dual carriage mode the extruder offset provides an override of the
|
||||||
// second X-carriage offset when homed - otherwise X2_HOME_POS is used.
|
// second X-carriage offset when homed - otherwise X2_HOME_POS is used.
|
||||||
|
@ -1487,6 +1489,9 @@ static void homeaxis(int axis) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif // Z_PROBE_SLED
|
#endif // Z_PROBE_SLED
|
||||||
|
#ifdef Z_DUAL_ENDSTOPS
|
||||||
|
if (axis==Z_AXIS) In_Homing_Process(true);
|
||||||
|
#endif
|
||||||
destination[axis] = 1.5 * max_length(axis) * axis_home_dir;
|
destination[axis] = 1.5 * max_length(axis) * axis_home_dir;
|
||||||
feedrate = homing_feedrate[axis];
|
feedrate = homing_feedrate[axis];
|
||||||
plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder);
|
plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder);
|
||||||
|
@ -1512,6 +1517,27 @@ static void homeaxis(int axis) {
|
||||||
|
|
||||||
plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder);
|
plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder);
|
||||||
st_synchronize();
|
st_synchronize();
|
||||||
|
#ifdef Z_DUAL_ENDSTOPS
|
||||||
|
if (axis==Z_AXIS)
|
||||||
|
{
|
||||||
|
feedrate = homing_feedrate[axis];
|
||||||
|
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
|
||||||
|
if (axis_home_dir > 0)
|
||||||
|
{
|
||||||
|
destination[axis] = (-1) * fabs(z_endstop_adj);
|
||||||
|
if (z_endstop_adj > 0) Lock_z_motor(true); else Lock_z2_motor(true);
|
||||||
|
} else {
|
||||||
|
destination[axis] = fabs(z_endstop_adj);
|
||||||
|
if (z_endstop_adj < 0) Lock_z_motor(true); else Lock_z2_motor(true);
|
||||||
|
}
|
||||||
|
plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder);
|
||||||
|
st_synchronize();
|
||||||
|
Lock_z_motor(false);
|
||||||
|
Lock_z2_motor(false);
|
||||||
|
In_Homing_Process(false);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef DELTA
|
#ifdef DELTA
|
||||||
// retrace by the amount specified in endstop_adj
|
// retrace by the amount specified in endstop_adj
|
||||||
if (endstop_adj[axis] * axis_home_dir < 0) {
|
if (endstop_adj[axis] * axis_home_dir < 0) {
|
||||||
|
@ -1754,7 +1780,7 @@ inline void gcode_G28() {
|
||||||
|
|
||||||
enable_endstops(true);
|
enable_endstops(true);
|
||||||
|
|
||||||
for (int i = X_AXIS; i <= Z_AXIS; i++) destination[i] = current_position[i];
|
for (int i = X_AXIS; i <= NUM_AXIS; i++) destination[i] = current_position[i];
|
||||||
|
|
||||||
feedrate = 0.0;
|
feedrate = 0.0;
|
||||||
|
|
||||||
|
@ -1944,7 +1970,7 @@ inline void gcode_G28() {
|
||||||
if (code_seen(axis_codes[Z_AXIS]) && code_value_long() != 0)
|
if (code_seen(axis_codes[Z_AXIS]) && code_value_long() != 0)
|
||||||
current_position[Z_AXIS] = code_value() + home_offset[Z_AXIS];
|
current_position[Z_AXIS] = code_value() + home_offset[Z_AXIS];
|
||||||
|
|
||||||
#ifdef ENABLE_AUTO_BED_LEVELING
|
#if defined(ENABLE_AUTO_BED_LEVELING) && (Z_HOME_DIR < 0)
|
||||||
if (home_all_axis || code_seen(axis_codes[Z_AXIS]))
|
if (home_all_axis || code_seen(axis_codes[Z_AXIS]))
|
||||||
current_position[Z_AXIS] += zprobe_zoffset; //Add Z_Probe offset (the distance is negative)
|
current_position[Z_AXIS] += zprobe_zoffset; //Add Z_Probe offset (the distance is negative)
|
||||||
#endif
|
#endif
|
||||||
|
@ -3452,6 +3478,11 @@ inline void gcode_M119() {
|
||||||
SERIAL_PROTOCOLPGM(MSG_Z_MAX);
|
SERIAL_PROTOCOLPGM(MSG_Z_MAX);
|
||||||
SERIAL_PROTOCOLLN(((READ(Z_MAX_PIN)^Z_MAX_ENDSTOP_INVERTING)?MSG_ENDSTOP_HIT:MSG_ENDSTOP_OPEN));
|
SERIAL_PROTOCOLLN(((READ(Z_MAX_PIN)^Z_MAX_ENDSTOP_INVERTING)?MSG_ENDSTOP_HIT:MSG_ENDSTOP_OPEN));
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(Z2_MAX_PIN) && Z2_MAX_PIN > -1
|
||||||
|
SERIAL_PROTOCOLPGM(MSG_Z2_MAX);
|
||||||
|
SERIAL_PROTOCOLLN(((READ(Z2_MAX_PIN)^Z2_MAX_ENDSTOP_INVERTING)?MSG_ENDSTOP_HIT:MSG_ENDSTOP_OPEN));
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -3645,6 +3676,16 @@ inline void gcode_M206() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#elif defined(Z_DUAL_ENDSTOPS)
|
||||||
|
/**
|
||||||
|
* M666: For Z Dual Endstop setup, set z axis offset to the z2 axis.
|
||||||
|
*/
|
||||||
|
inline void gcode_M666() {
|
||||||
|
if (code_seen('Z')) z_endstop_adj = code_value();
|
||||||
|
SERIAL_ECHOPAIR("Z Endstop Adjustment set to (mm):", z_endstop_adj );
|
||||||
|
SERIAL_EOL;
|
||||||
|
}
|
||||||
|
|
||||||
#endif // DELTA
|
#endif // DELTA
|
||||||
|
|
||||||
#ifdef FWRETRACT
|
#ifdef FWRETRACT
|
||||||
|
@ -4894,6 +4935,10 @@ void process_commands() {
|
||||||
case 666: // M666 set delta endstop adjustment
|
case 666: // M666 set delta endstop adjustment
|
||||||
gcode_M666();
|
gcode_M666();
|
||||||
break;
|
break;
|
||||||
|
#elif defined(Z_DUAL_ENDSTOPS)
|
||||||
|
case 666: // M666 set delta endstop adjustment
|
||||||
|
gcode_M666();
|
||||||
|
break;
|
||||||
#endif // DELTA
|
#endif // DELTA
|
||||||
|
|
||||||
#ifdef FWRETRACT
|
#ifdef FWRETRACT
|
||||||
|
|
|
@ -128,6 +128,7 @@
|
||||||
#define MSG_Y_MAX "y_max: "
|
#define MSG_Y_MAX "y_max: "
|
||||||
#define MSG_Z_MIN "z_min: "
|
#define MSG_Z_MIN "z_min: "
|
||||||
#define MSG_Z_MAX "z_max: "
|
#define MSG_Z_MAX "z_max: "
|
||||||
|
#define MSG_Z2_MAX "z2_max: "
|
||||||
#define MSG_M119_REPORT "Reporting endstop status"
|
#define MSG_M119_REPORT "Reporting endstop status"
|
||||||
#define MSG_ENDSTOP_HIT "TRIGGERED"
|
#define MSG_ENDSTOP_HIT "TRIGGERED"
|
||||||
#define MSG_ENDSTOP_OPEN "open"
|
#define MSG_ENDSTOP_OPEN "open"
|
||||||
|
|
|
@ -178,6 +178,35 @@
|
||||||
#define Z_MIN_PIN -1
|
#define Z_MIN_PIN -1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef DISABLE_XMAX_ENDSTOP
|
||||||
|
#undef X_MAX_PIN
|
||||||
|
#define X_MAX_PIN -1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DISABLE_XMIN_ENDSTOP
|
||||||
|
#undef X_MIN_PIN
|
||||||
|
#define X_MIN_PIN -1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DISABLE_YMAX_ENDSTOP
|
||||||
|
#define Y_MAX_PIN -1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DISABLE_YMIN_ENDSTOP
|
||||||
|
#undef Y_MIN_PIN
|
||||||
|
#define Y_MIN_PIN -1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DISABLE_ZMAX_ENDSTOP
|
||||||
|
#undef Z_MAX_PIN
|
||||||
|
#define Z_MAX_PIN -1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef DISABLE_ZMIN_ENDSTOP
|
||||||
|
#undef Z_MIN_PIN
|
||||||
|
#define Z_MIN_PIN -1
|
||||||
|
#endif
|
||||||
|
|
||||||
#define SENSITIVE_PINS { 0, 1, X_STEP_PIN, X_DIR_PIN, X_ENABLE_PIN, X_MIN_PIN, X_MAX_PIN, Y_STEP_PIN, Y_DIR_PIN, Y_ENABLE_PIN, Y_MIN_PIN, Y_MAX_PIN, Z_STEP_PIN, Z_DIR_PIN, Z_ENABLE_PIN, Z_MIN_PIN, Z_MAX_PIN, PS_ON_PIN, \
|
#define SENSITIVE_PINS { 0, 1, X_STEP_PIN, X_DIR_PIN, X_ENABLE_PIN, X_MIN_PIN, X_MAX_PIN, Y_STEP_PIN, Y_DIR_PIN, Y_ENABLE_PIN, Y_MIN_PIN, Y_MAX_PIN, Z_STEP_PIN, Z_DIR_PIN, Z_ENABLE_PIN, Z_MIN_PIN, Z_MAX_PIN, PS_ON_PIN, \
|
||||||
HEATER_BED_PIN, FAN_PIN, \
|
HEATER_BED_PIN, FAN_PIN, \
|
||||||
_E0_PINS _E1_PINS _E2_PINS _E3_PINS \
|
_E0_PINS _E1_PINS _E2_PINS _E3_PINS \
|
||||||
|
|
|
@ -48,6 +48,12 @@ block_t *current_block; // A pointer to the block currently being traced
|
||||||
static unsigned char out_bits; // The next stepping-bits to be output
|
static unsigned char out_bits; // The next stepping-bits to be output
|
||||||
static unsigned int cleaning_buffer_counter;
|
static unsigned int cleaning_buffer_counter;
|
||||||
|
|
||||||
|
#ifdef Z_DUAL_ENDSTOPS
|
||||||
|
static bool performing_homing = false,
|
||||||
|
locked_z_motor = false,
|
||||||
|
locked_z2_motor = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Counter variables for the bresenham line tracer
|
// Counter variables for the bresenham line tracer
|
||||||
static long counter_x, counter_y, counter_z, counter_e;
|
static long counter_x, counter_y, counter_z, counter_e;
|
||||||
volatile static unsigned long step_events_completed; // The number of step events executed in the current block
|
volatile static unsigned long step_events_completed; // The number of step events executed in the current block
|
||||||
|
@ -84,7 +90,13 @@ static bool old_x_min_endstop = false,
|
||||||
old_y_min_endstop = false,
|
old_y_min_endstop = false,
|
||||||
old_y_max_endstop = false,
|
old_y_max_endstop = false,
|
||||||
old_z_min_endstop = false,
|
old_z_min_endstop = false,
|
||||||
|
#ifndef Z_DUAL_ENDSTOPS
|
||||||
old_z_max_endstop = false;
|
old_z_max_endstop = false;
|
||||||
|
#else
|
||||||
|
old_z_max_endstop = false,
|
||||||
|
old_z2_min_endstop = false,
|
||||||
|
old_z2_max_endstop = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
static bool check_endstops = true;
|
static bool check_endstops = true;
|
||||||
|
|
||||||
|
@ -128,7 +140,23 @@ volatile signed char count_direction[NUM_AXIS] = { 1, 1, 1, 1 };
|
||||||
|
|
||||||
#ifdef Z_DUAL_STEPPER_DRIVERS
|
#ifdef Z_DUAL_STEPPER_DRIVERS
|
||||||
#define Z_APPLY_DIR(v,Q) { Z_DIR_WRITE(v); Z2_DIR_WRITE(v); }
|
#define Z_APPLY_DIR(v,Q) { Z_DIR_WRITE(v); Z2_DIR_WRITE(v); }
|
||||||
#define Z_APPLY_STEP(v,Q) { Z_STEP_WRITE(v); Z2_STEP_WRITE(v); }
|
#ifdef Z_DUAL_ENDSTOPS
|
||||||
|
#define Z_APPLY_STEP(v,Q) \
|
||||||
|
if (performing_homing) { \
|
||||||
|
if (Z_HOME_DIR > 0) {\
|
||||||
|
if (!(old_z_max_endstop && (count_direction[Z_AXIS] > 0)) && !locked_z_motor) Z_STEP_WRITE(v); \
|
||||||
|
if (!(old_z2_max_endstop && (count_direction[Z_AXIS] > 0)) && !locked_z2_motor) Z2_STEP_WRITE(v); \
|
||||||
|
} else {\
|
||||||
|
if (!(old_z_min_endstop && (count_direction[Z_AXIS] < 0)) && !locked_z_motor) Z_STEP_WRITE(v); \
|
||||||
|
if (!(old_z2_min_endstop && (count_direction[Z_AXIS] < 0)) && !locked_z2_motor) Z2_STEP_WRITE(v); \
|
||||||
|
} \
|
||||||
|
} else { \
|
||||||
|
Z_STEP_WRITE(v); \
|
||||||
|
Z2_STEP_WRITE(v); \
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define Z_APPLY_STEP(v,Q) Z_STEP_WRITE(v), Z2_STEP_WRITE(v)
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
#define Z_APPLY_DIR(v,Q) Z_DIR_WRITE(v)
|
#define Z_APPLY_DIR(v,Q) Z_DIR_WRITE(v)
|
||||||
#define Z_APPLY_STEP(v,Q) Z_STEP_WRITE(v)
|
#define Z_APPLY_STEP(v,Q) Z_STEP_WRITE(v)
|
||||||
|
@ -465,28 +493,66 @@ ISR(TIMER1_COMPA_vect) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TEST(out_bits, Z_AXIS)) { // -direction
|
if (TEST(out_bits, Z_AXIS)) { // -direction
|
||||||
Z_DIR_WRITE(INVERT_Z_DIR);
|
Z_APPLY_DIR(INVERT_Z_DIR,0);
|
||||||
#ifdef Z_DUAL_STEPPER_DRIVERS
|
|
||||||
Z2_DIR_WRITE(INVERT_Z_DIR);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
count_direction[Z_AXIS] = -1;
|
count_direction[Z_AXIS] = -1;
|
||||||
if (check_endstops) {
|
if (check_endstops)
|
||||||
#if defined(Z_MIN_PIN) && Z_MIN_PIN >= 0
|
{
|
||||||
|
#if defined(Z_MIN_PIN) && Z_MIN_PIN > -1
|
||||||
|
#ifndef Z_DUAL_ENDSTOPS
|
||||||
UPDATE_ENDSTOP(z, Z, min, MIN);
|
UPDATE_ENDSTOP(z, Z, min, MIN);
|
||||||
|
#else
|
||||||
|
bool z_min_endstop=(READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING);
|
||||||
|
#if defined(Z2_MIN_PIN) && Z2_MIN_PIN > -1
|
||||||
|
bool z2_min_endstop=(READ(Z2_MIN_PIN) != Z2_MIN_ENDSTOP_INVERTING);
|
||||||
|
#else
|
||||||
|
bool z2_min_endstop=z_min_endstop;
|
||||||
|
#endif
|
||||||
|
if(((z_min_endstop && old_z_min_endstop) || (z2_min_endstop && old_z2_min_endstop)) && (current_block->steps[Z_AXIS] > 0))
|
||||||
|
{
|
||||||
|
endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS];
|
||||||
|
endstop_z_hit=true;
|
||||||
|
if (!(performing_homing) || ((performing_homing)&&(z_min_endstop && old_z_min_endstop)&&(z2_min_endstop && old_z2_min_endstop))) //if not performing home or if both endstops were trigged during homing...
|
||||||
|
{
|
||||||
|
step_events_completed = current_block->step_event_count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
old_z_min_endstop = z_min_endstop;
|
||||||
|
old_z2_min_endstop = z2_min_endstop;
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else { // +direction
|
else { // +direction
|
||||||
Z_DIR_WRITE(!INVERT_Z_DIR);
|
Z_APPLY_DIR(!INVERT_Z_DIR,0);
|
||||||
#ifdef Z_DUAL_STEPPER_DRIVERS
|
|
||||||
Z2_DIR_WRITE(!INVERT_Z_DIR);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
count_direction[Z_AXIS] = 1;
|
count_direction[Z_AXIS] = 1;
|
||||||
if (check_endstops) {
|
if (check_endstops) {
|
||||||
#if defined(Z_MAX_PIN) && Z_MAX_PIN >= 0
|
#if defined(Z_MAX_PIN) && Z_MAX_PIN >= 0
|
||||||
|
#ifndef Z_DUAL_ENDSTOPS
|
||||||
UPDATE_ENDSTOP(z, Z, max, MAX);
|
UPDATE_ENDSTOP(z, Z, max, MAX);
|
||||||
|
#else
|
||||||
|
bool z_max_endstop=(READ(Z_MAX_PIN) != Z_MAX_ENDSTOP_INVERTING);
|
||||||
|
#if defined(Z2_MAX_PIN) && Z2_MAX_PIN > -1
|
||||||
|
bool z2_max_endstop=(READ(Z2_MAX_PIN) != Z2_MAX_ENDSTOP_INVERTING);
|
||||||
|
#else
|
||||||
|
bool z2_max_endstop=z_max_endstop;
|
||||||
|
#endif
|
||||||
|
if(((z_max_endstop && old_z_max_endstop) || (z2_max_endstop && old_z2_max_endstop)) && (current_block->steps[Z_AXIS] > 0))
|
||||||
|
{
|
||||||
|
endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS];
|
||||||
|
endstop_z_hit=true;
|
||||||
|
|
||||||
|
// if (z_max_endstop && old_z_max_endstop) SERIAL_ECHOLN("z_max_endstop = true");
|
||||||
|
// if (z2_max_endstop && old_z2_max_endstop) SERIAL_ECHOLN("z2_max_endstop = true");
|
||||||
|
|
||||||
|
|
||||||
|
if (!(performing_homing) || ((performing_homing)&&(z_max_endstop && old_z_max_endstop)&&(z2_max_endstop && old_z2_max_endstop))) //if not performing home or if both endstops were trigged during homing...
|
||||||
|
{
|
||||||
|
step_events_completed = current_block->step_event_count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
old_z_max_endstop = z_max_endstop;
|
||||||
|
old_z2_max_endstop = z2_max_endstop;
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -845,6 +911,13 @@ void st_init() {
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(Z2_MAX_PIN) && Z2_MAX_PIN >= 0
|
||||||
|
SET_INPUT(Z2_MAX_PIN);
|
||||||
|
#ifdef ENDSTOPPULLUP_ZMAX
|
||||||
|
WRITE(Z2_MAX_PIN,HIGH);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#define AXIS_INIT(axis, AXIS, PIN) \
|
#define AXIS_INIT(axis, AXIS, PIN) \
|
||||||
AXIS ##_STEP_INIT; \
|
AXIS ##_STEP_INIT; \
|
||||||
AXIS ##_STEP_WRITE(INVERT_## PIN ##_STEP_PIN); \
|
AXIS ##_STEP_WRITE(INVERT_## PIN ##_STEP_PIN); \
|
||||||
|
@ -1174,3 +1247,9 @@ void microstep_readings() {
|
||||||
SERIAL_PROTOCOLLN(digitalRead(E1_MS2_PIN));
|
SERIAL_PROTOCOLLN(digitalRead(E1_MS2_PIN));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef Z_DUAL_ENDSTOPS
|
||||||
|
void In_Homing_Process(bool state) { performing_homing = state; }
|
||||||
|
void Lock_z_motor(bool state) { locked_z_motor = state; }
|
||||||
|
void Lock_z2_motor(bool state) { locked_z2_motor = state; }
|
||||||
|
#endif
|
||||||
|
|
|
@ -97,6 +97,12 @@ void digipot_current(uint8_t driver, int current);
|
||||||
void microstep_init();
|
void microstep_init();
|
||||||
void microstep_readings();
|
void microstep_readings();
|
||||||
|
|
||||||
|
#ifdef Z_DUAL_ENDSTOPS
|
||||||
|
void In_Homing_Process(bool state);
|
||||||
|
void Lock_z_motor(bool state);
|
||||||
|
void Lock_z2_motor(bool state);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef BABYSTEPPING
|
#ifdef BABYSTEPPING
|
||||||
void babystep(const uint8_t axis,const bool direction); // perform a short step with a single stepper motor, outside of any convention
|
void babystep(const uint8_t axis,const bool direction); // perform a short step with a single stepper motor, outside of any convention
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue