Implement TMC2130 constant torque algorithm for improved stepper motor performance

- Add tmc2130_calc_constant_torque_value() function implementing advanced constant torque algorithm
- Maintain |A|² + |B|² = constant throughout microstep cycle for consistent motor torque
- Use full range utilization (SIN0=0, AMP=248) with natural mirroring approach
- Add EEPROM settings for wave algorithm selection
- Include menu integration for runtime algorithm switching
- Add complete internationalization support for TMC2130 stepper configuration strings

References:
- Analog Devices AN-026 application note
This commit is contained in:
Petr Vyleta 2025-06-28 19:54:45 +02:00
parent 7731024edb
commit 5251bfed23
19 changed files with 390 additions and 26 deletions

View File

@ -668,8 +668,9 @@ static Sheets * const EEPROM_Sheets_base = (Sheets*)(EEPROM_SHEETS_BASE);
#define EEPROM_UVLO_MIN_SEGMENT_TIME_US (EEPROM_UVLO_MIN_TRAVEL_FEEDRATE-4) //uint32_t
#define EEPROM_UVLO_MAX_JERK (EEPROM_UVLO_MIN_SEGMENT_TIME_US-4*4) // 4 x float
#define EEPROM_CHECK_FILAMENT (EEPROM_UVLO_MAX_JERK-1) // uint8_t
#define EEPROM_TMC2130_WAVE_ALGORITHM (EEPROM_CHECK_FILAMENT - 1) // uint8
//This is supposed to point to last item to allow EEPROM overrun check. Please update when adding new items.
#define EEPROM_LAST_ITEM EEPROM_CHECK_FILAMENT
#define EEPROM_LAST_ITEM EEPROM_TMC2130_WAVE_ALGORITHM
// !!!!!
// !!!!! this is end of EEPROM section ... all updates MUST BE inserted before this mark !!!!!
// !!!!!

View File

@ -318,6 +318,9 @@ extern const char MSG_X_CORRECTION [] PROGMEM_I1 = ISTR("X-correct"); ////MSG_X_
extern const char MSG_Y_CORRECTION [] PROGMEM_I1 = ISTR("Y-correct"); ////MSG_Y_CORRECTION c=13
extern const char MSG_Z_CORRECTION [] PROGMEM_I1 = ISTR("Z-correct"); ////MSG_Z_CORRECTION c=13
extern const char MSG_EXTRUDER_CORRECTION [] PROGMEM_I1 = ISTR("E-correct"); ////MSG_EXTRUDER_CORRECTION c=13
extern const char MSG_WAVE_ALGORITHM [] PROGMEM_I1 = ISTR("Algorithm"); ////MSG_WAVE_ALGORITHM c=13
extern const char MSG_ALGORITHM_DEFAULT [] PROGMEM_I1 = ISTR("Default"); ////MSG_ALGORITHM_DEFAULT c=13
extern const char MSG_ALGORITHM_CONST_TQ [] PROGMEM_I1 = ISTR("Const tq"); ////MSG_ALGORITHM_CONST_TQ c=13
extern const char MSG_CHECKS [] PROGMEM_I1 = ISTR("Checks"); ////MSG_CHECKS c=18
extern const char MSG_TEMPERATURE [] PROGMEM_I1 = ISTR("Temperature"); ////MSG_TEMPERATURE c=18
extern const char MSG_MOVE_AXIS [] PROGMEM_I1 = ISTR("Move axis"); ////MSG_MOVE_AXIS c=18

View File

@ -317,6 +317,9 @@ extern const char MSG_X_CORRECTION [];
extern const char MSG_Y_CORRECTION [];
extern const char MSG_Z_CORRECTION [];
extern const char MSG_EXTRUDER_CORRECTION [];
extern const char MSG_WAVE_ALGORITHM [];
extern const char MSG_ALGORITHM_DEFAULT [];
extern const char MSG_ALGORITHM_CONST_TQ [];
extern const char MSG_CHECKS [];
extern const char MSG_TEMPERATURE [];
extern const char MSG_MOVE_AXIS [];

View File

