|
Modifica MK Z_QUAD_STEPPER July 12, 2016 07:17AM |
Registered: 9 years ago Posts: 57 |
#define Z_QUAD_STEPPER_DRIVERS #define Z_QUAD_ENDSTOPS
#if ENABLED(Z_QUAD_STEPPER_DRIVERS) #define Z2_STEP_PIN ORIG_E1_STEP_PIN #define Z2_DIR_PIN ORIG_E1_DIR_PIN #define Z2_ENABLE_PIN ORIG_E1_ENABLE_PIN #define Z3_STEP_PIN ORIG_E2_STEP_PIN #define Z3_DIR_PIN ORIG_E2_DIR_PIN #define Z3_ENABLE_PIN ORIG_E2_ENABLE_PIN #define Z4_STEP_PIN ORIG_E3_STEP_PIN #define Z4_DIR_PIN ORIG_E3_DIR_PIN #define Z4_ENABLE_PIN ORIG_E3_ENABLE_PIN #endif #if ENABLED(Z_QUAD_ENDSTOPS) #define Z2_MIN_PIN ORIG_X_MAX_PIN #define Z3_MIN_PIN ORIG_Y_MAX_PIN #define Z4_MIN_PIN ORIG_Z_MAX_PIN #endif
|
Re: Modifica MK Z_QUAD_STEPPER July 12, 2016 10:00AM |
Registered: 9 years ago Posts: 57 |
inline void update_endstops() {
...
#if HAS(Z_MIN)
#if ENABLED(Z_DUAL_ENDSTOPS)
SET_ENDSTOP_BIT(Z, MIN);
#if HAS(Z2_MIN)
SET_ENDSTOP_BIT(Z2, MIN);
#else
COPY_BIT(current_endstop_bits, Z_MIN, Z2_MIN);
#endif
byte z_test = TEST_ENDSTOP(Z_MIN) | (TEST_ENDSTOP(Z2_MIN) << 1); // bit 0 for Z, bit 1 for Z2
if (z_test && current_block->steps[Z_AXIS] > 0) { // z_test = Z_MIN || Z2_MIN
endstops_trigsteps[Z_AXIS] = count_position[Z_AXIS];
SBI(endstop_hit_bits, Z_MIN);
if (!performing_homing || (z_test == 0x3)) //if not performing home or if both endstops were trigged during homing...
step_events_completed = current_block->step_event_count;
}
#else // !Z_DUAL_ENDSTOPS
UPDATE_ENDSTOP(Z, MIN);
#endif // !Z_DUAL_ENDSTOPS
#endif // Z_MIN_PIN
...
}
Z2_MIN -> X_MAX Z3_MIN -> Y_MAX Z4_MIN -> Z_MAX
|
Re: Modifica MK Z_QUAD_STEPPER July 12, 2016 01:19PM |
Registered: 9 years ago Posts: 57 |
void get_z_quad_endstops_status(bool *buf) {
buf[0] = ((READ(Z_MIN_PIN)^Z_MIN_ENDSTOP_INVERTING)?true:false);
buf[1] = ((READ(X_MAX_PIN)^X_MAX_ENDSTOP_INVERTING)?true:false);
buf[2] = ((READ(Y_MAX_PIN)^Y_MAX_ENDSTOP_INVERTING)?true:false);
buf[3] = ((READ(Z_MAX_PIN)^Z_MAX_ENDSTOP_INVERTING)?true:false);
}
static void homeaxis(AxisEnum axis) {
...
// Set a flag for Z motor locking
#if ENABLED(Z_DUAL_ENDSTOPS) || ENABLED(Z_QUAD_ENDSTOPS)
if (axis == Z_AXIS) In_Homing_Process(true);
#endif
#if ENABLED(Z_QUAD_STEPPER_DRIVERS) && ENABLED(Z_QUAD_ENDSTOPS)
if (axis == Z_AXIS) {
bool lockZ_MOTOR[3] = {0};
do {
destination[axis] = 1.5 * max_length(axis) * axis_home_dir;
feedrate = homing_feedrate[axis];
line_to_destination();
st_synchronize();
get_z_quad_endstops_status(lockZ_MOTOR);
if (lockZ_MOTOR[0]) Lock_z_motor(true);
if (lockZ_MOTOR[1]) Lock_z2_motor(true);
if (lockZ_MOTOR[2]) Lock_z3_motor(true);
if (lockZ_MOTOR[3]) Lock_z4_motor(true);
sync_plan_position();
} while (lockZ_MOTOR[0]==false || lockZ_MOTOR[1]==false || lockZ_MOTOR[2]==false || lockZ_MOTOR[3]==false);
}
#else
// Move towards the endstop until an endstop is triggered
destination[axis] = 1.5 * max_length(axis) * axis_home_dir;
feedrate = homing_feedrate[axis];
line_to_destination();
st_synchronize();
#endif
// Set the axis position as setup for the move
current_position[axis] = 0;
sync_plan_position();
...
#if ENABLED(Z_DUAL_ENDSTOPS)
if (axis == Z_AXIS) {
float adj = fabs(z_endstop_adj);
bool lockZ1;
if (axis_home_dir > 0) {
adj = -adj;
lockZ1 = (z_endstop_adj > 0);
}
else
lockZ1 = (z_endstop_adj < 0);
if (lockZ1) Lock_z_motor(true); else Lock_z2_motor(true);
sync_plan_position();
// Move to the adjusted endstop height
feedrate = homing_feedrate[axis];
destination[Z_AXIS] = adj;
line_to_destination();
st_synchronize();
if (lockZ1) Lock_z_motor(false); else Lock_z2_motor(false);
In_Homing_Process(false);
} // Z_AXIS
#endif
#if ENABLED(Z_QUAD_STEPPER_DRIVERS) && ENABLED(Z_QUAD_ENDSTOPS)
if (axis == Z_AXIS) {
Lock_z_motor(false);
Lock_z2_motor(false);
Lock_z3_motor(false);
Lock_z4_motor(false);
In_Homing_Process(false);
}
#endif
// Set the axis position to its home position (plus home offsets)
set_axis_is_at_home(axis);
sync_plan_position();
...
|
Re: Modifica MK Z_QUAD_STEPPER July 12, 2016 04:23PM |
Registered: 12 years ago Posts: 6,409 |
#if ENABLED(Z_QUAD_STEPPER_DRIVERS)
#define Z_APPLY_DIR(v,Q) { Z_DIR_WRITE(v); Z1_DIR_WRITE(v); Z2_DIR_WRITE(v); Z3_DIR_WRITE(v); }
#if ENABLED(Z_QUAD_ENDSTOPS)
#define Z_APPLY_STEP(v,Q) \
if (performing_homing) { \
if (Z_HOME_DIR > 0) {\
if (!(TEST(old_endstop_bits, Z_MAX) && (count_direction[Z_AXIS] > 0)) && !locked_z_motor) Z_STEP_WRITE(v); \
if (!(TEST(old_endstop_bits, Z1_MAX) && (count_direction[Z_AXIS] > 0)) && !locked_z1_motor) Z1_STEP_WRITE(v); \
if (!(TEST(old_endstop_bits, Z2_MAX) && (count_direction[Z_AXIS] > 0)) && !locked_z2_motor) Z2_STEP_WRITE(v); \
if (!(TEST(old_endstop_bits, Z3_MAX) && (count_direction[Z_AXIS] > 0)) && !locked_z3_motor) Z3_STEP_WRITE(v); \
} \
else { \
if (!(TEST(old_endstop_bits, Z_MIN) && (count_direction[Z_AXIS] < 0)) && !locked_z_motor) Z_STEP_WRITE(v); \
if (!(TEST(old_endstop_bits, Z1_MIN) && (count_direction[Z_AXIS] < 0)) && !locked_z1_motor) Z1_STEP_WRITE(v); \
if (!(TEST(old_endstop_bits, Z2_MIN) && (count_direction[Z_AXIS] < 0)) && !locked_z1_motor) Z2_STEP_WRITE(v); \
if (!(TEST(old_endstop_bits, Z3_MIN) && (count_direction[Z_AXIS] < 0)) && !locked_z1_motor) Z3_STEP_WRITE(v); \
} \
} \
else { \
Z_STEP_WRITE(v); \
Z1_STEP_WRITE(v); \
Z2_STEP_WRITE(v); \
Z3_STEP_WRITE(v); \
}
#else
#define Z_APPLY_STEP(v,Q) { Z_STEP_WRITE(v); Z1_STEP_WRITE(v); Z2_STEP_WRITE(v); Z3_STEP_WRITE(v); }
#endif
#elif ENABLED(Z_DUAL_STEPPER_DRIVERS)
#define Z_APPLY_DIR(v,Q) { Z_DIR_WRITE(v); Z2_DIR_WRITE(v); }
#if ENABLED(Z_DUAL_ENDSTOPS)
#define Z_APPLY_STEP(v,Q) \
if (performing_homing) { \
if (Z_HOME_DIR > 0) {\
if (!(TEST(old_endstop_bits, Z_MAX) && (count_direction[Z_AXIS] > 0)) && !locked_z_motor) Z_STEP_WRITE(v); \
if (!(TEST(old_endstop_bits, Z2_MAX) && (count_direction[Z_AXIS] > 0)) && !locked_z2_motor) Z2_STEP_WRITE(v); \
} \
else { \
if (!(TEST(old_endstop_bits, Z_MIN) && (count_direction[Z_AXIS] < 0)) && !locked_z_motor) Z_STEP_WRITE(v); \
if (!(TEST(old_endstop_bits, Z2_MIN) && (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
#define Z_APPLY_DIR(v,Q) Z_DIR_WRITE(v)
#define Z_APPLY_STEP(v,Q) Z_STEP_WRITE(v)
#endif
#if ENABLED(Z_QUAD_ENDSTOPS)
UPDATE_ENDSTOP_BIT(Z, MIN);
UPDATE_ENDSTOP_BIT(Z1, MIN);
UPDATE_ENDSTOP_BIT(Z2, MIN);
UPDATE_ENDSTOP_BIT(Z3, MIN);
#elif ENABLED(Z_DUAL_ENDSTOPS)
UPDATE_ENDSTOP_BIT(Z, MIN);
#if HAS_Z2_MIN
UPDATE_ENDSTOP_BIT(Z2, MIN);
#else
COPY_BIT(current_endstop_bits, Z_MIN, Z2_MIN);
#endif
test_dual_z_endstops(Z_MIN, Z2_MIN);
#else // !Z_DUAL_ENDSTOPS
if (performing_homing) { \
if (Z_HOME_DIR > 0) {\
if (!(TEST(old_endstop_bits, Z_MAX) && (count_direction[Z_AXIS] > 0)) && !locked_z_motor) Z_STEP_WRITE(v); \
if (!(TEST(old_endstop_bits, Z1_MAX) && (count_direction[Z_AXIS] > 0)) && !locked_z1_motor) Z1_STEP_WRITE(v); \
if (!(TEST(old_endstop_bits, Z2_MAX) && (count_direction[Z_AXIS] > 0)) && !locked_z2_motor) Z2_STEP_WRITE(v); \
if (!(TEST(old_endstop_bits, Z3_MAX) && (count_direction[Z_AXIS] > 0)) && !locked_z3_motor) Z3_STEP_WRITE(v); \
else { \
Z_STEP_WRITE(v); \
Z1_STEP_WRITE(v); \
Z2_STEP_WRITE(v); \
Z3_STEP_WRITE(v); \
}
|
Re: Modifica MK Z_QUAD_STEPPER July 13, 2016 10:03AM |
Registered: 9 years ago Posts: 57 |
premetto che sto lavorando sulla versione 4.2.8_dev (sull'ultima versione ottengo errori strani se decommento le features "dual") e utilizzo l'ide 1.6.8 di arduino per compilare. Detto questo, ho modificato tutto ciò che riguarda il controllo dei 4 motori Z (e compila senza errori), ciò che mi manca è la parte relativa agli endstops..
inline bool get_x_min_trigger() { return ((READ(X_MIN_PIN)^X_MIN_ENDSTOP_INVERTING)?true:false); }
inline bool get_x_max_trigger() { return ((READ(X_MAX_PIN)^X_MAX_ENDSTOP_INVERTING)?true:false); }
inline bool get_y_min_trigger() { return ((READ(Y_MIN_PIN)^Y_MIN_ENDSTOP_INVERTING)?true:false); }
inline bool get_y_max_trigger() { return ((READ(Y_MAX_PIN)^Y_MAX_ENDSTOP_INVERTING)?true:false); }
inline bool get_z_min_trigger() { return ((READ(Z_MIN_PIN)^Z_MIN_ENDSTOP_INVERTING)?true:false); }
inline bool get_z_max_trigger() { return ((READ(Z_MAX_PIN)^Z_MAX_ENDSTOP_INVERTING)?true:false); }
...
#if ENABLED(Z_QUAD_ENDSTOPS)
UPDATE_ENDSTOP(Z,MIN);
UPDATE_ENDSTOP(X,MAX);
UPDATE_ENDSTOP(Y,MAX);
UPDATE_ENDSTOP(Z,MAX);
bool z1_end = get_z_min_trigger();
bool z2_end = get_z_max_trigger();
bool z3_end = get_x_max_trigger();
bool z4_end = get_y_max_trigger();
if (z1_end==true) { Lock_z_motor(true); }
if (z2_end==true) { Lock_z2_motor(true); }
if (z3_end==true) { Lock_z3_motor(true); }
if (z4_end==true) { Lock_z4_motor(true); }
if (z1_end==true && z2_end==true && z3_end==true && z4_end==true) {
// homing Z completato , procedi allo step successivo
}
#elif ENABLED(Z_DUAL_ENDSTOPS)
...
|
Re: Modifica MK Z_QUAD_STEPPER July 26, 2016 09:12AM |
Registered: 9 years ago Posts: 57 |
#if HAS(Z_MIN)
#if ENABLED(Z_QUAD_ENDSTOPS)
UPDATE_ENDSTOP(Z,MIN);
UPDATE_ENDSTOP(X,MAX);
UPDATE_ENDSTOP(Y,MAX);
UPDATE_ENDSTOP(Z,MAX);
if (!z1_end) {
z1_end = get_z_min_trigger();
if (z1_end) {
Lock_z_motor(true);
ECHO_EMT("Motore 1: ", "Bloccato");
}
}
if (!z2_end) {
z2_end = get_x_max_trigger();
if (z2_end) {
Lock_z2_motor(true);
ECHO_EMT("Motore 2: ", "Bloccato");
}
}
if (!z3_end) {
z3_end = get_y_max_trigger();
if (z3_end) {
Lock_z3_motor(true);
ECHO_EMT("Motore 3: ", "Bloccato");
}
}
if (!z4_end) {
z4_end = get_z_max_trigger();
if (z4_end) {
Lock_z4_motor(true);
ECHO_EMT("Motore 4: ", "Bloccato");
}
}
if (z1_end==true && z2_end==true && z3_end==true && z4_end==true) {
step_events_completed = current_block->step_event_count;
ECHO_EMT("Stato motori: ", "Tutti bloccati, homing Z completo");
}
|
Re: Modifica MK Z_QUAD_STEPPER July 26, 2016 11:31AM |
Moderator Registered: 13 years ago Posts: 1,865 |
|
Re: Modifica MK Z_QUAD_STEPPER July 26, 2016 01:33PM |
Registered: 9 years ago Posts: 57 |
) però se mai dovesse accadere hai ragione tu, il piatto non sarebbe più livellato. Però se ci ragioniamo un pò non vedo quale altra soluzione esista per una meccanica con piatto mobile (lasciando stare quelle con piatto fisso per le quali non avrebbe assolutamente alcun senso fare una cosa del genere). La stessa cosa potrebbe benissimo accadere anche con solo due barre filettate, se si pianta un motore si spacca tutto. Inoltre se ci fai caso qualsiasi stampante se perde passi fa sfasare ogni calibrazione fatta in precedenza (e non mi riferisco unicamente all'asse z, potrebbe anche perdere passi il motore sull'asse x con conseguente sfasamento nella stampa) quindi è si importante porsi il problema ma non vedo come si possa prevenire una cosa del genere se non adottando componenti di qualità e soprattutto progettando bene la meccanica della stampante in modo che tutto scorra bene. |
Re: Modifica MK Z_QUAD_STEPPER July 27, 2016 04:17AM |
Moderator Registered: 13 years ago Posts: 1,865 |
|
Re: Modifica MK Z_QUAD_STEPPER July 27, 2016 05:36AM |
Registered: 9 years ago Posts: 57 |
|
Re: Modifica MK Z_QUAD_STEPPER July 27, 2016 09:44AM |
Moderator Registered: 13 years ago Posts: 1,865 |
|
Re: Modifica MK Z_QUAD_STEPPER July 27, 2016 10:21AM |
Registered: 9 years ago Posts: 57 |
|
Re: Modifica MK Z_QUAD_STEPPER July 27, 2016 11:08AM |
Moderator Registered: 13 years ago Posts: 1,865 |
|
Re: Modifica MK Z_QUAD_STEPPER July 27, 2016 02:20PM |
Registered: 9 years ago Posts: 57 |
|
Re: Modifica MK Z_QUAD_STEPPER July 28, 2016 08:08AM |
Registered: 10 years ago Posts: 762 |
|
Re: Modifica MK Z_QUAD_STEPPER July 28, 2016 11:34AM |
Registered: 9 years ago Posts: 57 |