From 3d299cc412ac8e1dbec59725a1dba7c1a446f14d Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Wed, 14 Mar 2018 21:05:47 +0100 Subject: [PATCH 1/4] Document. --- Firmware/Dcodes.cpp | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/Firmware/Dcodes.cpp b/Firmware/Dcodes.cpp index f01d2f5a..c4663db5 100644 --- a/Firmware/Dcodes.cpp +++ b/Firmware/Dcodes.cpp @@ -456,6 +456,38 @@ void dcode_12() #include "planner.h" extern void st_synchronize(); +/** + * @brief D2130 Trinamic stepper controller + * D2130[subcommand][value] + * * Axis + * * * 'X' + * * * 'Y' + * * * 'Z' + * * * 'E' + * * command + * * * '0' current off + * * * '1' current on + * * * '+' single step + * * * * value sereval steps + * * * '-' dtto oposite direction + * * * '?' read register + * * * * "mres" + * * * * "step" + * * * * "mscnt" + * * * * "mscuract" + * * * * "wave" + * * * '!' set register + * * * * "mres" + * * * * "step" + * * * * "wave" + * * * * *0, 180..250 meaning: off, 0.9..1.25, recommended value is 1.1 + * * * '@' home calibrate axis + * + * Example: + * D2130E?wave //print extruder microstep linearity compensation curve + * D2130E!wave0 //disable extruder linearity compensation curve, (sine curve is used) + * D2130E!wave220 // (sin(x))^1.1 extruder microstep compensation curve used + */ void dcode_2130() { printf_P(PSTR("D2130 - TMC2130\n")); From 397e7d47919470cce0f04ee9ee8b00e9034b6a58 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Thu, 22 Mar 2018 19:53:58 +0100 Subject: [PATCH 2/4] Increase resolution of wave factor. --- Firmware/Dcodes.cpp | 10 +++---- Firmware/tmc2130.cpp | 12 ++++----- Firmware/tmc2130.h | 12 ++++----- Firmware/ultralcd.cpp | 26 +++++++++---------- .../ultralcd_implementation_hitachi_HD44780.h | 2 +- 5 files changed, 31 insertions(+), 31 deletions(-) diff --git a/Firmware/Dcodes.cpp b/Firmware/Dcodes.cpp index c4663db5..4b47a762 100644 --- a/Firmware/Dcodes.cpp +++ b/Firmware/Dcodes.cpp @@ -574,11 +574,11 @@ void dcode_2130() } else if (strncmp(strchr_pointer + 7, "wave", 4) == 0) { - uint8_t fac200 = atoi(strchr_pointer + 11) & 0xff; - if (fac200 < TMC2130_WAVE_FAC200_MIN) fac200 = 0; - if (fac200 > TMC2130_WAVE_FAC200_MAX) fac200 = TMC2130_WAVE_FAC200_MAX; - tmc2130_set_wave(axis, 247, fac200); - tmc2130_wave_fac[axis] = fac200; + uint16_t fac1000 = atoi(strchr_pointer + 11) & 0xffff; + if (fac1000 < TMC2130_WAVE_FAC1000_MIN) fac1000 = 0; + if (fac1000 > TMC2130_WAVE_FAC1000_MAX) fac1000 = TMC2130_WAVE_FAC1000_MAX; + tmc2130_set_wave(axis, 247, fac1000); + tmc2130_wave_fac[axis] = fac1000; } } else if (strchr_pointer[1+5] == '@') diff --git a/Firmware/tmc2130.cpp b/Firmware/tmc2130.cpp index 58f84cf4..b17e4f30 100644 --- a/Firmware/tmc2130.cpp +++ b/Firmware/tmc2130.cpp @@ -58,7 +58,7 @@ uint8_t tmc2130_home_origin[2] = {0, 0}; uint8_t tmc2130_home_bsteps[2] = {48, 48}; uint8_t tmc2130_home_fsteps[2] = {48, 48}; -uint8_t tmc2130_wave_fac[4] = {0, 0, 0, 0}; +uint16_t tmc2130_wave_fac[4] = {0, 0, 0, 0}; bool tmc2130_sg_stop_on_crash = true; uint8_t tmc2130_sg_diag_mask = 0x00; @@ -821,14 +821,14 @@ void tmc2130_get_wave(uint8_t axis, uint8_t* data, FILE* stream) tmc2130_setup_chopper(axis, tmc2130_mres[axis], tmc2130_current_h[axis], tmc2130_current_r[axis]); } -void tmc2130_set_wave(uint8_t axis, uint8_t amp, uint8_t fac200) +void tmc2130_set_wave(uint8_t axis, uint8_t amp, uint16_t fac1000) { // TMC2130 wave compression algorithm // optimized for minimal memory requirements - printf_P(PSTR("tmc2130_set_wave %d %d\n"), axis, fac200); - if (fac200 < TMC2130_WAVE_FAC200_MIN) fac200 = 0; - if (fac200 > TMC2130_WAVE_FAC200_MAX) fac200 = TMC2130_WAVE_FAC200_MAX; - float fac = (float)fac200/200; //correction factor + printf_P(PSTR("tmc2130_set_wave %d %d\n"), axis, fac1000); + if (fac1000 < TMC2130_WAVE_FAC1000_MIN) fac1000 = 0; + if (fac1000 > TMC2130_WAVE_FAC1000_MAX) fac1000 = TMC2130_WAVE_FAC1000_MAX; + float fac = (float)fac1000/1000; //correction factor uint8_t vA = 0; //value of currentA uint8_t va = 0; //previous vA uint8_t d0 = 0; //delta0 diff --git a/Firmware/tmc2130.h b/Firmware/tmc2130.h index 4f93a0c3..a81fad26 100644 --- a/Firmware/tmc2130.h +++ b/Firmware/tmc2130.h @@ -23,16 +23,16 @@ extern uint32_t tmc2130_sg_meassure_val; #define TMC2130_MODE_NORMAL 0 #define TMC2130_MODE_SILENT 1 -#define TMC2130_WAVE_FAC200_MIN 180 -#define TMC2130_WAVE_FAC200_MAX 250 -#define TMC2130_WAVE_FAC200_STP 1 +#define TMC2130_WAVE_FAC1000_MIN 900 +#define TMC2130_WAVE_FAC1000_MAX 1250 +#define TMC2130_WAVE_FAC1000_STP 1 extern uint8_t tmc2130_home_enabled; extern uint8_t tmc2130_home_origin[2]; extern uint8_t tmc2130_home_bsteps[2]; extern uint8_t tmc2130_home_fsteps[2]; -extern uint8_t tmc2130_wave_fac[4]; +extern uint16_t tmc2130_wave_fac[4]; //initialize tmc2130 @@ -117,8 +117,8 @@ extern void tmc2130_do_step(uint8_t axis); extern void tmc2130_do_steps(uint8_t axis, uint16_t steps, uint8_t dir, uint16_t delay_us); extern void tmc2130_goto_step(uint8_t axis, uint8_t step, uint8_t dir, uint16_t delay_us, uint16_t microstep_resolution); extern void tmc2130_get_wave(uint8_t axis, uint8_t* data, FILE* stream); -extern void tmc2130_set_wave(uint8_t axis, uint8_t amp, uint8_t fac200); +extern void tmc2130_set_wave(uint8_t axis, uint8_t amp, uint16_t fac1000); extern bool tmc2130_home_calibrate(uint8_t axis); -#endif //TMC2130_H \ No newline at end of file +#endif //TMC2130_H diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index c0452c36..f51171f4 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -240,7 +240,7 @@ static void menu_action_setlang(unsigned char lang); static void menu_action_sdfile(const char* filename, char* longFilename); static void menu_action_sddirectory(const char* filename, char* longFilename); static void menu_action_setting_edit_bool(const char* pstr, bool* ptr); -static void menu_action_setting_edit_wfac(const char* pstr, uint8_t* ptr, uint8_t minValue, uint8_t maxValue); +static void menu_action_setting_edit_wfac(const char* pstr, uint16_t* ptr, uint16_t minValue, uint16_t maxValue); static void menu_action_setting_edit_mres(const char* pstr, uint8_t* ptr, uint8_t minValue, uint8_t maxValue); static void menu_action_setting_edit_byte3(const char* pstr, uint8_t* ptr, uint8_t minValue, uint8_t maxValue); static void menu_action_setting_edit_int3(const char* pstr, int* ptr, int minValue, int maxValue); @@ -1525,7 +1525,7 @@ static void lcd_menu_extruder_info() lcd.print(itostr3(pat9125_b)); // Display LASER shutter time from Filament sensor - /* Shutter register is an index of LASER shutter time. It is automatically controlled by the chip’s internal + /* Shutter register is an index of LASER shutter time. It is automatically controlled by the chip�s internal auto-exposure algorithm. When the chip is tracking on a good reflection surface, the Shutter is small. When the chip is tracking on a poor reflection surface, the Shutter is large. Value ranges from 0 to 46. */ @@ -4108,10 +4108,10 @@ static void lcd_ustep_linearity_menu_save() static void lcd_ustep_linearity_menu_back() { bool changed = false; - if (tmc2130_wave_fac[X_AXIS] < TMC2130_WAVE_FAC200_MIN) tmc2130_wave_fac[X_AXIS] = 0; - if (tmc2130_wave_fac[Y_AXIS] < TMC2130_WAVE_FAC200_MIN) tmc2130_wave_fac[Y_AXIS] = 0; - if (tmc2130_wave_fac[Z_AXIS] < TMC2130_WAVE_FAC200_MIN) tmc2130_wave_fac[Z_AXIS] = 0; - if (tmc2130_wave_fac[E_AXIS] < TMC2130_WAVE_FAC200_MIN) tmc2130_wave_fac[E_AXIS] = 0; + if (tmc2130_wave_fac[X_AXIS] < TMC2130_WAVE_FAC1000_MIN) tmc2130_wave_fac[X_AXIS] = 0; + if (tmc2130_wave_fac[Y_AXIS] < TMC2130_WAVE_FAC1000_MIN) tmc2130_wave_fac[Y_AXIS] = 0; + if (tmc2130_wave_fac[Z_AXIS] < TMC2130_WAVE_FAC1000_MIN) tmc2130_wave_fac[Z_AXIS] = 0; + if (tmc2130_wave_fac[E_AXIS] < TMC2130_WAVE_FAC1000_MIN) tmc2130_wave_fac[E_AXIS] = 0; changed |= (eeprom_read_byte((uint8_t*)EEPROM_TMC2130_WAVE_X_FAC) != tmc2130_wave_fac[X_AXIS]); changed |= (eeprom_read_byte((uint8_t*)EEPROM_TMC2130_WAVE_Y_FAC) != tmc2130_wave_fac[Y_AXIS]); changed |= (eeprom_read_byte((uint8_t*)EEPROM_TMC2130_WAVE_Z_FAC) != tmc2130_wave_fac[Z_AXIS]); @@ -4145,10 +4145,10 @@ static void lcd_ustep_linearity_menu() MENU_ITEM(back, PSTR("Experimental"), lcd_ustep_linearity_menu_back); MENU_ITEM(function, PSTR("Reset correction"), lcd_ustep_linearity_menu_reset); MENU_ITEM(function, PSTR("Recomended config"), lcd_ustep_linearity_menu_recomended); - MENU_ITEM_EDIT(wfac, PSTR("X-correction"), &tmc2130_wave_fac[X_AXIS], TMC2130_WAVE_FAC200_MIN-TMC2130_WAVE_FAC200_STP, TMC2130_WAVE_FAC200_MAX); - MENU_ITEM_EDIT(wfac, PSTR("Y-correction"), &tmc2130_wave_fac[Y_AXIS], TMC2130_WAVE_FAC200_MIN-TMC2130_WAVE_FAC200_STP, TMC2130_WAVE_FAC200_MAX); - MENU_ITEM_EDIT(wfac, PSTR("Z-correction"), &tmc2130_wave_fac[Z_AXIS], TMC2130_WAVE_FAC200_MIN-TMC2130_WAVE_FAC200_STP, TMC2130_WAVE_FAC200_MAX); - MENU_ITEM_EDIT(wfac, PSTR("E-correction"), &tmc2130_wave_fac[E_AXIS], TMC2130_WAVE_FAC200_MIN-TMC2130_WAVE_FAC200_STP, TMC2130_WAVE_FAC200_MAX); + MENU_ITEM_EDIT(wfac, PSTR("X-correction"), &tmc2130_wave_fac[X_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX); + MENU_ITEM_EDIT(wfac, PSTR("Y-correction"), &tmc2130_wave_fac[Y_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX); + MENU_ITEM_EDIT(wfac, PSTR("Z-correction"), &tmc2130_wave_fac[Z_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX); + MENU_ITEM_EDIT(wfac, PSTR("E-correction"), &tmc2130_wave_fac[E_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX); END_MENU(); } @@ -5844,9 +5844,9 @@ char *mres_to_str3(const uint8_t &x) extern char conv[8]; // Convert tmc2130 wfac to string -char *wfac_to_str5(const uint8_t &x) +char *wfac_to_str5(const uint16_t &x) { - if (x>=TMC2130_WAVE_FAC200_MIN) return ftostr43(((float)(x & 0xff))/200); + if (x>=TMC2130_WAVE_FAC1000_MIN) return ftostr43(((float)(x & 0xffff))/1000); conv[0] = ' '; conv[1] = ' '; conv[2] = 'O'; @@ -5856,7 +5856,7 @@ char *wfac_to_str5(const uint8_t &x) return conv; } -menu_edit_type(uint8_t, wfac, wfac_to_str5, 1) +menu_edit_type(uint16_t, wfac, wfac_to_str5, 1) menu_edit_type(uint8_t, mres, mres_to_str3, 1) menu_edit_type(uint8_t, byte3, itostr3, 1) menu_edit_type(int, int3, itostr3, 1) diff --git a/Firmware/ultralcd_implementation_hitachi_HD44780.h b/Firmware/ultralcd_implementation_hitachi_HD44780.h index 0d9db3e7..48c91fe8 100644 --- a/Firmware/ultralcd_implementation_hitachi_HD44780.h +++ b/Firmware/ultralcd_implementation_hitachi_HD44780.h @@ -1146,7 +1146,7 @@ static void lcd_implementation_drawmenu_setting_edit_generic_P(uint8_t row, cons } -extern char *wfac_to_str5(const uint8_t &x); +extern char *wfac_to_str5(const uint16_t &x); extern char *mres_to_str3(const uint8_t &x); #define lcd_implementation_drawmenu_setting_edit_wfac_selected(row, pstr, pstr2, data, minValue, maxValue) lcd_implementation_drawmenu_setting_edit_generic(row, pstr, '>', wfac_to_str5(*(data))) From 678cd17e7be56338266b9a2529f62810a8bb7ee7 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Wed, 28 Mar 2018 16:13:16 +0200 Subject: [PATCH 3/4] Increase size of EEPROM_TMC2130_WAVE_*_FAC to 16 bits. --- Firmware/Configuration.h | 10 +++++----- Firmware/Marlin_main.cpp | 16 ++++++++-------- Firmware/ultralcd.cpp | 23 ++++++++++++----------- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h index b46731f4..888a6c91 100644 --- a/Firmware/Configuration.h +++ b/Firmware/Configuration.h @@ -155,11 +155,11 @@ //////////////////////////////////////// // TMC2130 uStep linearity correction -// Linearity correction factor (XYZE) encoded as uint8 (0=>1, 1=>1.001, 254=>1.254, 255=>clear eeprom/disabled) -#define EEPROM_TMC2130_WAVE_X_FAC (EEPROM_TMC2130_HOME_ENABLED - 1) // uint8 -#define EEPROM_TMC2130_WAVE_Y_FAC (EEPROM_TMC2130_WAVE_X_FAC - 1) // uint8 -#define EEPROM_TMC2130_WAVE_Z_FAC (EEPROM_TMC2130_WAVE_Y_FAC - 1) // uint8 -#define EEPROM_TMC2130_WAVE_E_FAC (EEPROM_TMC2130_WAVE_Z_FAC - 1) // uint8 +// Linearity correction factor (XYZE) +#define EEPROM_TMC2130_WAVE_X_FAC (EEPROM_TMC2130_HOME_ENABLED - 2) // uint16 +#define EEPROM_TMC2130_WAVE_Y_FAC (EEPROM_TMC2130_WAVE_X_FAC - 2) // uint16 +#define EEPROM_TMC2130_WAVE_Z_FAC (EEPROM_TMC2130_WAVE_Y_FAC - 2) // uint16 +#define EEPROM_TMC2130_WAVE_E_FAC (EEPROM_TMC2130_WAVE_Z_FAC - 2) // uint16 //////////////////////////////////////// diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index e2018ee1..1d0e0d60 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1035,14 +1035,14 @@ void setup() } #ifdef TMC2130_LINEARITY_CORRECTION - tmc2130_wave_fac[X_AXIS] = eeprom_read_byte((uint8_t*)EEPROM_TMC2130_WAVE_X_FAC); - tmc2130_wave_fac[Y_AXIS] = eeprom_read_byte((uint8_t*)EEPROM_TMC2130_WAVE_Y_FAC); - tmc2130_wave_fac[Z_AXIS] = eeprom_read_byte((uint8_t*)EEPROM_TMC2130_WAVE_Z_FAC); - tmc2130_wave_fac[E_AXIS] = eeprom_read_byte((uint8_t*)EEPROM_TMC2130_WAVE_E_FAC); - if (tmc2130_wave_fac[X_AXIS] == 0xff) tmc2130_wave_fac[X_AXIS] = 0; - if (tmc2130_wave_fac[Y_AXIS] == 0xff) tmc2130_wave_fac[Y_AXIS] = 0; - if (tmc2130_wave_fac[Z_AXIS] == 0xff) tmc2130_wave_fac[Z_AXIS] = 0; - if (tmc2130_wave_fac[E_AXIS] == 0xff) tmc2130_wave_fac[E_AXIS] = 0; + tmc2130_wave_fac[X_AXIS] = eeprom_read_word((uint16_t*)EEPROM_TMC2130_WAVE_X_FAC); + tmc2130_wave_fac[Y_AXIS] = eeprom_read_word((uint16_t*)EEPROM_TMC2130_WAVE_Y_FAC); + tmc2130_wave_fac[Z_AXIS] = eeprom_read_word((uint16_t*)EEPROM_TMC2130_WAVE_Z_FAC); + tmc2130_wave_fac[E_AXIS] = eeprom_read_word((uint16_t*)EEPROM_TMC2130_WAVE_E_FAC); + if (tmc2130_wave_fac[X_AXIS] == 0xffff) tmc2130_wave_fac[X_AXIS] = 0; + if (tmc2130_wave_fac[Y_AXIS] == 0xffff) tmc2130_wave_fac[Y_AXIS] = 0; + if (tmc2130_wave_fac[Z_AXIS] == 0xffff) tmc2130_wave_fac[Z_AXIS] = 0; + if (tmc2130_wave_fac[E_AXIS] == 0xffff) tmc2130_wave_fac[E_AXIS] = 0; #endif //TMC2130_LINEARITY_CORRECTION #ifdef TMC2130_VARIABLE_RESOLUTION diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index f51171f4..1de7d375 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -3967,6 +3967,13 @@ static void lcd_selftest_() lcd_selftest(); } +static void lcd_ustep_linearity_menu_save() +{ + eeprom_update_word((uint16_t*)EEPROM_TMC2130_WAVE_X_FAC, tmc2130_wave_fac[X_AXIS]); + eeprom_update_word((uint16_t*)EEPROM_TMC2130_WAVE_Y_FAC, tmc2130_wave_fac[Y_AXIS]); + eeprom_update_word((uint16_t*)EEPROM_TMC2130_WAVE_Z_FAC, tmc2130_wave_fac[Z_AXIS]); + eeprom_update_word((uint16_t*)EEPROM_TMC2130_WAVE_E_FAC, tmc2130_wave_fac[E_AXIS]); +} #ifdef EXPERIMENTAL_FEATURES static void lcd_experimantal_menu(); @@ -4097,13 +4104,7 @@ static void lcd_ustep_resolution_menu() END_MENU(); } -static void lcd_ustep_linearity_menu_save() -{ - eeprom_update_byte((uint8_t*)EEPROM_TMC2130_WAVE_X_FAC, tmc2130_wave_fac[X_AXIS]); - eeprom_update_byte((uint8_t*)EEPROM_TMC2130_WAVE_Y_FAC, tmc2130_wave_fac[Y_AXIS]); - eeprom_update_byte((uint8_t*)EEPROM_TMC2130_WAVE_Z_FAC, tmc2130_wave_fac[Z_AXIS]); - eeprom_update_byte((uint8_t*)EEPROM_TMC2130_WAVE_E_FAC, tmc2130_wave_fac[E_AXIS]); -} + static void lcd_ustep_linearity_menu_back() { @@ -4112,10 +4113,10 @@ static void lcd_ustep_linearity_menu_back() if (tmc2130_wave_fac[Y_AXIS] < TMC2130_WAVE_FAC1000_MIN) tmc2130_wave_fac[Y_AXIS] = 0; if (tmc2130_wave_fac[Z_AXIS] < TMC2130_WAVE_FAC1000_MIN) tmc2130_wave_fac[Z_AXIS] = 0; if (tmc2130_wave_fac[E_AXIS] < TMC2130_WAVE_FAC1000_MIN) tmc2130_wave_fac[E_AXIS] = 0; - changed |= (eeprom_read_byte((uint8_t*)EEPROM_TMC2130_WAVE_X_FAC) != tmc2130_wave_fac[X_AXIS]); - changed |= (eeprom_read_byte((uint8_t*)EEPROM_TMC2130_WAVE_Y_FAC) != tmc2130_wave_fac[Y_AXIS]); - changed |= (eeprom_read_byte((uint8_t*)EEPROM_TMC2130_WAVE_Z_FAC) != tmc2130_wave_fac[Z_AXIS]); - changed |= (eeprom_read_byte((uint8_t*)EEPROM_TMC2130_WAVE_E_FAC) != tmc2130_wave_fac[E_AXIS]); + changed |= (eeprom_read_word((uint16_t*)EEPROM_TMC2130_WAVE_X_FAC) != tmc2130_wave_fac[X_AXIS]); + changed |= (eeprom_read_word((uint16_t*)EEPROM_TMC2130_WAVE_Y_FAC) != tmc2130_wave_fac[Y_AXIS]); + changed |= (eeprom_read_word((uint16_t*)EEPROM_TMC2130_WAVE_Z_FAC) != tmc2130_wave_fac[Z_AXIS]); + changed |= (eeprom_read_word((uint16_t*)EEPROM_TMC2130_WAVE_E_FAC) != tmc2130_wave_fac[E_AXIS]); lcd_ustep_linearity_menu_save(); if (changed) tmc2130_init(); currentMenu = lcd_experimantal_menu; From 40a064ffbcd619ed3f655c0ccb51a5c167659145 Mon Sep 17 00:00:00 2001 From: Marek Bel Date: Wed, 28 Mar 2018 18:53:37 +0200 Subject: [PATCH 4/4] Add extruder linearity correction to settings menu. --- Firmware/Configuration_prusa.h | 2 +- Firmware/Marlin_main.cpp | 2 ++ Firmware/langtool.pl | 0 Firmware/language_all.cpp | 10 +++++++ Firmware/language_all.h | 4 +++ Firmware/language_en.h | 2 ++ Firmware/ultralcd.cpp | 48 ++++++++++++++++++++++------------ Firmware/ultralcd.h | 4 +-- 8 files changed, 53 insertions(+), 19 deletions(-) mode change 100644 => 100755 Firmware/langtool.pl diff --git a/Firmware/Configuration_prusa.h b/Firmware/Configuration_prusa.h index 7cf413c3..6d781dce 100644 --- a/Firmware/Configuration_prusa.h +++ b/Firmware/Configuration_prusa.h @@ -137,7 +137,7 @@ const bool Z_MIN_ENDSTOP_INVERTING = false; // set to true to invert the logic o #endif /* DEBUG_BUILD */ //#define EXPERIMENTAL_FEATURES -//#define TMC2130_LINEARITY_CORRECTION +#define TMC2130_LINEARITY_CORRECTION //#define TMC2130_VARIABLE_RESOLUTION diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 1d0e0d60..488b726a 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1035,9 +1035,11 @@ void setup() } #ifdef TMC2130_LINEARITY_CORRECTION +#ifdef EXPERIMENTAL_FEATURES tmc2130_wave_fac[X_AXIS] = eeprom_read_word((uint16_t*)EEPROM_TMC2130_WAVE_X_FAC); tmc2130_wave_fac[Y_AXIS] = eeprom_read_word((uint16_t*)EEPROM_TMC2130_WAVE_Y_FAC); tmc2130_wave_fac[Z_AXIS] = eeprom_read_word((uint16_t*)EEPROM_TMC2130_WAVE_Z_FAC); +#endif //EXPERIMENTAL_FEATURES tmc2130_wave_fac[E_AXIS] = eeprom_read_word((uint16_t*)EEPROM_TMC2130_WAVE_E_FAC); if (tmc2130_wave_fac[X_AXIS] == 0xffff) tmc2130_wave_fac[X_AXIS] = 0; if (tmc2130_wave_fac[Y_AXIS] == 0xffff) tmc2130_wave_fac[Y_AXIS] = 0; diff --git a/Firmware/langtool.pl b/Firmware/langtool.pl old mode 100644 new mode 100755 diff --git a/Firmware/language_all.cpp b/Firmware/language_all.cpp index 7f5e4eb7..7acf23bf 100644 --- a/Firmware/language_all.cpp +++ b/Firmware/language_all.cpp @@ -599,6 +599,16 @@ const char * const MSG_EXTRUDER_4_LANG_TABLE[1] PROGMEM = { MSG_EXTRUDER_4_EN }; +const char MSG_EXTRUDER_CORRECTION_EN[] PROGMEM = "E-correct"; +const char * const MSG_EXTRUDER_CORRECTION_LANG_TABLE[1] PROGMEM = { + MSG_EXTRUDER_CORRECTION_EN +}; + +const char MSG_EXTRUDER_CORRECTION_OFF_EN[] PROGMEM = " [off"; +const char * const MSG_EXTRUDER_CORRECTION_OFF_LANG_TABLE[1] PROGMEM = { + MSG_EXTRUDER_CORRECTION_OFF_EN +}; + const char MSG_E_CAL_KNOB_EN[] PROGMEM = "Rotate knob until mark reaches extruder body. Click when done."; const char MSG_E_CAL_KNOB_CZ[] PROGMEM = "Otacejte tlacitkem dokud znacka nedosahne tela extruderu. Potvrdte tlacitkem."; const char * const MSG_E_CAL_KNOB_LANG_TABLE[LANG_NUM] PROGMEM = { diff --git a/Firmware/language_all.h b/Firmware/language_all.h index b8da5464..937a4a5b 100644 --- a/Firmware/language_all.h +++ b/Firmware/language_all.h @@ -214,6 +214,10 @@ extern const char* const MSG_EXTRUDER_3_LANG_TABLE[1]; #define MSG_EXTRUDER_3 LANG_TABLE_SELECT_EXPLICIT(MSG_EXTRUDER_3_LANG_TABLE, 0) extern const char* const MSG_EXTRUDER_4_LANG_TABLE[1]; #define MSG_EXTRUDER_4 LANG_TABLE_SELECT_EXPLICIT(MSG_EXTRUDER_4_LANG_TABLE, 0) +extern const char* const MSG_EXTRUDER_CORRECTION_LANG_TABLE[1]; +#define MSG_EXTRUDER_CORRECTION LANG_TABLE_SELECT_EXPLICIT(MSG_EXTRUDER_CORRECTION_LANG_TABLE, 0) +extern const char* const MSG_EXTRUDER_CORRECTION_OFF_LANG_TABLE[1]; +#define MSG_EXTRUDER_CORRECTION_OFF LANG_TABLE_SELECT_EXPLICIT(MSG_EXTRUDER_CORRECTION_OFF_LANG_TABLE, 0) extern const char* const MSG_E_CAL_KNOB_LANG_TABLE[LANG_NUM]; #define MSG_E_CAL_KNOB LANG_TABLE_SELECT(MSG_E_CAL_KNOB_LANG_TABLE) extern const char* const MSG_Enqueing_LANG_TABLE[1]; diff --git a/Firmware/language_en.h b/Firmware/language_en.h index a3ab5fb3..a0cf83e4 100644 --- a/Firmware/language_en.h +++ b/Firmware/language_en.h @@ -356,6 +356,8 @@ #define MSG_FSENSOR_OFF "Fil. sensor [off]" #define MSG_FSENSOR_NA "Fil. sensor [N/A]" #define MSG_FSENSOR_ON "Fil. sensor [on]" +#define(length=9)MSG_EXTRUDER_CORRECTION "E-correct" +#define(length=6)MSG_EXTRUDER_CORRECTION_OFF " [off" #define(length=20, lines=4) MSG_PLACE_STEEL_SHEET "Please place steel sheet on heatbed." #define(length=20, lines=4) MSG_REMOVE_STEEL_SHEET "Please remove steel sheet from heatbed." diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 1de7d375..f35ecbcb 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -207,6 +207,7 @@ static void lcd_control_temperature_preheat_pla_settings_menu(); static void lcd_control_temperature_preheat_abs_settings_menu(); static void lcd_control_motion_menu(); static void lcd_control_volumetric_menu(); +static void lcd_settings_menu_back(); static void prusa_stat_printerstatus(int _status); static void prusa_stat_farm_number(); @@ -3861,7 +3862,7 @@ static void lcd_settings_menu() EEPROM_read(EEPROM_SILENT, (uint8_t*)&SilentModeMenu, sizeof(SilentModeMenu)); START_MENU(); - MENU_ITEM(back, MSG_MAIN, lcd_main_menu); + MENU_ITEM(back, MSG_MAIN, lcd_settings_menu_back); MENU_ITEM(submenu, MSG_TEMPERATURE, lcd_control_temperature_menu); if (!homing_flag) @@ -3913,6 +3914,7 @@ static void lcd_settings_menu() else MENU_ITEM(function, MSG_CRASHDETECT_ON, lcd_crash_mode_set); } else MENU_ITEM(submenu, MSG_CRASHDETECT_NA, lcd_crash_mode_info); + MENU_ITEM_EDIT(wfac, MSG_EXTRUDER_CORRECTION, &tmc2130_wave_fac[E_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX); if (temp_cal_active == false) { MENU_ITEM(function, MSG_TEMP_CALIBRATION_OFF, lcd_temp_calibration_set); @@ -3974,6 +3976,16 @@ static void lcd_ustep_linearity_menu_save() eeprom_update_word((uint16_t*)EEPROM_TMC2130_WAVE_Z_FAC, tmc2130_wave_fac[Z_AXIS]); eeprom_update_word((uint16_t*)EEPROM_TMC2130_WAVE_E_FAC, tmc2130_wave_fac[E_AXIS]); } +static void lcd_settings_menu_back() +{ + bool changed = false; + if (tmc2130_wave_fac[E_AXIS] < TMC2130_WAVE_FAC1000_MIN) tmc2130_wave_fac[E_AXIS] = 0; + changed |= (eeprom_read_word((uint16_t*)EEPROM_TMC2130_WAVE_E_FAC) != tmc2130_wave_fac[E_AXIS]); + lcd_ustep_linearity_menu_save(); + if (changed) tmc2130_init(); + currentMenu = lcd_main_menu; + lcd_main_menu(); +} #ifdef EXPERIMENTAL_FEATURES static void lcd_experimantal_menu(); @@ -5847,13 +5859,15 @@ extern char conv[8]; // Convert tmc2130 wfac to string char *wfac_to_str5(const uint16_t &x) { - if (x>=TMC2130_WAVE_FAC1000_MIN) return ftostr43(((float)(x & 0xffff))/1000); - conv[0] = ' '; - conv[1] = ' '; - conv[2] = 'O'; - conv[3] = 'f'; - conv[4] = 'f'; - conv[5] = 0; + if (x>=TMC2130_WAVE_FAC1000_MIN) + { + conv[0] = '['; + ftostr43(((float)(x & 0xffff)/1000),1); + } + else strcpy_P(conv,MSG_EXTRUDER_CORRECTION_OFF); + conv[6] = ']'; + conv[7] = ' '; + conv[8] = 0; return conv; } @@ -7489,19 +7503,21 @@ char *ftostr32ns(const float &x) { // Convert float to string with 1.234 format -char *ftostr43(const float &x) +char *ftostr43(const float &x, uint8_t offset) { + const size_t maxOffset = sizeof(conv)/sizeof(conv[0]) - 6; + if (offset>maxOffset) offset = maxOffset; long xx = x * 1000; if (xx >= 0) - conv[0] = (xx / 1000) % 10 + '0'; + conv[offset] = (xx / 1000) % 10 + '0'; else - conv[0] = '-'; + conv[offset] = '-'; xx = abs(xx); - conv[1] = '.'; - conv[2] = (xx / 100) % 10 + '0'; - conv[3] = (xx / 10) % 10 + '0'; - conv[4] = (xx) % 10 + '0'; - conv[5] = 0; + conv[offset + 1] = '.'; + conv[offset + 2] = (xx / 100) % 10 + '0'; + conv[offset + 3] = (xx / 10) % 10 + '0'; + conv[offset + 4] = (xx) % 10 + '0'; + conv[offset + 5] = 0; return conv; } diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h index 53ced8a1..aad628ec 100644 --- a/Firmware/ultralcd.h +++ b/Firmware/ultralcd.h @@ -197,7 +197,7 @@ char *ftostr31ns(const float &x); // float to string without sign character char *ftostr31(const float &x); char *ftostr32(const float &x); char *ftostr32ns(const float &x); -char *ftostr43(const float &x); +char *ftostr43(const float &x, uint8_t offset = 0); char *ftostr12ns(const float &x); char *ftostr13ns(const float &x); char *ftostr32sp(const float &x); // remove zero-padding from ftostr32 @@ -285,4 +285,4 @@ void lcd_service_mode_show_result(); void lcd_wizard(); void lcd_wizard(int state); -#endif //ULTRALCD_H \ No newline at end of file +#endif //ULTRALCD_H