diff --git a/docs/Config_Changes.md b/docs/Config_Changes.md index 3a38fd40..efe962d1 100644 --- a/docs/Config_Changes.md +++ b/docs/Config_Changes.md @@ -8,6 +8,14 @@ All dates in this document are approximate. ## Changes +20230304: The `SET_TMC_CURRENT` command now properly adjusts the globalscaler +register for drivers that have it. This removes a limitation where on tmc5160, +the currents could not be raised higher with `SET_TMC_CURRENT` than the +`run_current` value set in the config file. +However, this has a side effect: After running `SET_TMC_CURRENT`, the stepper +must be held at standstill for >130ms in case StealthChop2 is used so that the +AT#1 calibration gets executed by the driver. + 20230202: The format of the `printer.screws_tilt_adjust` status information has changed. The information is now stored as a dictionary of screws with the resulting measurements. See the diff --git a/docs/G-Codes.md b/docs/G-Codes.md index 04efdbf2..7f5c6b08 100644 --- a/docs/G-Codes.md +++ b/docs/G-Codes.md @@ -1226,7 +1226,10 @@ turned off then back on. #### SET_TMC_CURRENT `SET_TMC_CURRENT STEPPER= CURRENT= HOLDCURRENT=`: This will adjust the run and hold currents of the TMC driver. -(HOLDCURRENT is not applicable to tmc2660 drivers.) +`HOLDCURRENT` is not applicable to tmc2660 drivers. +When used on a driver which has the `globalscaler` field (tmc5160 and tmc2240), +if StealthChop2 is used, the stepper must be held at standstill for >130ms so +that the driver executes the AT#1 calibration. #### SET_TMC_FIELD `SET_TMC_FIELD STEPPER= FIELD= VALUE=`: This will diff --git a/klippy/extras/tmc5160.py b/klippy/extras/tmc5160.py index f63d17ee..e0db1434 100644 --- a/klippy/extras/tmc5160.py +++ b/klippy/extras/tmc5160.py @@ -264,19 +264,18 @@ class TMC5160CurrentHelper: above=0., maxval=MAX_CURRENT) self.req_hold_current = hold_current self.sense_resistor = config.getfloat('sense_resistor', 0.075, above=0.) - self._set_globalscaler(run_current) - irun, ihold = self._calc_current(run_current, hold_current) + gscaler, irun, ihold = self._calc_current(run_current, hold_current) + self.fields.set_field("globalscaler", gscaler) self.fields.set_field("ihold", ihold) self.fields.set_field("irun", irun) - def _set_globalscaler(self, current): + def _calc_globalscaler(self, current): globalscaler = int((current * 256. * math.sqrt(2.) * self.sense_resistor / VREF) + .5) globalscaler = max(32, globalscaler) if globalscaler >= 256: globalscaler = 0 - self.fields.set_field("globalscaler", globalscaler) - def _calc_current_bits(self, current): - globalscaler = self.fields.get_field("globalscaler") + return globalscaler + def _calc_current_bits(self, current, globalscaler): if not globalscaler: globalscaler = 256 cs = int((current * 256. * 32. * math.sqrt(2.) * self.sense_resistor) @@ -284,9 +283,10 @@ class TMC5160CurrentHelper: - 1. + .5) return max(0, min(31, cs)) def _calc_current(self, run_current, hold_current): - irun = self._calc_current_bits(run_current) - ihold = self._calc_current_bits(min(hold_current, run_current)) - return irun, ihold + gscaler = self._calc_globalscaler(run_current) + irun = self._calc_current_bits(run_current, gscaler) + ihold = self._calc_current_bits(min(hold_current, run_current), gscaler) + return gscaler, irun, ihold def _calc_current_from_field(self, field_name): globalscaler = self.fields.get_field("globalscaler") if not globalscaler: @@ -300,7 +300,9 @@ class TMC5160CurrentHelper: return run_current, hold_current, self.req_hold_current, MAX_CURRENT def set_current(self, run_current, hold_current, print_time): self.req_hold_current = hold_current - irun, ihold = self._calc_current(run_current, hold_current) + gscaler, irun, ihold = self._calc_current(run_current, hold_current) + val = self.fields.set_field("globalscaler", gscaler) + self.mcu_tmc.set_register("GLOBALSCALER", val, print_time) self.fields.set_field("ihold", ihold) val = self.fields.set_field("irun", irun) self.mcu_tmc.set_register("IHOLD_IRUN", val, print_time)