From 2ea7c97bbd3680949a2d89c3c9ab3a2552a25b4b Mon Sep 17 00:00:00 2001 From: Kevin O'Connor Date: Wed, 9 Jan 2019 13:10:23 -0500 Subject: [PATCH] stepper: Support configuring the stepper pulse length from Kconfig Allow the stepper pulse length to be configured at compile time from the Kconfig menu system. Signed-off-by: Kevin O'Connor --- src/Kconfig | 37 ++++++++++++++++++++++++++++++------- src/avr/Kconfig | 4 +++- src/stepper.c | 15 ++++++++------- 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/src/Kconfig b/src/Kconfig index e94ff5b2..16ce3531 100644 --- a/src/Kconfig +++ b/src/Kconfig @@ -2,6 +2,13 @@ mainmenu "Klipper Firmware Configuration" +config LOW_LEVEL_OPTIONS + bool "Enable extra low-level configuration options" + default n + help + Enable low-level configuration options that (if modified) may + result in a build that does not function correctly. + choice prompt "Micro-controller Architecture" config MACH_AVR @@ -32,6 +39,29 @@ source "src/linux/Kconfig" source "src/simulator/Kconfig" +# Step timing customization +config CUSTOM_STEP_DELAY + bool "Specify a custom step pulse duration" + depends on LOW_LEVEL_OPTIONS +config STEP_DELAY + int + default 2 +config STEP_DELAY + int "Step pulse duration (in microseconds)" + depends on CUSTOM_STEP_DELAY + help + Specify the duration of the stepper step pulse time. This + setting applies to all stepper drivers controlled by the + micro-controller. If this value is set to zero then the code + will "step" and "unstep" in the same C function. + + The default is zero for 8-bit AVR based micro-controllers, as + it takes a little over 2us to step and unstep with this + setting. + + The default for all other micro-controllers is 2us. + + CUSTOMIZING THIS VALUE DOES NOT IMPROVE PERFORMANCE! # The HAVE_GPIO_x options allow boards to disable support for some # commands if the hardware does not support the feature. @@ -54,13 +84,6 @@ config HAVE_GPIO_BITBANGING bool default n -config NO_UNSTEP_DELAY - # Slow micro-controllers do not require a delay before returning a - # stepper step pin to its default level. A board can enable this - # option to optimize the stepper_event() handler in this case. - bool - default n - config INLINE_STEPPER_HACK # Enables gcc to inline stepper_event() into the main timer irq handler bool diff --git a/src/avr/Kconfig b/src/avr/Kconfig index b2d6ffe0..2a1ca0b8 100644 --- a/src/avr/Kconfig +++ b/src/avr/Kconfig @@ -11,7 +11,9 @@ config AVR_SELECT select HAVE_GPIO_I2C select HAVE_GPIO_HARD_PWM select HAVE_GPIO_BITBANGING if !MACH_atmega168 - select NO_UNSTEP_DELAY + +config STEP_DELAY + default 0 config BOARD_DIRECTORY string diff --git a/src/stepper.c b/src/stepper.c index 2b967413..8356ff24 100644 --- a/src/stepper.c +++ b/src/stepper.c @@ -13,6 +13,8 @@ #include "sched.h" // struct timer #include "stepper.h" // command_config_stepper +DECL_CONSTANT(STEP_DELAY, CONFIG_STEP_DELAY); + /**************************************************************** * Steppers @@ -32,7 +34,7 @@ struct stepper { struct timer time; uint32_t interval; int16_t add; -#if CONFIG_NO_UNSTEP_DELAY +#if !CONFIG_STEP_DELAY uint16_t count; #define next_step_time time.waketime #else @@ -68,7 +70,7 @@ stepper_load_next(struct stepper *s, uint32_t min_next_time) s->next_step_time += m->interval; s->add = m->add; s->interval = m->interval + m->add; - if (CONFIG_NO_UNSTEP_DELAY) { + if (!CONFIG_STEP_DELAY) { // On slow mcus see if the add can be optimized away s->flags = m->add ? s->flags | SF_HAVE_ADD : s->flags & ~SF_HAVE_ADD; s->count = m->count; @@ -98,14 +100,12 @@ stepper_load_next(struct stepper *s, uint32_t min_next_time) return SF_RESCHEDULE; } -#define UNSTEP_TIME timer_from_us(2) - // Timer callback - step the given stepper. uint_fast8_t stepper_event(struct timer *t) { struct stepper *s = container_of(t, struct stepper, time); - if (CONFIG_NO_UNSTEP_DELAY) { + if (!CONFIG_STEP_DELAY) { // On slower mcus it is possible to simply step and unstep in // the same timer event. gpio_out_toggle_noirq(s->step_pin); @@ -124,7 +124,8 @@ stepper_event(struct timer *t) } // On faster mcus, it is necessary to schedule the unstep event - uint32_t min_next_time = timer_read_time() + UNSTEP_TIME; + uint32_t step_delay = timer_from_us(CONFIG_STEP_DELAY); + uint32_t min_next_time = timer_read_time() + step_delay; gpio_out_toggle_noirq(s->step_pin); s->count--; if (likely(s->count & 1)) @@ -242,7 +243,7 @@ static uint32_t stepper_get_position(struct stepper *s) { uint32_t position = s->position; - if (CONFIG_NO_UNSTEP_DELAY) + if (!CONFIG_STEP_DELAY) position -= s->count; else position -= s->count / 2;