tmc2209: Add support for sensorless homing
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
parent
96fdb6ef36
commit
a482ddf582
|
@ -1130,6 +1130,13 @@
|
||||||
# chip. This may be used to set custom motor parameters. The
|
# chip. This may be used to set custom motor parameters. The
|
||||||
# defaults for each parameter are next to the parameter name in the
|
# defaults for each parameter are next to the parameter name in the
|
||||||
# above list.
|
# above list.
|
||||||
|
#diag_pin:
|
||||||
|
# The micro-controller pin attached to the DIAG line of the TMC2209
|
||||||
|
# chip. Setting this creates a "tmc2209_stepper_x:virtual_endstop"
|
||||||
|
# virtual pin which may be used as the stepper's endstop_pin. Doing
|
||||||
|
# this enables "sensorless homing". (Be sure to also set
|
||||||
|
# driver_SGTHRS to an appropriate sensitivity value.) The default is
|
||||||
|
# to not enable sensorless homing.
|
||||||
|
|
||||||
|
|
||||||
# Configure a TMC2660 stepper motor driver via SPI bus. To use this
|
# Configure a TMC2660 stepper motor driver via SPI bus. To use this
|
||||||
|
|
|
@ -32,7 +32,7 @@ class FieldHelper:
|
||||||
if reg_name is None:
|
if reg_name is None:
|
||||||
reg_name = self.field_to_register[field_name]
|
reg_name = self.field_to_register[field_name]
|
||||||
if reg_value is None:
|
if reg_value is None:
|
||||||
reg_value = self.registers[reg_name]
|
reg_value = self.registers.get(reg_name, 0)
|
||||||
mask = self.all_fields[reg_name][field_name]
|
mask = self.all_fields[reg_name][field_name]
|
||||||
field_value = (reg_value & mask) >> ffs(mask)
|
field_value = (reg_value & mask) >> ffs(mask)
|
||||||
if field_name in self.signed_fields and ((reg_value & mask)<<1) > mask:
|
if field_name in self.signed_fields and ((reg_value & mask)<<1) > mask:
|
||||||
|
@ -163,7 +163,13 @@ class TMCVirtualEndstop:
|
||||||
self.mcu_tmc = mcu_tmc
|
self.mcu_tmc = mcu_tmc
|
||||||
self.fields = mcu_tmc.get_fields()
|
self.fields = mcu_tmc.get_fields()
|
||||||
self.mcu_endstop = mcu_endstop
|
self.mcu_endstop = mcu_endstop
|
||||||
|
reg = self.fields.lookup_register("en_pwm_mode", None)
|
||||||
|
if reg is None:
|
||||||
|
self.en_pwm = not self.fields.get_field("en_spreadCycle")
|
||||||
|
self.pwmthrs = self.fields.get_field("TPWMTHRS")
|
||||||
|
else:
|
||||||
self.en_pwm = self.fields.get_field("en_pwm_mode")
|
self.en_pwm = self.fields.get_field("en_pwm_mode")
|
||||||
|
self.pwmthrs = 0
|
||||||
# Wrappers
|
# Wrappers
|
||||||
self.get_mcu = self.mcu_endstop.get_mcu
|
self.get_mcu = self.mcu_endstop.get_mcu
|
||||||
self.add_stepper = self.mcu_endstop.add_stepper
|
self.add_stepper = self.mcu_endstop.add_stepper
|
||||||
|
@ -173,12 +179,24 @@ class TMCVirtualEndstop:
|
||||||
self.query_endstop = self.mcu_endstop.query_endstop
|
self.query_endstop = self.mcu_endstop.query_endstop
|
||||||
self.TimeoutError = self.mcu_endstop.TimeoutError
|
self.TimeoutError = self.mcu_endstop.TimeoutError
|
||||||
def home_prepare(self):
|
def home_prepare(self):
|
||||||
|
reg = self.fields.lookup_register("en_pwm_mode", None)
|
||||||
|
if reg is None:
|
||||||
|
# On "stallguard4" drivers, "stealthchop" must be enabled
|
||||||
|
self.mcu_tmc.set_register("TPWMTHRS", 0)
|
||||||
|
val = self.fields.set_field("en_spreadCycle", 0)
|
||||||
|
else:
|
||||||
|
# On earlier drivers, "stealthchop" must be disabled
|
||||||
self.fields.set_field("en_pwm_mode", 0)
|
self.fields.set_field("en_pwm_mode", 0)
|
||||||
val = self.fields.set_field("diag1_stall", 1)
|
val = self.fields.set_field("diag1_stall", 1)
|
||||||
self.mcu_tmc.set_register("GCONF", val)
|
self.mcu_tmc.set_register("GCONF", val)
|
||||||
self.mcu_tmc.set_register("TCOOLTHRS", 0xfffff)
|
self.mcu_tmc.set_register("TCOOLTHRS", 0xfffff)
|
||||||
self.mcu_endstop.home_prepare()
|
self.mcu_endstop.home_prepare()
|
||||||
def home_finalize(self):
|
def home_finalize(self):
|
||||||
|
reg = self.fields.lookup_register("en_pwm_mode", None)
|
||||||
|
if reg is None:
|
||||||
|
self.mcu_tmc.set_register("TPWMTHRS", self.pwmthrs)
|
||||||
|
val = self.fields.set_field("en_spreadCycle", not self.en_pwm)
|
||||||
|
else:
|
||||||
self.fields.set_field("en_pwm_mode", self.en_pwm)
|
self.fields.set_field("en_pwm_mode", self.en_pwm)
|
||||||
val = self.fields.set_field("diag1_stall", 0)
|
val = self.fields.set_field("diag1_stall", 0)
|
||||||
self.mcu_tmc.set_register("GCONF", val)
|
self.mcu_tmc.set_register("GCONF", val)
|
||||||
|
|
|
@ -60,7 +60,8 @@ class TMC2209:
|
||||||
FieldFormatters)
|
FieldFormatters)
|
||||||
self.mcu_tmc = tmc_uart.MCU_TMC_uart(config, Registers, self.fields, 3)
|
self.mcu_tmc = tmc_uart.MCU_TMC_uart(config, Registers, self.fields, 3)
|
||||||
# Allow virtual pins to be created
|
# Allow virtual pins to be created
|
||||||
tmc.TMCVirtualPinHelper(config, self.mcu_tmc)
|
diag_pin = config.get('diag_pin', None)
|
||||||
|
tmc.TMCVirtualPinHelper(config, self.mcu_tmc, diag_pin)
|
||||||
# Register commands
|
# Register commands
|
||||||
cmdhelper = tmc.TMCCommandHelper(config, self.mcu_tmc)
|
cmdhelper = tmc.TMCCommandHelper(config, self.mcu_tmc)
|
||||||
cmdhelper.setup_register_dump(ReadRegisters)
|
cmdhelper.setup_register_dump(ReadRegisters)
|
||||||
|
|
|
@ -48,9 +48,11 @@ diag1_pin: !PK7
|
||||||
step_pin: PA4
|
step_pin: PA4
|
||||||
dir_pin: PA6
|
dir_pin: PA6
|
||||||
step_distance: .005
|
step_distance: .005
|
||||||
|
endstop_pin: tmc2209_stepper_y1:virtual_endstop
|
||||||
|
|
||||||
[tmc2209 stepper_y1]
|
[tmc2209 stepper_y1]
|
||||||
uart_pin: PA5
|
uart_pin: PA5
|
||||||
|
diag_pin: PH6
|
||||||
microsteps: 16
|
microsteps: 16
|
||||||
run_current: .5
|
run_current: .5
|
||||||
sense_resistor: 0.075
|
sense_resistor: 0.075
|
||||||
|
|
Loading…
Reference in New Issue