From 63cc0744d6e84ad485dd960a60051e06b0359f95 Mon Sep 17 00:00:00 2001 From: Marcio Teixeira Date: Wed, 11 Oct 2017 15:51:39 -0600 Subject: [PATCH] Support for EinsyRambo 0.3; improved M119 and M914 - Now supports EinsyRambo 0.3 - M119 now shows average stallguard values for previous planner motion. - M914 now disables stealthchop to allow SGT to be hand-tuned. - Now using SERIAL_ECHO rather than SERIAL_PROTOCOL. - M914 now allows negative values without overflow. --- Marlin/Conditionals_LulzBot.h | 160 +++++++++++++++++----------------- Marlin/Marlin_main.cpp | 3 +- Marlin/endstops.cpp | 4 +- Marlin/pins_EINSYRAMBO.h | 17 ++-- 4 files changed, 96 insertions(+), 88 deletions(-) diff --git a/Marlin/Conditionals_LulzBot.h b/Marlin/Conditionals_LulzBot.h index e4d645219..264cc01d3 100644 --- a/Marlin/Conditionals_LulzBot.h +++ b/Marlin/Conditionals_LulzBot.h @@ -66,6 +66,7 @@ #define LULZBOT_USE_EINSYRAMBO #define LULZBOT_USE_AUTOLEVELING #define LULZBOT_SENSORLESS_HOMING + #define LULZBOT_SENSORLESS_PROBING #define LULZBOT_BAUDRATE 115200 #define LULZBOT_UUID "4479bf92-7e47-4c2c-be95-64dd01bd413b" #endif @@ -107,9 +108,7 @@ #define LULZBOT_USE_EARLY_EINSY #define LULZBOT_TWO_PIECE_BED #define LULZBOT_USE_AUTOLEVELING - #define LULZBOT_USE_MIN_ENDSTOPS - #define LULZBOT_USE_MAX_ENDSTOPS - #define LULZBOT_USE_NORMALLY_CLOSED_ENDSTOPS + #define LULZBOT_SENSORLESS_HOMING #define LULZBOT_BAUDRATE 250000 #define LULZBOT_PRINTCOUNTER #define LULZBOT_UUID "e5502411-d46d-421d-ba3a-a20126d7930f" @@ -125,9 +124,7 @@ #define LULZBOT_USE_LCD_DISPLAY #define LULZBOT_TWO_PIECE_BED #define LULZBOT_USE_AUTOLEVELING - #define LULZBOT_USE_MIN_ENDSTOPS - #define LULZBOT_USE_MAX_ENDSTOPS - #define LULZBOT_USE_NORMALLY_CLOSED_ENDSTOPS + #define LULZBOT_SENSORLESS_HOMING #define LULZBOT_BAUDRATE 250000 #define LULZBOT_PRINTCOUNTER #define LULZBOT_UUID "e5502411-d46d-421d-ba3a-a20126d7930f" @@ -1021,10 +1018,6 @@ st.shaft_dir(1); \ st.external_ref(0); /* I_scale_analog = 0 */ \ st.internal_sense_R(0); /* internal_Rsense = 0 */ \ - /* Disable short protection since this generates false positives - on the Z axis when probing. - */ \ - //st.disable_short_protection(1) #define LULZBOT_TMC_HEALTHCHECK(AXIS) \ { \ @@ -1033,7 +1026,7 @@ AXIS##_DIR_WRITE(0); DIR_0 = (stepper##AXIS.IOIN() >> 1) & 0b1; \ AXIS##_DIR_WRITE(1); DIR_1 = (stepper##AXIS.IOIN() >> 1) & 0b1; \ if(!ALWAYS_1 || DIR_0 != 0 || DIR_1 != 1) { \ - SERIAL_PROTOCOLPGM("Failed TMC driver health check!"); \ + SERIAL_ECHOPGM("Failed TMC driver health check!"); \ } \ } @@ -1043,6 +1036,8 @@ uint32_t IOIN = stepper##AXIS.IOIN(); \ uint32_t IHOLD_IRUN = stepper##AXIS.IHOLD_IRUN(); \ uint32_t CHOPCONF = stepper##AXIS.CHOPCONF(); \ + uint32_t COOLCONF = stepper##AXIS.COOLCONF(); \ + int8_t SGT = (COOLCONF >> 16) & 0b1111111; \ uint16_t SG_RESULT = (DRVSTATUS) & 0b111111111; \ bool drv_enn = (IOIN >> 4) & 0b1; \ bool stst = (DRVSTATUS >> 31) & 0b1; \ @@ -1056,29 +1051,38 @@ uint16_t ihold = (IHOLD_IRUN) & 0b11111; \ uint16_t irun = (IHOLD_IRUN >> 8) & 0b11111; \ bool vsense = (CHOPCONF >> 17) & 0b1; \ - SERIAL_PROTOCOLPGM("TMC_" #AXIS ": "); \ - if(!drv_enn) SERIAL_PROTOCOLPGM("en "); \ - if(stst) SERIAL_PROTOCOLPGM("st "); \ - if(olb) SERIAL_PROTOCOLPGM("olb "); \ - if(ola) SERIAL_PROTOCOLPGM("ola "); \ - if(s2gb) SERIAL_PROTOCOLPGM("s2gb "); \ - if(s2ga) SERIAL_PROTOCOLPGM("s2ga "); \ - if(otpw) SERIAL_PROTOCOLPGM("otpw "); \ - if(ot) SERIAL_PROTOCOLPGM("ot "); \ - if(fsactive) SERIAL_PROTOCOLPGM("fsactive "); \ - SERIAL_PROTOCOLPGM("ihold_irun:"); \ - SERIAL_PROTOCOL(ihold); \ - SERIAL_PROTOCOLPGM("/"); \ - SERIAL_PROTOCOL(irun); \ - SERIAL_PROTOCOLPGM(" vsense:"); \ - SERIAL_PROTOCOL(vsense); \ - SERIAL_PROTOCOLPGM(" SGR:"); \ - SERIAL_PROTOCOLLN(SG_RESULT); \ + SERIAL_ECHOPGM(" " #AXIS ":"); \ + SERIAL_ECHOPGM(" ihr:"); \ + SERIAL_ECHO(ihold); \ + SERIAL_ECHOPGM("/"); \ + SERIAL_ECHO(irun); \ + SERIAL_ECHOPGM(" vsen:"); \ + SERIAL_ECHO(vsense); \ + if(stepper##AXIS.coolstep_min_speed() == 1024UL * 1024UL - 1UL) { \ + SERIAL_ECHOPGM(" sgt:"); \ + SERIAL_ECHO(LULZBOT_SIGN_EXTEND_SGT(SGT)); \ + if(num_sg > 0) { \ + SERIAL_ECHOPGM(" avg_sg:"); \ + SERIAL_ECHO(sum_sg_##AXIS/num_sg); \ + } \ + } else { \ + SERIAL_ECHOPGM(" stealth"); \ + } \ + if(!drv_enn) SERIAL_ECHOPGM(" en"); \ + if(stst) SERIAL_ECHOPGM(" st"); \ + if(olb) SERIAL_ECHOPGM(" olb"); \ + if(ola) SERIAL_ECHOPGM(" ola"); \ + if(s2gb) SERIAL_ECHOPGM(" s2gb"); \ + if(s2ga) SERIAL_ECHOPGM(" s2ga"); \ + if(otpw) SERIAL_ECHOPGM(" otpw"); \ + if(ot) SERIAL_ECHOPGM(" ot"); \ + if(fsactive) SERIAL_ECHOPGM(" fsactive"); \ + SERIAL_ECHOLN(""); \ } - /* For reasons unknown, s2ga and s2gb seem to be getting triggered - * during probing at the end of Z motions. This checks to see if - * these flags are set, and if so, resets the drivers */ + #define LULZBOT_SIGN_EXTEND_SGT(sgt) int8_t(sgt | ((sgt << 1) & 0x80)) + + /* This checks to see if the s2ga and s2gb flags are set */ #define LULZBOT_TMC_CHECK_S2G(AXIS, WHERE) \ { \ safe_delay(100); \ @@ -1086,76 +1090,65 @@ bool s2gb = (DRVSTATUS >> 28) & 0b1; \ bool s2ga = (DRVSTATUS >> 27) & 0b1; \ if(s2ga || s2gb) { \ - SERIAL_PROTOCOLLN("s2g detected in checkpoint#" #WHERE); \ - /* Z_ENABLE_WRITE(!Z_ENABLE_ON); */ \ - /* Z_ENABLE_WRITE( Z_ENABLE_ON); */ \ + SERIAL_ECHOLN("s2g detected in checkpoint#" #WHERE); \ } \ } #define LULZBOT_PROBE_DIAGNOSTICS(TRIGGERED) \ if(TRIGGERED) \ - SERIAL_ERRORLNPGM("Probe triggered"); \ + SERIAL_ECHOLNPGM("Probe triggered"); \ else \ SERIAL_ERRORLNPGM("Probe not triggered"); /* The following function accumulates the average of a - stallguard value during a planner move and reports - it once the motion ends */ - #define LULZBOT_TMC_STALLGUARD_AVERAGE(AXIS, SUM, NUM) \ - static uint8_t current_tail; \ - static uint32_t SUM; \ - static uint16_t NUM; \ - if(current_tail != planner.block_buffer_tail) { \ - current_tail = planner.block_buffer_tail; \ - /* When the planner finishes move, report results */ \ - SERIAL_ECHOLNPAIR(#AXIS " avg_sg: ", SUM/NUM); \ - SUM = 0; \ - NUM = 0; \ - } else if(planner.blocks_queued()) { \ - /* While in motion, accumulate sg values */ \ - SUM += stepper##AXIS.DRV_STATUS() & 0b111111111; \ - NUM++; \ - } - - /* The following function reports when the average of the - stallguard value changes significantly */ - #define LULZBOT_TMC_STALLGUARD_REPORT_CHANGES(AXIS, SUM, NUM, THRESH) \ - static uint8_t current_tail; \ - static uint32_t SUM; \ - static uint16_t NUM; \ - static uint16_t last_avg; \ - if(current_tail != planner.block_buffer_tail) { \ - current_tail = planner.block_buffer_tail; \ - uint16_t avg = SUM/NUM; \ - if(abs(int(last_avg) - avg) > last_avg * THRESH) { \ - SERIAL_ECHOLNPAIR("Detected changed in sg value:", avg - last_avg); \ + stallguard values during a planner move */ + #define LULZBOT_TMC_STALLGUARD_AVG_VARS \ + static uint8_t current_tail, tally_freq = 10; \ + static uint32_t sum_sg_X = 0, sum_sg_Y = 0, sum_sg_Z = 0, sum_sg_E0 = 0, num_sg = 0; + + #define LULZBOT_TMC_STALLGUARD_AVG_FUNC \ + if(--tally_freq == 0) { \ + tally_freq = 10; \ + if(planner.blocks_queued()) { \ + /* Reset accumulators at the start of each movement */ \ + if(current_tail != planner.block_buffer_tail) { \ + current_tail = planner.block_buffer_tail; \ + sum_sg_X = sum_sg_Y = sum_sg_Z = sum_sg_E0 = num_sg = 0; \ + } \ + /* While in motion, accumulate sg values */ \ + sum_sg_X += stepperX.DRV_STATUS() & 0b111111111; \ + sum_sg_Y += stepperY.DRV_STATUS() & 0b111111111; \ + sum_sg_Z += stepperZ.DRV_STATUS() & 0b111111111; \ + sum_sg_E0 += stepperE0.DRV_STATUS() & 0b111111111; \ + num_sg++; \ } \ - SERIAL_ECHOLNPAIR(#AXIS " avg_sg: ", avg); \ - last_avg = avg; \ - SUM = 0; \ - NUM = 0; \ - } else if(planner.blocks_queued()) { \ - /* While in motion, accumulate sg values */ \ - SUM += stepper##AXIS.DRV_STATUS() & 0b111111111; \ - NUM++; \ } - #define LULZBOT_TMC_G0G1_STALLGUARD_REPORT \ - LULZBOT_TMC_STALLGUARD_AVERAGE(E0, sg_sum_e, sg_num_e) - - //#define LULZBOT_TMC_G0G1_STALLGUARD_REPORT - #define LULZBOT_TMC_M119_STALLGUARD_REPORT \ + SERIAL_ECHOLNPGM("TMC2130 Status:"); \ LULZBOT_TMC_REPORT(X) \ LULZBOT_TMC_REPORT(Y) \ - LULZBOT_TMC_REPORT(Z) + LULZBOT_TMC_REPORT(Z) \ + LULZBOT_TMC_REPORT(E0) + + #define LULZBOT_ENABLE_STALLGUARD(st) \ + /* Enable stallguard by disabling steathchop */ \ + st.coolstep_min_speed(1024UL * 1024UL - 1UL); #define LULZBOT_TMC2130_ADV { \ /* Turn off stealhchop for extruder motor */ \ - stepperE0.coolstep_min_speed(1024UL * 1024UL - 1UL); \ + LULZBOT_ENABLE_STALLGUARD(stepperE0) \ /* Set stallguard value for filament sensing */ \ stepperE0.sg_stall_value(5); \ + /* Turn off stealhchop for Z motor */ \ + LULZBOT_ENABLE_STALLGUARD(stepperZ) \ + /* Set stallguard value for Z sensing */ \ + stepperZ.sg_stall_value(5); \ } + + #define LULZBOT_M914_DISABLES_STEALTHCHOP(st) \ + LULZBOT_ENABLE_STALLGUARD(st) + #else #define LULZBOT_TMC_M119_STALLGUARD_REPORT #define LULZBOT_TMC_G0G1_STALLGUARD_REPORT @@ -1179,6 +1172,11 @@ #define LULZBOT_Z_MAX_ENDSTOP_INVERTING LULZBOT_NORMALLY_OPEN_ENDSTOP + #if defined(LULZBOT_SENSORLESS_PROBING) + #define LULZBOT_Z_MIN_ENDSTOP_INVERTING LULZBOT_NORMALLY_CLOSED_ENDSTOP + #define LULZBOT_Z_MIN_PROBE_ENDSTOP_INVERTING LULZBOT_NORMALLY_CLOSED_ENDSTOP + #endif + #define LULZBOT_X_HOME_BUMP_MM 0 #define LULZBOT_Y_HOME_BUMP_MM 0 diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index a166df1e8..1d22c327f 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -9933,9 +9933,10 @@ inline void gcode_M502() { static void tmc2130_get_sgt(TMC2130Stepper &st, const char name) { SERIAL_CHAR(name); - SERIAL_ECHOLNPAIR(" driver homing sensitivity set to ", st.sgt()); + SERIAL_ECHOLNPAIR(" driver homing sensitivity set to ", LULZBOT_SIGN_EXTEND_SGT(st.sgt())); } static void tmc2130_set_sgt(TMC2130Stepper &st, const char name, const int8_t sgt_val) { + LULZBOT_M914_DISABLES_STEALTHCHOP(st) st.sgt(sgt_val); tmc2130_get_sgt(st, name); } diff --git a/Marlin/endstops.cpp b/Marlin/endstops.cpp index 9f217c088..1dff4ec16 100644 --- a/Marlin/endstops.cpp +++ b/Marlin/endstops.cpp @@ -133,6 +133,8 @@ void Endstops::init() { } // Endstops::init +LULZBOT_TMC_STALLGUARD_AVG_VARS + void Endstops::report_state() { if (endstop_hit_bits) { #if ENABLED(ULTRA_LCD) @@ -181,7 +183,7 @@ void Endstops::report_state() { } #endif } - LULZBOT_TMC_G0G1_STALLGUARD_REPORT + LULZBOT_TMC_STALLGUARD_AVG_FUNC } // Endstops::report_state void Endstops::M119() { diff --git a/Marlin/pins_EINSYRAMBO.h b/Marlin/pins_EINSYRAMBO.h index 8074441b5..013226d4f 100644 --- a/Marlin/pins_EINSYRAMBO.h +++ b/Marlin/pins_EINSYRAMBO.h @@ -38,11 +38,18 @@ #define Z_IS_TMC2130 #define E0_IS_TMC2130 -#define BOARD_Z_THRES_PIN 57 // PF3 as defined in "fastio_1280.h" -#define BOARD_X_DIAG_PIN 64 // PK2 as defined in "fastio_1280.h" -#define BOARD_Y_DIAG_PIN 69 // PK7 as defined in "fastio_1280.h" -#define BOARD_Z_DIAG_PIN 68 // PK6 as defined in "fastio_1280.h" -#define BOARD_E0_DIAG_PIN 65 // PK3 as defined in "fastio_1280.h" +#if defined(LULZBOT_USE_EARLY_EINSY) + #define BOARD_X_DIAG_PIN 40 // PG1 as defined in "fastio_1280.h" + #define BOARD_Y_DIAG_PIN 69 // PK7 as defined in "fastio_1280.h" + #define BOARD_Z_DIAG_PIN 68 // PK6 as defined in "fastio_1280.h" + #define BOARD_E0_DIAG_PIN 65 // PK3 as defined in "fastio_1280.h" +#else + #define BOARD_Z_THRES_PIN 57 // PF3 as defined in "fastio_1280.h" + #define BOARD_X_DIAG_PIN 64 // PK2 as defined in "fastio_1280.h" + #define BOARD_Y_DIAG_PIN 69 // PK7 as defined in "fastio_1280.h" + #define BOARD_Z_DIAG_PIN 68 // PK6 as defined in "fastio_1280.h" + #define BOARD_E0_DIAG_PIN 65 // PK3 as defined in "fastio_1280.h" +#endif #define BOARD_X_MIN_PIN 12 #define BOARD_Y_MIN_PIN 11 #define BOARD_Z_MIN_PIN 10