|
|
@ -733,19 +733,27 @@ void Stepper::isr() { |
|
|
|
|
|
|
|
void Stepper::init() { |
|
|
|
|
|
|
|
digipot_init(); //Initialize Digipot Motor Current
|
|
|
|
microstep_init(); //Initialize Microstepping Pins
|
|
|
|
// Init Digipot Motor Current
|
|
|
|
#if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM |
|
|
|
digipot_init(); |
|
|
|
#endif |
|
|
|
|
|
|
|
// initialise TMC Steppers
|
|
|
|
// Init Microstepping Pins
|
|
|
|
#if HAS_MICROSTEPS |
|
|
|
microstep_init(); |
|
|
|
#endif |
|
|
|
|
|
|
|
// Init TMC Steppers
|
|
|
|
#if ENABLED(HAVE_TMCDRIVER) |
|
|
|
tmc_init(); |
|
|
|
#endif |
|
|
|
// initialise L6470 Steppers
|
|
|
|
|
|
|
|
// Init L6470 Steppers
|
|
|
|
#if ENABLED(HAVE_L6470DRIVER) |
|
|
|
L6470_init(); |
|
|
|
#endif |
|
|
|
|
|
|
|
// Initialize Dir Pins
|
|
|
|
// Init Dir Pins
|
|
|
|
#if HAS_X_DIR |
|
|
|
X_DIR_INIT; |
|
|
|
#endif |
|
|
@ -777,8 +785,7 @@ void Stepper::init() { |
|
|
|
E3_DIR_INIT; |
|
|
|
#endif |
|
|
|
|
|
|
|
//Initialize Enable Pins - steppers default to disabled.
|
|
|
|
|
|
|
|
// Init Enable Pins - steppers default to disabled.
|
|
|
|
#if HAS_X_ENABLE |
|
|
|
X_ENABLE_INIT; |
|
|
|
if (!X_ENABLE_ON) X_ENABLE_WRITE(HIGH); |
|
|
@ -787,7 +794,6 @@ void Stepper::init() { |
|
|
|
if (!X_ENABLE_ON) X2_ENABLE_WRITE(HIGH); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
#if HAS_Y_ENABLE |
|
|
|
Y_ENABLE_INIT; |
|
|
|
if (!Y_ENABLE_ON) Y_ENABLE_WRITE(HIGH); |
|
|
@ -796,7 +802,6 @@ void Stepper::init() { |
|
|
|
if (!Y_ENABLE_ON) Y2_ENABLE_WRITE(HIGH); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
#if HAS_Z_ENABLE |
|
|
|
Z_ENABLE_INIT; |
|
|
|
if (!Z_ENABLE_ON) Z_ENABLE_WRITE(HIGH); |
|
|
@ -805,7 +810,6 @@ void Stepper::init() { |
|
|
|
if (!Z_ENABLE_ON) Z2_ENABLE_WRITE(HIGH); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
#if HAS_E0_ENABLE |
|
|
|
E0_ENABLE_INIT; |
|
|
|
if (!E_ENABLE_ON) E0_ENABLE_WRITE(HIGH); |
|
|
@ -823,9 +827,7 @@ void Stepper::init() { |
|
|
|
if (!E_ENABLE_ON) E3_ENABLE_WRITE(HIGH); |
|
|
|
#endif |
|
|
|
|
|
|
|
//
|
|
|
|
// Init endstops and pullups here
|
|
|
|
//
|
|
|
|
// Init endstops and pullups
|
|
|
|
endstops.init(); |
|
|
|
|
|
|
|
#define _STEP_INIT(AXIS) AXIS ##_STEP_INIT |
|
|
@ -839,7 +841,7 @@ void Stepper::init() { |
|
|
|
|
|
|
|
#define E_AXIS_INIT(NUM) AXIS_INIT(e## NUM, E## NUM, E) |
|
|
|
|
|
|
|
// Initialize Step Pins
|
|
|
|
// Init Step Pins
|
|
|
|
#if HAS_X_STEP |
|
|
|
#if ENABLED(X_DUAL_STEPPER_DRIVERS) || ENABLED(DUAL_X_CARRIAGE) |
|
|
|
X2_STEP_INIT; |
|
|
@ -1164,134 +1166,158 @@ void Stepper::report_positions() { |
|
|
|
|
|
|
|
#endif //HAS_DIGIPOTSS
|
|
|
|
|
|
|
|
void Stepper::digipot_init() { |
|
|
|
#if HAS_DIGIPOTSS |
|
|
|
const uint8_t digipot_motor_current[] = DIGIPOT_MOTOR_CURRENT; |
|
|
|
#if HAS_DIGIPOTSS || HAS_MOTOR_CURRENT_PWM |
|
|
|
|
|
|
|
SPI.begin(); |
|
|
|
pinMode(DIGIPOTSS_PIN, OUTPUT); |
|
|
|
for (uint8_t i = 0; i < COUNT(digipot_motor_current); i++) { |
|
|
|
//digitalPotWrite(digipot_ch[i], digipot_motor_current[i]);
|
|
|
|
digipot_current(i, digipot_motor_current[i]); |
|
|
|
} |
|
|
|
#endif |
|
|
|
#if HAS_MOTOR_CURRENT_PWM |
|
|
|
#if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) |
|
|
|
pinMode(MOTOR_CURRENT_PWM_XY_PIN, OUTPUT); |
|
|
|
digipot_current(0, motor_current_setting[0]); |
|
|
|
#endif |
|
|
|
#if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) |
|
|
|
pinMode(MOTOR_CURRENT_PWM_Z_PIN, OUTPUT); |
|
|
|
digipot_current(1, motor_current_setting[1]); |
|
|
|
#endif |
|
|
|
#if PIN_EXISTS(MOTOR_CURRENT_PWM_E) |
|
|
|
pinMode(MOTOR_CURRENT_PWM_E_PIN, OUTPUT); |
|
|
|
digipot_current(2, motor_current_setting[2]); |
|
|
|
#endif |
|
|
|
//Set timer5 to 31khz so the PWM of the motor power is as constant as possible. (removes a buzzing noise)
|
|
|
|
TCCR5B = (TCCR5B & ~(_BV(CS50) | _BV(CS51) | _BV(CS52))) | _BV(CS50); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
void Stepper::digipot_current(uint8_t driver, int current) { |
|
|
|
#if HAS_DIGIPOTSS |
|
|
|
const uint8_t digipot_ch[] = DIGIPOT_CHANNELS; |
|
|
|
digitalPotWrite(digipot_ch[driver], current); |
|
|
|
#elif HAS_MOTOR_CURRENT_PWM |
|
|
|
#define _WRITE_CURRENT_PWM(P) analogWrite(P, 255L * current / (MOTOR_CURRENT_PWM_RANGE)) |
|
|
|
switch (driver) { |
|
|
|
void Stepper::digipot_init() { |
|
|
|
#if HAS_DIGIPOTSS |
|
|
|
static const uint8_t digipot_motor_current[] = DIGIPOT_MOTOR_CURRENT; |
|
|
|
SPI.begin(); |
|
|
|
SET_OUTPUT(DIGIPOTSS_PIN); |
|
|
|
for (uint8_t i = 0; i < COUNT(digipot_motor_current); i++) { |
|
|
|
//digitalPotWrite(digipot_ch[i], digipot_motor_current[i]);
|
|
|
|
digipot_current(i, digipot_motor_current[i]); |
|
|
|
} |
|
|
|
#elif HAS_MOTOR_CURRENT_PWM |
|
|
|
#if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) |
|
|
|
case 0: _WRITE_CURRENT_PWM(MOTOR_CURRENT_PWM_XY_PIN); break; |
|
|
|
SET_OUTPUT(MOTOR_CURRENT_PWM_XY_PIN); |
|
|
|
digipot_current(0, motor_current_setting[0]); |
|
|
|
#endif |
|
|
|
#if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) |
|
|
|
case 1: _WRITE_CURRENT_PWM(MOTOR_CURRENT_PWM_Z_PIN); break; |
|
|
|
SET_OUTPUT(MOTOR_CURRENT_PWM_Z_PIN); |
|
|
|
digipot_current(1, motor_current_setting[1]); |
|
|
|
#endif |
|
|
|
#if PIN_EXISTS(MOTOR_CURRENT_PWM_E) |
|
|
|
case 2: _WRITE_CURRENT_PWM(MOTOR_CURRENT_PWM_E_PIN); break; |
|
|
|
SET_OUTPUT(MOTOR_CURRENT_PWM_E_PIN); |
|
|
|
digipot_current(2, motor_current_setting[2]); |
|
|
|
#endif |
|
|
|
} |
|
|
|
#else |
|
|
|
UNUSED(driver); |
|
|
|
UNUSED(current); |
|
|
|
#endif |
|
|
|
} |
|
|
|
//Set timer5 to 31khz so the PWM of the motor power is as constant as possible. (removes a buzzing noise)
|
|
|
|
TCCR5B = (TCCR5B & ~(_BV(CS50) | _BV(CS51) | _BV(CS52))) | _BV(CS50); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
void Stepper::microstep_init() { |
|
|
|
#if HAS_MICROSTEPS_E1 |
|
|
|
pinMode(E1_MS1_PIN, OUTPUT); |
|
|
|
pinMode(E1_MS2_PIN, OUTPUT); |
|
|
|
#endif |
|
|
|
void Stepper::digipot_current(uint8_t driver, int current) { |
|
|
|
#if HAS_DIGIPOTSS |
|
|
|
const uint8_t digipot_ch[] = DIGIPOT_CHANNELS; |
|
|
|
digitalPotWrite(digipot_ch[driver], current); |
|
|
|
#elif HAS_MOTOR_CURRENT_PWM |
|
|
|
#define _WRITE_CURRENT_PWM(P) analogWrite(P, 255L * current / (MOTOR_CURRENT_PWM_RANGE)) |
|
|
|
switch (driver) { |
|
|
|
#if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) |
|
|
|
case 0: _WRITE_CURRENT_PWM(MOTOR_CURRENT_PWM_XY_PIN); break; |
|
|
|
#endif |
|
|
|
#if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) |
|
|
|
case 1: _WRITE_CURRENT_PWM(MOTOR_CURRENT_PWM_Z_PIN); break; |
|
|
|
#endif |
|
|
|
#if PIN_EXISTS(MOTOR_CURRENT_PWM_E) |
|
|
|
case 2: _WRITE_CURRENT_PWM(MOTOR_CURRENT_PWM_E_PIN); break; |
|
|
|
#endif |
|
|
|
} |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
#if HAS_MICROSTEPS |
|
|
|
pinMode(X_MS1_PIN, OUTPUT); |
|
|
|
pinMode(X_MS2_PIN, OUTPUT); |
|
|
|
pinMode(Y_MS1_PIN, OUTPUT); |
|
|
|
pinMode(Y_MS2_PIN, OUTPUT); |
|
|
|
pinMode(Z_MS1_PIN, OUTPUT); |
|
|
|
pinMode(Z_MS2_PIN, OUTPUT); |
|
|
|
pinMode(E0_MS1_PIN, OUTPUT); |
|
|
|
pinMode(E0_MS2_PIN, OUTPUT); |
|
|
|
const uint8_t microstep_modes[] = MICROSTEP_MODES; |
|
|
|
for (uint16_t i = 0; i < COUNT(microstep_modes); i++) |
|
|
|
microstep_mode(i, microstep_modes[i]); |
|
|
|
#endif |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
/**
|
|
|
|
* Software-controlled Microstepping |
|
|
|
*/ |
|
|
|
#if HAS_MICROSTEPS |
|
|
|
|
|
|
|
/**
|
|
|
|
* Software-controlled Microstepping |
|
|
|
*/ |
|
|
|
|
|
|
|
void Stepper::microstep_ms(uint8_t driver, int8_t ms1, int8_t ms2) { |
|
|
|
if (ms1 >= 0) switch (driver) { |
|
|
|
case 0: digitalWrite(X_MS1_PIN, ms1); break; |
|
|
|
case 1: digitalWrite(Y_MS1_PIN, ms1); break; |
|
|
|
case 2: digitalWrite(Z_MS1_PIN, ms1); break; |
|
|
|
case 3: digitalWrite(E0_MS1_PIN, ms1); break; |
|
|
|
void Stepper::microstep_init() { |
|
|
|
SET_OUTPUT(X_MS1_PIN); |
|
|
|
SET_OUTPUT(X_MS2_PIN); |
|
|
|
#if HAS_MICROSTEPS_Y |
|
|
|
SET_OUTPUT(Y_MS1_PIN); |
|
|
|
SET_OUTPUT(Y_MS2_PIN); |
|
|
|
#endif |
|
|
|
#if HAS_MICROSTEPS_Z |
|
|
|
SET_OUTPUT(Z_MS1_PIN); |
|
|
|
SET_OUTPUT(Z_MS2_PIN); |
|
|
|
#endif |
|
|
|
#if HAS_MICROSTEPS_E0 |
|
|
|
SET_OUTPUT(E0_MS1_PIN); |
|
|
|
SET_OUTPUT(E0_MS2_PIN); |
|
|
|
#endif |
|
|
|
#if HAS_MICROSTEPS_E1 |
|
|
|
case 4: digitalWrite(E1_MS1_PIN, ms1); break; |
|
|
|
SET_OUTPUT(E1_MS1_PIN); |
|
|
|
SET_OUTPUT(E1_MS2_PIN); |
|
|
|
#endif |
|
|
|
static const uint8_t microstep_modes[] = MICROSTEP_MODES; |
|
|
|
for (uint16_t i = 0; i < COUNT(microstep_modes); i++) |
|
|
|
microstep_mode(i, microstep_modes[i]); |
|
|
|
} |
|
|
|
if (ms2 >= 0) switch (driver) { |
|
|
|
case 0: digitalWrite(X_MS2_PIN, ms2); break; |
|
|
|
case 1: digitalWrite(Y_MS2_PIN, ms2); break; |
|
|
|
case 2: digitalWrite(Z_MS2_PIN, ms2); break; |
|
|
|
case 3: digitalWrite(E0_MS2_PIN, ms2); break; |
|
|
|
#if PIN_EXISTS(E1_MS2) |
|
|
|
case 4: digitalWrite(E1_MS2_PIN, ms2); break; |
|
|
|
#endif |
|
|
|
|
|
|
|
void Stepper::microstep_ms(uint8_t driver, int8_t ms1, int8_t ms2) { |
|
|
|
if (ms1 >= 0) switch (driver) { |
|
|
|
case 0: digitalWrite(X_MS1_PIN, ms1); break; |
|
|
|
#if HAS_MICROSTEPS_Y |
|
|
|
case 1: digitalWrite(Y_MS1_PIN, ms1); break; |
|
|
|
#endif |
|
|
|
#if HAS_MICROSTEPS_Z |
|
|
|
case 2: digitalWrite(Z_MS1_PIN, ms1); break; |
|
|
|
#endif |
|
|
|
#if HAS_MICROSTEPS_E0 |
|
|
|
case 3: digitalWrite(E0_MS1_PIN, ms1); break; |
|
|
|
#endif |
|
|
|
#if HAS_MICROSTEPS_E1 |
|
|
|
case 4: digitalWrite(E1_MS1_PIN, ms1); break; |
|
|
|
#endif |
|
|
|
} |
|
|
|
if (ms2 >= 0) switch (driver) { |
|
|
|
case 0: digitalWrite(X_MS2_PIN, ms2); break; |
|
|
|
#if HAS_MICROSTEPS_Y |
|
|
|
case 1: digitalWrite(Y_MS2_PIN, ms2); break; |
|
|
|
#endif |
|
|
|
#if HAS_MICROSTEPS_Z |
|
|
|
case 2: digitalWrite(Z_MS2_PIN, ms2); break; |
|
|
|
#endif |
|
|
|
#if HAS_MICROSTEPS_E0 |
|
|
|
case 3: digitalWrite(E0_MS2_PIN, ms2); break; |
|
|
|
#endif |
|
|
|
#if HAS_MICROSTEPS_E1 |
|
|
|
case 4: digitalWrite(E1_MS2_PIN, ms2); break; |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void Stepper::microstep_mode(uint8_t driver, uint8_t stepping_mode) { |
|
|
|
switch (stepping_mode) { |
|
|
|
case 1: microstep_ms(driver, MICROSTEP1); break; |
|
|
|
case 2: microstep_ms(driver, MICROSTEP2); break; |
|
|
|
case 4: microstep_ms(driver, MICROSTEP4); break; |
|
|
|
case 8: microstep_ms(driver, MICROSTEP8); break; |
|
|
|
case 16: microstep_ms(driver, MICROSTEP16); break; |
|
|
|
void Stepper::microstep_mode(uint8_t driver, uint8_t stepping_mode) { |
|
|
|
switch (stepping_mode) { |
|
|
|
case 1: microstep_ms(driver, MICROSTEP1); break; |
|
|
|
case 2: microstep_ms(driver, MICROSTEP2); break; |
|
|
|
case 4: microstep_ms(driver, MICROSTEP4); break; |
|
|
|
case 8: microstep_ms(driver, MICROSTEP8); break; |
|
|
|
case 16: microstep_ms(driver, MICROSTEP16); break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void Stepper::microstep_readings() { |
|
|
|
SERIAL_PROTOCOLLNPGM("MS1,MS2 Pins"); |
|
|
|
SERIAL_PROTOCOLPGM("X: "); |
|
|
|
SERIAL_PROTOCOL(READ(X_MS1_PIN)); |
|
|
|
SERIAL_PROTOCOLLN(READ(X_MS2_PIN)); |
|
|
|
SERIAL_PROTOCOLPGM("Y: "); |
|
|
|
SERIAL_PROTOCOL(READ(Y_MS1_PIN)); |
|
|
|
SERIAL_PROTOCOLLN(READ(Y_MS2_PIN)); |
|
|
|
SERIAL_PROTOCOLPGM("Z: "); |
|
|
|
SERIAL_PROTOCOL(READ(Z_MS1_PIN)); |
|
|
|
SERIAL_PROTOCOLLN(READ(Z_MS2_PIN)); |
|
|
|
SERIAL_PROTOCOLPGM("E0: "); |
|
|
|
SERIAL_PROTOCOL(READ(E0_MS1_PIN)); |
|
|
|
SERIAL_PROTOCOLLN(READ(E0_MS2_PIN)); |
|
|
|
#if HAS_MICROSTEPS_E1 |
|
|
|
SERIAL_PROTOCOLPGM("E1: "); |
|
|
|
SERIAL_PROTOCOL(READ(E1_MS1_PIN)); |
|
|
|
SERIAL_PROTOCOLLN(READ(E1_MS2_PIN)); |
|
|
|
#endif |
|
|
|
} |
|
|
|
void Stepper::microstep_readings() { |
|
|
|
SERIAL_PROTOCOLLNPGM("MS1,MS2 Pins"); |
|
|
|
SERIAL_PROTOCOLPGM("X: "); |
|
|
|
SERIAL_PROTOCOL(READ(X_MS1_PIN)); |
|
|
|
SERIAL_PROTOCOLLN(READ(X_MS2_PIN)); |
|
|
|
#if HAS_MICROSTEPS_Y |
|
|
|
SERIAL_PROTOCOLPGM("Y: "); |
|
|
|
SERIAL_PROTOCOL(READ(Y_MS1_PIN)); |
|
|
|
SERIAL_PROTOCOLLN(READ(Y_MS2_PIN)); |
|
|
|
#endif |
|
|
|
#if HAS_MICROSTEPS_Z |
|
|
|
SERIAL_PROTOCOLPGM("Z: "); |
|
|
|
SERIAL_PROTOCOL(READ(Z_MS1_PIN)); |
|
|
|
SERIAL_PROTOCOLLN(READ(Z_MS2_PIN)); |
|
|
|
#endif |
|
|
|
#if HAS_MICROSTEPS_E0 |
|
|
|
SERIAL_PROTOCOLPGM("E0: "); |
|
|
|
SERIAL_PROTOCOL(READ(E0_MS1_PIN)); |
|
|
|
SERIAL_PROTOCOLLN(READ(E0_MS2_PIN)); |
|
|
|
#endif |
|
|
|
#if HAS_MICROSTEPS_E1 |
|
|
|
SERIAL_PROTOCOLPGM("E1: "); |
|
|
|
SERIAL_PROTOCOL(READ(E1_MS1_PIN)); |
|
|
|
SERIAL_PROTOCOLLN(READ(E1_MS2_PIN)); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
#endif // HAS_MICROSTEPS
|
|
|
|
|
|
|
|
#if ENABLED(LIN_ADVANCE) |
|
|
|
|
|
|
|