Teathimble_Firmware/homing.c

181 wiersze
4.9 KiB
C

#include "homing.h"
#include "config.h"
#include "maths.h"
#include "queue.h"
#include "motor.h"
#include "gcode_parser.h"
// Check configuration.
#if defined X_MIN_PIN || defined X_MAX_PIN
#ifndef SEARCH_FEEDRATE_X
#error SEARCH_FEEDRATE_X undefined. It should be defined in config.h.
#endif
#ifndef ENDSTOP_CLEARANCE_X
#error ENDSTOP_CLEARANCE_X undefined. It should be defined in config.h.
#endif
#endif
#if defined Y_MIN_PIN || defined Y_MAX_PIN
#ifndef SEARCH_FEEDRATE_Y
#error SEARCH_FEEDRATE_Y undefined. It should be defined in config.h.
#endif
#ifndef ENDSTOP_CLEARANCE_Y
#error ENDSTOP_CLEARANCE_Y undefined. It should be defined in config.h.
#endif
#endif
#if defined Z_MIN_PIN || defined Z_MAX_PIN
#ifndef SEARCH_FEEDRATE_Z
#error SEARCH_FEEDRATE_Z undefined. It should be defined in config.h.
#endif
#ifndef ENDSTOP_CLEARANCE_Z
#error ENDSTOP_CLEARANCE_Z undefined. It should be defined in config.h.
#endif
#endif
// Calculate feedrates according to clearance and deceleration.
// For a description, see #define ENDSTOP_CLEARANCE_{XYZ} in config.h.
// s = 1/2 * a * t^2; t = v / a <==> v = sqrt(2 * a * s))
// units: / 1000 for um -> mm; * 60 for mm/s -> mm/min
#ifdef ENDSTOP_CLEARANCE_X
#define SEARCH_FAST_X (uint32_t)((double)60. * \
sqrt((double)2 * ACCELERATION * ENDSTOP_CLEARANCE_X / 1000.))
#endif
#ifdef ENDSTOP_CLEARANCE_Y
#define SEARCH_FAST_Y (uint32_t)((double)60. * \
sqrt((double)2 * ACCELERATION * ENDSTOP_CLEARANCE_Y / 1000.))
#endif
#ifdef ENDSTOP_CLEARANCE_Z
#define SEARCH_FAST_Z (uint32_t)((double)60. * \
sqrt((double)2 * ACCELERATION * ENDSTOP_CLEARANCE_Z / 1000.))
#endif
static const uint32_t PROGMEM fast_feedrate_P[3] = {
(SEARCH_FAST_X > SEARCH_FEEDRATE_X) ? SEARCH_FAST_X : SEARCH_FEEDRATE_X,
(SEARCH_FAST_Y > SEARCH_FEEDRATE_Y) ? SEARCH_FAST_Y : SEARCH_FEEDRATE_Y,
#ifdef SEARCH_FAST_Z
(SEARCH_FAST_Z > SEARCH_FEEDRATE_Z) ? SEARCH_FAST_Z : SEARCH_FEEDRATE_Z,
#endif
};
static const uint32_t PROGMEM search_feedrate_P[3] = {
(SEARCH_FAST_X > SEARCH_FEEDRATE_X) ? SEARCH_FEEDRATE_X : 0,
(SEARCH_FAST_Y > SEARCH_FEEDRATE_Y) ? SEARCH_FEEDRATE_Y : 0,
#ifdef SEARCH_FAST_Z
(SEARCH_FAST_Z > SEARCH_FEEDRATE_Z) ? SEARCH_FEEDRATE_Z : 0,
#endif
};
uint8_t get_endstop_check(enum axis_e n, int8_t dir);
void home_axis(enum axis_e n, int8_t dir, enum axis_endstop_e endstop_check);
void set_axis_home_position(enum axis_e n, int8_t dir);
void home() {
/// find X MIN endstop
#if defined X_MIN_PIN
home_axis(X, -1, X_MIN_ENDSTOP);
#endif
/// find X_MAX endstop
#if defined X_MAX_PIN && ! defined X_MAX
#warning X_MAX_PIN defined, but not X_MAX. home_x_positive() disabled.
#endif
#if defined X_MAX_PIN && defined X_MAX
home_axis(X, 1, X_MAX_ENDSTOP);
#endif
/// fund Y MIN endstop
#if defined Y_MIN_PIN
home_axis(Y, -1, Y_MIN_ENDSTOP);
#endif
/// find Y MAX endstop
#if defined Y_MAX_PIN && ! defined Y_MAX
#warning Y_MAX_PIN defined, but not Y_MAX. home_y_positive() disabled.
#endif
#if defined Y_MAX_PIN && defined Y_MAX
home_axis(Y, 1, Y_MAX_ENDSTOP);
#endif
/// find Z MIN endstop
#if defined Z_MIN_PIN
home_axis(Z, -1, Z_MIN_ENDSTOP);
#endif
/// find Z MAX endstop
#if defined Z_MAX_PIN && ! defined Z_MAX
#warning Z_MAX_PIN defined, but not Z_MAX. home_z_positive() disabled.
#endif
#if defined Z_MAX_PIN && defined Z_MAX
home_axis(Z, 1, Z_MAX_ENDSTOP);
#endif
}
void home_axis(enum axis_e n, int8_t dir, enum axis_endstop_e endstop_check) {
TARGET t = startpoint;
startpoint.axis[n] = 0;
t.f_multiplier = 64;
t.axis[n] = dir * MAX_DELTA_UM;
t.F = pgm_read_dword(&fast_feedrate_P[n]);
enqueue_home(&t, endstop_check, 1);
uint32_t search_feedrate;
search_feedrate = pgm_read_dword(&search_feedrate_P[n]);
if (search_feedrate) {
// back off slowly
t.axis[n] = 0;
t.F = search_feedrate;
enqueue_home(&t, endstop_check, 0);
}
queue_wait();
set_axis_home_position(n, dir);
dda_new_startpoint();
}
void set_axis_home_position(enum axis_e n, int8_t dir) {
int32_t home_position = 0;
if (dir < 0) {
if (n == X) {
#ifdef X_MIN
home_position = (int32_t)(X_MIN * 1000);
#endif
}
else if (n == Y) {
#ifdef Y_MIN
home_position = (int32_t)(Y_MIN * 1000);
#endif
}
#ifdef SEARCH_FAST_Z
else if (n == Z) {
#ifdef Z_MIN
home_position = (int32_t)(Z_MIN * 1000);
#endif
}
#endif
}
else {
if (n == X) {
#ifdef X_MAX
home_position = (int32_t)(X_MAX * 1000);
#endif
}
else if (n == Y) {
#ifdef Y_MAX
home_position = (int32_t)(Y_MAX * 1000);
#endif
}
#ifdef SEARCH_FAST_Z
else if (n == Z) {
#ifdef Z_MAX
home_position = (int32_t)(Z_MAX * 1000);
#endif
}
#endif
}
startpoint.axis[n] = next_target.axis[n] = home_position;
}