tmc: Implement TMCtstepHelper

Implement a helper for calculating velocity based thresholds for tmc drivers. This code was written in such a way that it can be used with more fields than just tpwmthrs.

Signed-off-by: Alex Voinea <voinea.dragos.alexandru@gmail.com>
This commit is contained in:
Alex Voinea 2023-03-11 17:42:48 +01:00 committed by KevinOConnor
parent c54d83c9f1
commit 0469710a69
1 changed files with 20 additions and 7 deletions

View File

@ -538,20 +538,33 @@ def TMCMicrostepHelper(config, mcu_tmc):
fields.set_field("mres", mres) fields.set_field("mres", mres)
fields.set_field("intpol", config.getboolean("interpolate", True)) fields.set_field("intpol", config.getboolean("interpolate", True))
# Helper to configure "stealthchop" mode # Helper for calculating TSTEP based values from velocity
def TMCtstepHelper(step_dist, mres, tmc_freq, velocity):
if velocity > 0.:
step_dist_256 = step_dist / (1 << mres)
threshold = int(tmc_freq * step_dist_256 / velocity + .5)
return max(0, min(0xfffff, threshold))
else:
return 0xfffff
# Helper to configure stealthChop-spreadCycle transition velocity
def TMCStealthchopHelper(config, mcu_tmc, tmc_freq): def TMCStealthchopHelper(config, mcu_tmc, tmc_freq):
fields = mcu_tmc.get_fields() fields = mcu_tmc.get_fields()
en_pwm_mode = False en_pwm_mode = False
velocity = config.getfloat('stealthchop_threshold', 0., minval=0.) velocity = config.getfloat('stealthchop_threshold', None, minval=0.)
if velocity: tpwmthrs = 0xfffff
if velocity is not None:
en_pwm_mode = True
stepper_name = " ".join(config.get_name().split()[1:]) stepper_name = " ".join(config.get_name().split()[1:])
sconfig = config.getsection(stepper_name) sconfig = config.getsection(stepper_name)
rotation_dist, steps_per_rotation = stepper.parse_step_distance(sconfig) rotation_dist, steps_per_rotation = stepper.parse_step_distance(sconfig)
step_dist = rotation_dist / steps_per_rotation step_dist = rotation_dist / steps_per_rotation
step_dist_256 = step_dist / (1 << fields.get_field("mres")) mres = fields.get_field("mres")
threshold = int(tmc_freq * step_dist_256 / velocity + .5) tpwmthrs = TMCtstepHelper(step_dist, mres, tmc_freq, velocity)
fields.set_field("tpwmthrs", max(0, min(0xfffff, threshold))) fields.set_field("tpwmthrs", tpwmthrs)
en_pwm_mode = True
reg = fields.lookup_register("en_pwm_mode", None) reg = fields.lookup_register("en_pwm_mode", None)
if reg is not None: if reg is not None:
fields.set_field("en_pwm_mode", en_pwm_mode) fields.set_field("en_pwm_mode", en_pwm_mode)