@ -8,6 +8,8 @@
#include "language.h"
#include "spi.h"
#include "Timer.h"
#include "eeprom.h"
#include <math.h>
#define TMC2130_GCONF_NORMAL 0x00000000 // spreadCycle
#define TMC2130_GCONF_SGSENS 0x00000180 // spreadCycle with stallguard (stall activates DIAG0 and DIAG1 [open collector])
@ -883,6 +885,107 @@ void tmc2130_get_wave(uint8_t axis, uint8_t* data)
tmc2130_set_pwr(axis, pwr);
}
// Calculate constant torque value for a given microstep positionAdd commentMore actions
//
// Maintains |A|² + |B|² = constant throughout the microstep cycle, where A and B are the two motor phases.
// Uses a two-phase approach: positions 0-127 follow a power-corrected sine curve,
// while positions 128-255 are calculated using the constant torque constraint equation.
//
// Creates only deltas achievable by TMC2130 in at most four segments. It relies on the fact,
// that for power corrected sine curve with fac [1, 1.2] the slope stays in the range [0, 2]
// and fits at most three segments.
//
// Parameters:
// - i: microstep position (0-255)
// - va: previous amplitude value for delta calculation
// - fac: power factor for linearity correction
// - tcorr: pre-calculated torque correction factor
// - carry: quantization error carry-forward (modified by reference)
// - prev_theoretical_value: previous theoretical value for slope calculation (modified by reference)
//
// Returns: 8-bit amplitude value clamped to [SIN0, AMP] range
//
// References:
// - Prusa Forum: "TMC2130 constant torque algorithm" discussion
// https://forum.prusa3d.com/forum/original-prusa-i3-mk3s-mk3-user-mods-octoprint-enclosures-nozzles/stepper-motor-upgrades-to-eliminate-vfa-s-vertical-fine-artifacts/paged/2/
// - Analog Devices AN-026: "Stepper Motor Control Using TMC2130"
// https://www.analog.com/en/resources/app-notes/an-026.html
uint8_t tmc2130_calc_constant_torque_value(uint8_t i, uint8_t va, float fac, float tcorr,
float& prev_theoretical_value) {
constexpr uint8_t SIN0 = 0;
constexpr uint8_t AMP = 248; // Amplitude limit as per AN-026 recommendation
constexpr float TARGET_MAGNITUDE_SQUARED = (float)AMP * AMP + (float)SIN0 * SIN0;
// Theoretical constant torque value at microstep position i
float theoretical_value;
if (i < 128) {
// Phase 1 (positions 0-127): Power-corrected sine curve
// Calculate theoretical value using sine function with power factor
// correction and tcorr adjustment for midpoint matching
float sin_val = sin(M_PI * (float)i / 512.0f);
theoretical_value = (AMP - SIN0) * pow(sin_val, fac) * tcorr + SIN0;
} else {
// Phase 2 (positions 128-255): Constant torque constraint solving
// For constant torque: |A(i)|² + |B(i)|² = TARGET_MAGNITUDE_SQUARED
// Since B(i) = A(255-i), solve: |A(i)|² + |A(255-i)|² = TARGET_MAGNITUDE_SQUARED
// Therefore: A(i) = sqrt(TARGET_MAGNITUDE_SQUARED - A(255-i)²)
// Calculate mirror position value from Phase 1 curve
uint8_t mirror_i = 255 - i;
float sin_val = sin(M_PI * (float)mirror_i / 512.0f);
float mirror_theoretical = (AMP - SIN0) * pow(sin_val, fac) * tcorr + SIN0;
// Apply constant torque constraint
theoretical_value = sqrt(TARGET_MAGNITUDE_SQUARED - mirror_theoretical * mirror_theoretical);
}
// Step 1: Initial quantization using simple rounding
uint8_t candidate_value = (uint8_t)(theoretical_value + 0.5);
// Step 2: Slope-based delta limiting for TMC2130 compression
// Calculate slope between current and previous theoretical values
float slope = theoretical_value - prev_theoretical_value;
// Determine allowed delta range
// This ensures delta ranges match slope ranges for optimal compression:
// slope ∈ [0,1) → deltas ∈ [0,1], slope ∈ [1,2) → deltas ∈ [1,2], etc.
int8_t min_delta = (int8_t)floor(slope);
// Clamp to TMC2130 hardware delta limits [-1, 3]
// Max delta is 2 because we need range [min_delta, min_delta+1]
if (min_delta < -1) {
min_delta = -1;
} else if (min_delta > 2) {
min_delta = 2;
}
// Enforce delta limits: constrain actual delta to [min_delta, min_delta+1]
int8_t delta = candidate_value - va;
if (delta < min_delta) {
candidate_value = va + min_delta;
} else if (delta > min_delta + 1) {
candidate_value = va + min_delta + 1;
}
// Step 3: Final amplitude clamping to valid TMC2130 range
if (candidate_value < SIN0) {
candidate_value = SIN0;
} else if (candidate_value > AMP) {
candidate_value = AMP;
}
// Update previous theoretical value for next slope calculation
prev_theoretical_value = theoretical_value;
return candidate_value;
}
// TMC2130 Wave Generation with Algorithm Selection
//
// Algorithm Overview:
// - Original: Simple sine wave with power factor adjustment
// - Constant Torque: Maintains |A|² + |B|² = constant throughout microstep cycle
void tmc2130_set_wave(uint8_t axis, uint8_t amp, uint8_t fac1000)
{
// TMC2130 wave compression algorithm
@ -890,7 +993,7 @@ void tmc2130_set_wave(uint8_t axis, uint8_t amp, uint8_t fac1000)
// 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 = 0;
float fac = 1;
if (fac1000) fac = ((float)((uint16_t)fac1000 + 1000) / 1000); //correction factor
// printf_P(PSTR(" factor: %s\n"), ftostr43(fac));
uint8_t vA = 0; //value of currentA
@ -904,16 +1007,40 @@ void tmc2130_set_wave(uint8_t axis, uint8_t amp, uint8_t fac1000)
int8_t dA; //delta value
uint8_t i = 0; //microstep index
uint32_t reg = 0; //tmc2130 register
tmc2130_wr_MSLUTSTART(axis, 0, amp);
// Constant torque algorithm parameters (only used if use_constant_torque is true)
float prev_theoretical_value = 0.0; // Cache previous theoretical value for slope calculation (initialized with SIN0)
float tcorr = 1.0; // Pre-calculated correction factor for constant torque algorithm
uint8_t algorithm = eeprom_read_byte((uint8_t*)EEPROM_TMC2130_WAVE_ALGORITHM);
bool use_constant_torque = (algorithm == TMC2130_WAVE_ALGORITHM_CONSTANT_TORQUE);
// Pre-calculate tcorr for constant torque algorithm to avoid redundant calculations
if (use_constant_torque) {
constexpr uint8_t SIN0 = 0;
constexpr uint8_t AMP = 248; // Amplitude limit as per AD recommendation
constexpr float MIDPOINT_VALUE = 175.362481734263781f; // sqrt((AMP² + SIN0²) / 2)
constexpr float SIN_127_5 = 0.704934080375905f; // sin(M_PI * 127.5f / 512.0f)
tcorr = (MIDPOINT_VALUE - SIN0) / ((AMP - SIN0) * pow(SIN_127_5, fac));
tmc2130_wr_MSLUTSTART(axis, SIN0, AMP);
} else {
tmc2130_wr_MSLUTSTART(axis, 0, amp);
}
do
{
if ((i & 0x1f) == 0)
reg = 0;
// calculate value
if (fac == 0) // default TMC wave
vA = (uint8_t)((amp+1) * sin((2*PI*i + PI)/1024) + 0.5) - 1;
else // corrected wave
vA = (uint8_t)(amp * pow(sin(2*PI*i/1024), fac) + 0.5);
if (use_constant_torque) {
vA = tmc2130_calc_constant_torque_value(i, va, fac, tcorr, prev_theoretical_value);
} else {
// calculate value
if (fac == 1) // default TMC wave
vA = (uint8_t)((amp+1) * sin((2*PI*i + PI)/1024) + 0.5) - 1;
else // corrected wave
vA = (uint8_t)(amp * pow(sin(2*PI*i/1024), fac) + 0.5);
}
dA = vA - va; // calculate delta
va = vA;
b = -1;

View File

@ -22,10 +22,14 @@ extern const char eMotorCurrentScalingEnabled[];
#define TMC2130_MODE_NORMAL 0
#define TMC2130_MODE_SILENT 1
#define TMC2130_WAVE_FAC1000_MIN 30
#define TMC2130_WAVE_FAC1000_MIN 0
#define TMC2130_WAVE_FAC1000_MAX 200
#define TMC2130_WAVE_FAC1000_STP 1
// Wave algorithm selection
#define TMC2130_WAVE_ALGORITHM_DEFAULT 0xFF // Default Prusa algorithm (0xFF = uninitialized EEPROM)
#define TMC2130_WAVE_ALGORITHM_CONSTANT_TORQUE 1 // Constant torque algorithm
#define TMC2130_MINIMUM_PULSE 0 // minimum pulse width in uS
#define TMC2130_SET_DIR_DELAY 20 // minimum delay after setting direction in uS
#define TMC2130_SET_PWR_DELAY 0 // minimum delay after changing pwr mode in uS

View File

@ -12,6 +12,7 @@
#include "stepper.h"
#include "ConfigurationStore.h"
#include "printers.h"
#include "eeprom.h"
#include <string.h>
#include "stopwatch.h"
@ -102,6 +103,7 @@ static void lcd_settings_menu();
static void lcd_control_temperature_menu();
#ifdef TMC2130
static void lcd_settings_linearity_correction_menu_save();
static void lcd_tmc2130_wave_algorithm_toggle();
#endif
static void lcd_menu_xyz_y_min();
static void lcd_menu_xyz_skew();
@ -4030,12 +4032,23 @@ void lcd_settings_linearity_correction_menu(void)
lcd_settings_linearity_correction_menu_save();
);
MENU_ITEM_BACK_P(_T(MSG_SETTINGS));
// Algorithm selection toggle (read from EEPROM to support runtime changes)
uint8_t current_algorithm = eeprom_read_byte((uint8_t*)EEPROM_TMC2130_WAVE_ALGORITHM);
if (current_algorithm == TMC2130_WAVE_ALGORITHM_CONSTANT_TORQUE) {
MENU_ITEM_TOGGLE_P(_T(MSG_WAVE_ALGORITHM), _T(MSG_ALGORITHM_CONST_TQ), lcd_tmc2130_wave_algorithm_toggle);
} else {
MENU_ITEM_TOGGLE_P(_T(MSG_WAVE_ALGORITHM), _T(MSG_ALGORITHM_DEFAULT), lcd_tmc2130_wave_algorithm_toggle);
}
// Unified parameter range (0-200 maps to power factors 1.0-1.2 for both algorithms)
#ifdef TMC2130_LINEARITY_CORRECTION_XYZ
MENU_ITEM_EDIT_int3_P(_T(MSG_X_CORRECTION), &tmc2130_wave_fac[X_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);
MENU_ITEM_EDIT_int3_P(_T(MSG_Y_CORRECTION), &tmc2130_wave_fac[Y_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);
MENU_ITEM_EDIT_int3_P(_T(MSG_Z_CORRECTION), &tmc2130_wave_fac[Z_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);
MENU_ITEM_EDIT_int3_P(_T(MSG_X_CORRECTION), &tmc2130_wave_fac[X_AXIS], TMC2130_WAVE_FAC1000_MIN, TMC2130_WAVE_FAC1000_MAX);
MENU_ITEM_EDIT_int3_P(_T(MSG_Y_CORRECTION), &tmc2130_wave_fac[Y_AXIS], TMC2130_WAVE_FAC1000_MIN, TMC2130_WAVE_FAC1000_MAX);
MENU_ITEM_EDIT_int3_P(_T(MSG_Z_CORRECTION), &tmc2130_wave_fac[Z_AXIS], TMC2130_WAVE_FAC1000_MIN, TMC2130_WAVE_FAC1000_MAX);
#endif //TMC2130_LINEARITY_CORRECTION_XYZ
MENU_ITEM_EDIT_int3_P(_T(MSG_EXTRUDER_CORRECTION), &tmc2130_wave_fac[E_AXIS], TMC2130_WAVE_FAC1000_MIN-TMC2130_WAVE_FAC1000_STP, TMC2130_WAVE_FAC1000_MAX);
MENU_ITEM_EDIT_int3_P(_T(MSG_EXTRUDER_CORRECTION), &tmc2130_wave_fac[E_AXIS], TMC2130_WAVE_FAC1000_MIN, TMC2130_WAVE_FAC1000_MAX);
MENU_END();
}
#endif // TMC2130
@ -4543,6 +4556,24 @@ static void lcd_settings_linearity_correction_menu_save() {
// Re-init the TMC2130 driver to apply changes, if any
tmc2130_init(TMCInitParams(false, FarmOrUserECool()));
}
// Toggle between Default and Constant Torque algorithms
static void lcd_tmc2130_wave_algorithm_toggle() {
// Read current algorithm from EEPROM
uint8_t current_algorithm = eeprom_read_byte((uint8_t*)EEPROM_TMC2130_WAVE_ALGORITHM);
// Toggle to the other algorithm
uint8_t new_algorithm = (current_algorithm == TMC2130_WAVE_ALGORITHM_CONSTANT_TORQUE) ?
TMC2130_WAVE_ALGORITHM_DEFAULT : TMC2130_WAVE_ALGORITHM_CONSTANT_TORQUE;
// Save new algorithm to EEPROM
eeprom_update_byte_notify((uint8_t*)EEPROM_TMC2130_WAVE_ALGORITHM, new_algorithm);
// Immediately reapply wave settings on all axes to enable runtime changes
for (uint8_t axis = 0; axis < NUM_AXIS; axis++) {
tmc2130_set_wave(axis, 247, tmc2130_wave_fac[axis]);
}
}
#endif //TMC2130
static void lcd_calibration_menu()

View File

@ -460,10 +460,25 @@ msgid "Done"
msgstr "Konec"
#. MSG_EXTRUDER_CORRECTION c=13
#: ../../Firmware/messages.cpp:319 ../../Firmware/ultralcd.cpp:4014
#: ../../Firmware/messages.cpp:320 ../../Firmware/ultralcd.cpp:4047
msgid "E-correct"
msgstr "Korekce E"
#. MSG_WAVE_ALGORITHM c=13
#: ../../Firmware/messages.cpp:321
msgid "Algorithm"
msgstr "Algoritmus"
#. MSG_ALGORITHM_DEFAULT c=13
#: ../../Firmware/messages.cpp:322
msgid "Default"
msgstr "Vychozi"
#. MSG_ALGORITHM_CONST_TQ c=13
#: ../../Firmware/messages.cpp:323
msgid "Const tq"
msgstr "Konst. mom"
#. MSG_PROGRESS_ERR_HELP_FIL c=20
#: ../../Firmware/mmu2_progress_converter.cpp:19
#: ../../Firmware/mmu2_progress_converter.cpp:48

View File

@ -462,10 +462,25 @@ msgid "Done"
msgstr "Klar"
#. MSG_EXTRUDER_CORRECTION c=13
#: ../../Firmware/messages.cpp:319 ../../Firmware/ultralcd.cpp:4014
#: ../../Firmware/messages.cpp:320 ../../Firmware/ultralcd.cpp:4047
msgid "E-correct"
msgstr "E-Korrektur"
#. MSG_WAVE_ALGORITHM c=13
#: ../../Firmware/messages.cpp:321
msgid "Algorithm"
msgstr "Algorithmus"
#. MSG_ALGORITHM_DEFAULT c=13
#: ../../Firmware/messages.cpp:322
msgid "Default"
msgstr "Standard"
#. MSG_ALGORITHM_CONST_TQ c=13
#: ../../Firmware/messages.cpp:323
msgid "Const tq"
msgstr "Konst. Dreh"
#. MSG_PROGRESS_ERR_HELP_FIL c=20
#: ../../Firmware/mmu2_progress_converter.cpp:19
#: ../../Firmware/mmu2_progress_converter.cpp:48

View File

@ -460,10 +460,25 @@ msgid "Done"
msgstr "Listo"
#. MSG_EXTRUDER_CORRECTION c=13
#: ../../Firmware/messages.cpp:319 ../../Firmware/ultralcd.cpp:4014
#: ../../Firmware/messages.cpp:320 ../../Firmware/ultralcd.cpp:4047
msgid "E-correct"
msgstr "Corregir-E"
#. MSG_WAVE_ALGORITHM c=13
#: ../../Firmware/messages.cpp:321
msgid "Algorithm"
msgstr "Algoritmo"
#. MSG_ALGORITHM_DEFAULT c=13
#: ../../Firmware/messages.cpp:322
msgid "Default"
msgstr "Por defecto"
#. MSG_ALGORITHM_CONST_TQ c=13
#: ../../Firmware/messages.cpp:323
msgid "Const tq"
msgstr "Par const"
#. MSG_PROGRESS_ERR_HELP_FIL c=20
#: ../../Firmware/mmu2_progress_converter.cpp:19
#: ../../Firmware/mmu2_progress_converter.cpp:48

View File

@ -463,10 +463,25 @@ msgid "Done"
msgstr "Fait"
#. MSG_EXTRUDER_CORRECTION c=13
#: ../../Firmware/messages.cpp:319 ../../Firmware/ultralcd.cpp:4014
#: ../../Firmware/messages.cpp:320 ../../Firmware/ultralcd.cpp:4047
msgid "E-correct"
msgstr "Correct-E"
#. MSG_WAVE_ALGORITHM c=13
#: ../../Firmware/messages.cpp:321
msgid "Algorithm"
msgstr "Algorithme"
#. MSG_ALGORITHM_DEFAULT c=13
#: ../../Firmware/messages.cpp:322
msgid "Default"
msgstr "Defaut"
#. MSG_ALGORITHM_CONST_TQ c=13
#: ../../Firmware/messages.cpp:323
msgid "Const tq"
msgstr "Couple cst"
#. MSG_PROGRESS_ERR_HELP_FIL c=20
#: ../../Firmware/mmu2_progress_converter.cpp:19
#: ../../Firmware/mmu2_progress_converter.cpp:48

View File

@ -458,10 +458,25 @@ msgid "Done"
msgstr "Gotov"
#. MSG_EXTRUDER_CORRECTION c=13
#: ../../Firmware/messages.cpp:319 ../../Firmware/ultralcd.cpp:4014
#: ../../Firmware/messages.cpp:320 ../../Firmware/ultralcd.cpp:4047
msgid "E-correct"
msgstr "E-ispravan"
#. MSG_WAVE_ALGORITHM c=13
#: ../../Firmware/messages.cpp:321
msgid "Algorithm"
msgstr "Algoritam"
#. MSG_ALGORITHM_DEFAULT c=13
#: ../../Firmware/messages.cpp:322
msgid "Default"
msgstr "Zadano"
#. MSG_ALGORITHM_CONST_TQ c=13
#: ../../Firmware/messages.cpp:323
msgid "Const tq"
msgstr "Konst. mom"
#. MSG_PROGRESS_ERR_HELP_FIL c=20
#: ../../Firmware/mmu2_progress_converter.cpp:19
#: ../../Firmware/mmu2_progress_converter.cpp:48

View File

@ -461,10 +461,25 @@ msgid "Done"
msgstr "Kesz"
#. MSG_EXTRUDER_CORRECTION c=13
#: ../../Firmware/messages.cpp:319 ../../Firmware/ultralcd.cpp:4014
#: ../../Firmware/messages.cpp:320 ../../Firmware/ultralcd.cpp:4047
msgid "E-correct"
msgstr "E-korrekcio"
#. MSG_WAVE_ALGORITHM c=13
#: ../../Firmware/messages.cpp:321
msgid "Algorithm"
msgstr "Algoritmus"
#. MSG_ALGORITHM_DEFAULT c=13
#: ../../Firmware/messages.cpp:322
msgid "Default"
msgstr "Alapertelmez"
#. MSG_ALGORITHM_CONST_TQ c=13
#: ../../Firmware/messages.cpp:323
msgid "Const tq"
msgstr "Allando nyom"
#. MSG_PROGRESS_ERR_HELP_FIL c=20
#: ../../Firmware/mmu2_progress_converter.cpp:19
#: ../../Firmware/mmu2_progress_converter.cpp:48

View File

@ -462,10 +462,25 @@ msgid "Done"
msgstr "Fatto"
#. MSG_EXTRUDER_CORRECTION c=13
#: ../../Firmware/messages.cpp:319 ../../Firmware/ultralcd.cpp:4014
#: ../../Firmware/messages.cpp:320 ../../Firmware/ultralcd.cpp:4047
msgid "E-correct"
msgstr "Correzione-E"
#. MSG_WAVE_ALGORITHM c=13
#: ../../Firmware/messages.cpp:321
msgid "Algorithm"
msgstr "Algoritmo"
#. MSG_ALGORITHM_DEFAULT c=13
#: ../../Firmware/messages.cpp:322
msgid "Default"
msgstr "Predefinito"
#. MSG_ALGORITHM_CONST_TQ c=13
#: ../../Firmware/messages.cpp:323
msgid "Const tq"
msgstr "Coppia cost"
#. MSG_PROGRESS_ERR_HELP_FIL c=20
#: ../../Firmware/mmu2_progress_converter.cpp:19
#: ../../Firmware/mmu2_progress_converter.cpp:48

View File

@ -463,10 +463,25 @@ msgid "Done"
msgstr "Klaar"
#. MSG_EXTRUDER_CORRECTION c=13
#: ../../Firmware/messages.cpp:319 ../../Firmware/ultralcd.cpp:4014
#: ../../Firmware/messages.cpp:320 ../../Firmware/ultralcd.cpp:4047
msgid "E-correct"
msgstr "E-correctie"
#. MSG_WAVE_ALGORITHM c=13
#: ../../Firmware/messages.cpp:321
msgid "Algorithm"
msgstr "Algoritme"
#. MSG_ALGORITHM_DEFAULT c=13
#: ../../Firmware/messages.cpp:322
msgid "Default"
msgstr "Standaard"
#. MSG_ALGORITHM_CONST_TQ c=13
#: ../../Firmware/messages.cpp:323
msgid "Const tq"
msgstr "Const koppel"
#. MSG_PROGRESS_ERR_HELP_FIL c=20
#: ../../Firmware/mmu2_progress_converter.cpp:19
#: ../../Firmware/mmu2_progress_converter.cpp:48

View File

@ -461,10 +461,25 @@ msgid "Done"
msgstr "Ferdig"
#. MSG_EXTRUDER_CORRECTION c=13
#: ../../Firmware/messages.cpp:319 ../../Firmware/ultralcd.cpp:4014
#: ../../Firmware/messages.cpp:320 ../../Firmware/ultralcd.cpp:4047
msgid "E-correct"
msgstr "E-korreksjon"
#. MSG_WAVE_ALGORITHM c=13
#: ../../Firmware/messages.cpp:321
msgid "Algorithm"
msgstr "Algoritme"
#. MSG_ALGORITHM_DEFAULT c=13
#: ../../Firmware/messages.cpp:322
msgid "Default"
msgstr "Standard"
#. MSG_ALGORITHM_CONST_TQ c=13
#: ../../Firmware/messages.cpp:323
msgid "Const tq"
msgstr "Konst moment"
#. MSG_PROGRESS_ERR_HELP_FIL c=20
#: ../../Firmware/mmu2_progress_converter.cpp:19
#: ../../Firmware/mmu2_progress_converter.cpp:48

View File

@ -463,10 +463,25 @@ msgid "Done"
msgstr "Gotowe"
#. MSG_EXTRUDER_CORRECTION c=13
#: ../../Firmware/messages.cpp:319 ../../Firmware/ultralcd.cpp:4014
#: ../../Firmware/messages.cpp:320 ../../Firmware/ultralcd.cpp:4047
msgid "E-correct"
msgstr "Korekcja-E"
#. MSG_WAVE_ALGORITHM c=13
#: ../../Firmware/messages.cpp:321
msgid "Algorithm"
msgstr "Algorytm"
#. MSG_ALGORITHM_DEFAULT c=13
#: ../../Firmware/messages.cpp:322
msgid "Default"
msgstr "Domyslny"
#. MSG_ALGORITHM_CONST_TQ c=13
#: ../../Firmware/messages.cpp:323
msgid "Const tq"
msgstr "Staly moment"
#. MSG_PROGRESS_ERR_HELP_FIL c=20
#: ../../Firmware/mmu2_progress_converter.cpp:19
#: ../../Firmware/mmu2_progress_converter.cpp:48

View File

@ -463,10 +463,25 @@ msgid "Done"
msgstr "Gata"
#. MSG_EXTRUDER_CORRECTION c=13
#: ../../Firmware/messages.cpp:319 ../../Firmware/ultralcd.cpp:4014
#: ../../Firmware/messages.cpp:320 ../../Firmware/ultralcd.cpp:4047
msgid "E-correct"
msgstr "E-corecție"
#. MSG_WAVE_ALGORITHM c=13
#: ../../Firmware/messages.cpp:321
msgid "Algorithm"
msgstr "Algoritm"
#. MSG_ALGORITHM_DEFAULT c=13
#: ../../Firmware/messages.cpp:322
msgid "Default"
msgstr "Implicit"
#. MSG_ALGORITHM_CONST_TQ c=13
#: ../../Firmware/messages.cpp:323
msgid "Const tq"
msgstr "Cuplu const"
#. MSG_PROGRESS_ERR_HELP_FIL c=20
#: ../../Firmware/mmu2_progress_converter.cpp:19
#: ../../Firmware/mmu2_progress_converter.cpp:48

View File

@ -460,10 +460,25 @@ msgid "Done"
msgstr "Hotov"
#. MSG_EXTRUDER_CORRECTION c=13
#: ../../Firmware/messages.cpp:319 ../../Firmware/ultralcd.cpp:4014
#: ../../Firmware/messages.cpp:320 ../../Firmware/ultralcd.cpp:4047
msgid "E-correct"
msgstr "Korekcia E"
#. MSG_WAVE_ALGORITHM c=13
#: ../../Firmware/messages.cpp:321
msgid "Algorithm"
msgstr "Algoritmus"
#. MSG_ALGORITHM_DEFAULT c=13
#: ../../Firmware/messages.cpp:322
msgid "Default"
msgstr "Predvoleny"
#. MSG_ALGORITHM_CONST_TQ c=13
#: ../../Firmware/messages.cpp:323
msgid "Const tq"
msgstr "Konst. mom"
#. MSG_PROGRESS_ERR_HELP_FIL c=20
#: ../../Firmware/mmu2_progress_converter.cpp:19
#: ../../Firmware/mmu2_progress_converter.cpp:48

View File

@ -461,10 +461,25 @@ msgid "Done"
msgstr "Klar"
#. MSG_EXTRUDER_CORRECTION c=13
#: ../../Firmware/messages.cpp:319 ../../Firmware/ultralcd.cpp:4014
#: ../../Firmware/messages.cpp:320 ../../Firmware/ultralcd.cpp:4047
msgid "E-correct"
msgstr "E-korrektion"
#. MSG_WAVE_ALGORITHM c=13
#: ../../Firmware/messages.cpp:321
msgid "Algorithm"
msgstr "Algoritm"
#. MSG_ALGORITHM_DEFAULT c=13
#: ../../Firmware/messages.cpp:322
msgid "Default"
msgstr "Standard"
#. MSG_ALGORITHM_CONST_TQ c=13
#: ../../Firmware/messages.cpp:323
msgid "Const tq"
msgstr "Konst moment"
#. MSG_PROGRESS_ERR_HELP_FIL c=20
#: ../../Firmware/mmu2_progress_converter.cpp:19
#: ../../Firmware/mmu2_progress_converter.cpp:48