Fix stepper pulse timing
Always honor minimum period on stepper pulse generation, and fix timing calculations Signed-off-by: etagle <ejtagle@hotmail.com>
This commit is contained in:
parent
0d79128c8d
commit
a215725df6
8 changed files with 116 additions and 107 deletions
|
@ -108,10 +108,6 @@ extern "C" {
|
||||||
int freeMemory(void);
|
int freeMemory(void);
|
||||||
}
|
}
|
||||||
|
|
||||||
// eeprom
|
|
||||||
//void eeprom_write_byte(unsigned char *pos, unsigned char value);
|
|
||||||
//unsigned char eeprom_read_byte(unsigned char *pos);
|
|
||||||
|
|
||||||
// timers
|
// timers
|
||||||
#define HAL_TIMER_RATE ((F_CPU) / 8) // i.e., 2MHz or 2.5MHz
|
#define HAL_TIMER_RATE ((F_CPU) / 8) // i.e., 2MHz or 2.5MHz
|
||||||
|
|
||||||
|
@ -119,20 +115,15 @@ extern "C" {
|
||||||
#define TEMP_TIMER_NUM 0
|
#define TEMP_TIMER_NUM 0
|
||||||
#define PULSE_TIMER_NUM STEP_TIMER_NUM
|
#define PULSE_TIMER_NUM STEP_TIMER_NUM
|
||||||
|
|
||||||
#define STEPPER_TIMER_RATE HAL_TIMER_RATE
|
|
||||||
#define HAL_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // Cannot be of type double
|
|
||||||
#define STEPPER_TIMER_PRESCALE 8
|
|
||||||
#define STEP_TIMER_MIN_INTERVAL 8 // minimum time in µs between stepper interrupts
|
|
||||||
|
|
||||||
#define TEMP_TIMER_FREQUENCY ((F_CPU) / 64.0 / 256.0)
|
#define TEMP_TIMER_FREQUENCY ((F_CPU) / 64.0 / 256.0)
|
||||||
|
|
||||||
#define TIMER_OCR_1 OCR1A
|
#define STEPPER_TIMER_RATE HAL_TIMER_RATE
|
||||||
#define TIMER_COUNTER_1 TCNT1
|
#define STEPPER_TIMER_PRESCALE 8
|
||||||
|
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // Cannot be of type double
|
||||||
|
|
||||||
#define TIMER_OCR_0 OCR0A
|
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer
|
||||||
#define TIMER_COUNTER_0 TCNT0
|
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
||||||
|
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
||||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
|
||||||
|
|
||||||
#define ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(TIMSK1, OCIE1A)
|
#define ENABLE_STEPPER_DRIVER_INTERRUPT() SBI(TIMSK1, OCIE1A)
|
||||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() CBI(TIMSK1, OCIE1A)
|
#define DISABLE_STEPPER_DRIVER_INTERRUPT() CBI(TIMSK1, OCIE1A)
|
||||||
|
@ -173,6 +164,12 @@ FORCE_INLINE void HAL_timer_start(const uint8_t timer_num, const uint32_t freque
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define TIMER_OCR_1 OCR1A
|
||||||
|
#define TIMER_COUNTER_1 TCNT1
|
||||||
|
|
||||||
|
#define TIMER_OCR_0 OCR0A
|
||||||
|
#define TIMER_COUNTER_0 TCNT0
|
||||||
|
|
||||||
#define _CAT(a, ...) a ## __VA_ARGS__
|
#define _CAT(a, ...) a ## __VA_ARGS__
|
||||||
#define HAL_timer_set_compare(timer, compare) (_CAT(TIMER_OCR_, timer) = compare)
|
#define HAL_timer_set_compare(timer, compare) (_CAT(TIMER_OCR_, timer) = compare)
|
||||||
#define HAL_timer_restrain(timer, interval_ticks) NOLESS(_CAT(TIMER_OCR_, timer), _CAT(TIMER_COUNTER_, timer) + interval_ticks)
|
#define HAL_timer_restrain(timer, interval_ticks) NOLESS(_CAT(TIMER_OCR_, timer), _CAT(TIMER_COUNTER_, timer) + interval_ticks)
|
||||||
|
|
|
@ -43,21 +43,22 @@
|
||||||
typedef uint32_t hal_timer_t;
|
typedef uint32_t hal_timer_t;
|
||||||
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF
|
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF
|
||||||
|
|
||||||
#define STEP_TIMER_NUM 3 // index of timer to use for stepper
|
|
||||||
#define TEMP_TIMER_NUM 4 // index of timer to use for temperature
|
|
||||||
#define TONE_TIMER_NUM 6 // index of timer to use for beeper tones
|
|
||||||
|
|
||||||
#define HAL_TIMER_RATE ((F_CPU) / 2) // frequency of timers peripherals
|
#define HAL_TIMER_RATE ((F_CPU) / 2) // frequency of timers peripherals
|
||||||
|
|
||||||
#define STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE)
|
#define STEP_TIMER_NUM 3 // index of timer to use for stepper
|
||||||
#define HAL_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs
|
#define TEMP_TIMER_NUM 4 // index of timer to use for temperature
|
||||||
#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / HAL_TICKS_PER_US)
|
#define PULSE_TIMER_NUM STEP_TIMER_NUM
|
||||||
#define STEP_TIMER_MIN_INTERVAL 8 // minimum time in µs between stepper interrupts
|
#define TONE_TIMER_NUM 6 // index of timer to use for beeper tones
|
||||||
|
|
||||||
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
||||||
|
|
||||||
#define PULSE_TIMER_NUM STEP_TIMER_NUM
|
#define STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE)
|
||||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs
|
||||||
|
#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US)
|
||||||
|
|
||||||
|
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer
|
||||||
|
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
||||||
|
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
||||||
|
|
||||||
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM)
|
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM)
|
||||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM)
|
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM)
|
||||||
|
|
|
@ -66,22 +66,23 @@
|
||||||
typedef uint32_t hal_timer_t;
|
typedef uint32_t hal_timer_t;
|
||||||
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF
|
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF
|
||||||
|
|
||||||
|
#define HAL_TIMER_RATE ((SystemCoreClock) / 4) // frequency of timers peripherals
|
||||||
|
|
||||||
#define STEP_TIMER_NUM 0 // Timer Index for Stepper
|
#define STEP_TIMER_NUM 0 // Timer Index for Stepper
|
||||||
#define TEMP_TIMER_NUM 1 // Timer Index for Temperature
|
#define TEMP_TIMER_NUM 1 // Timer Index for Temperature
|
||||||
#define PULSE_TIMER_NUM STEP_TIMER_NUM
|
#define PULSE_TIMER_NUM STEP_TIMER_NUM
|
||||||
#define PWM_TIMER_NUM 3 // Timer Index for PWM
|
#define PWM_TIMER_NUM 3 // Timer Index for PWM
|
||||||
|
|
||||||
#define HAL_TIMER_RATE ((SystemCoreClock) / 4) // frequency of timers peripherals
|
|
||||||
#define STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE)
|
|
||||||
#define HAL_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs
|
|
||||||
#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / HAL_TICKS_PER_US)
|
|
||||||
|
|
||||||
#define STEP_TIMER_MIN_INTERVAL 8 // minimum time in µs between stepper interrupts
|
|
||||||
|
|
||||||
#define TEMP_TIMER_RATE 1000000
|
#define TEMP_TIMER_RATE 1000000
|
||||||
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
||||||
|
|
||||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
#define STEPPER_TIMER_RATE HAL_TIMER_RATE // frequency of stepper timer (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE)
|
||||||
|
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs
|
||||||
|
#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US)
|
||||||
|
|
||||||
|
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer
|
||||||
|
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
||||||
|
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
||||||
|
|
||||||
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM)
|
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM)
|
||||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM)
|
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM)
|
||||||
|
|
|
@ -47,37 +47,34 @@
|
||||||
typedef uint16_t hal_timer_t;
|
typedef uint16_t hal_timer_t;
|
||||||
#define HAL_TIMER_TYPE_MAX 0xFFFF
|
#define HAL_TIMER_TYPE_MAX 0xFFFF
|
||||||
|
|
||||||
|
#define HAL_TIMER_RATE (F_CPU) // frequency of timers peripherals
|
||||||
|
|
||||||
|
#define STEP_TIMER_CHAN 1 // Channel of the timer to use for compare and interrupts
|
||||||
|
#define TEMP_TIMER_CHAN 1 // Channel of the timer to use for compare and interrupts
|
||||||
|
|
||||||
#if defined(MCU_STM32F103CB) || defined(MCU_STM32F103C8)
|
#if defined(MCU_STM32F103CB) || defined(MCU_STM32F103C8)
|
||||||
#define STEP_TIMER_NUM 4 // For C8/CB boards, use timer 4
|
#define STEP_TIMER_NUM 4 // For C8/CB boards, use timer 4
|
||||||
#else
|
#else
|
||||||
#define STEP_TIMER_NUM 5 // for other boards, five is fine.
|
#define STEP_TIMER_NUM 5 // for other boards, five is fine.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define STEP_TIMER_CHAN 1 // Channel of the timer to use for compare and interrupts
|
|
||||||
#define TEMP_TIMER_NUM 2 // index of timer to use for temperature
|
#define TEMP_TIMER_NUM 2 // index of timer to use for temperature
|
||||||
#define TEMP_TIMER_CHAN 1 // Channel of the timer to use for compare and interrupts
|
|
||||||
#define PULSE_TIMER_NUM STEP_TIMER_NUM
|
#define PULSE_TIMER_NUM STEP_TIMER_NUM
|
||||||
|
|
||||||
timer_dev* get_timer_dev(int number);
|
|
||||||
|
|
||||||
#define TIMER_DEV(num) get_timer_dev(num)
|
|
||||||
|
|
||||||
#define STEP_TIMER_DEV TIMER_DEV(STEP_TIMER_NUM)
|
|
||||||
#define TEMP_TIMER_DEV TIMER_DEV(TEMP_TIMER_NUM)
|
|
||||||
|
|
||||||
//STM32_HAVE_TIMER(n);
|
|
||||||
|
|
||||||
#define HAL_TIMER_RATE (F_CPU) // frequency of timers peripherals
|
|
||||||
#define STEPPER_TIMER_PRESCALE 18 // prescaler for setting stepper timer, 4Mhz
|
|
||||||
#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // frequency of stepper timer
|
|
||||||
#define HAL_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs
|
|
||||||
|
|
||||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
|
||||||
|
|
||||||
#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz
|
#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz
|
||||||
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
||||||
|
|
||||||
#define STEP_TIMER_MIN_INTERVAL 8 // minimum time in µs between stepper interrupts
|
#define STEPPER_TIMER_PRESCALE 18 // prescaler for setting stepper timer, 4Mhz
|
||||||
|
#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // frequency of stepper timer
|
||||||
|
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs
|
||||||
|
|
||||||
|
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer
|
||||||
|
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
||||||
|
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
||||||
|
|
||||||
|
timer_dev* get_timer_dev(int number);
|
||||||
|
#define TIMER_DEV(num) get_timer_dev(num)
|
||||||
|
#define STEP_TIMER_DEV TIMER_DEV(STEP_TIMER_NUM)
|
||||||
|
#define TEMP_TIMER_DEV TIMER_DEV(TEMP_TIMER_NUM)
|
||||||
|
|
||||||
#define ENABLE_STEPPER_DRIVER_INTERRUPT() timer_enable_irq(STEP_TIMER_DEV, STEP_TIMER_CHAN)
|
#define ENABLE_STEPPER_DRIVER_INTERRUPT() timer_enable_irq(STEP_TIMER_DEV, STEP_TIMER_CHAN)
|
||||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() timer_disable_irq(STEP_TIMER_DEV, STEP_TIMER_CHAN)
|
#define DISABLE_STEPPER_DRIVER_INTERRUPT() timer_disable_irq(STEP_TIMER_DEV, STEP_TIMER_CHAN)
|
||||||
|
|
|
@ -38,21 +38,22 @@
|
||||||
#define hal_timer_t uint32_t // TODO: One is 16-bit, one 32-bit - does this need to be checked?
|
#define hal_timer_t uint32_t // TODO: One is 16-bit, one 32-bit - does this need to be checked?
|
||||||
#define HAL_TIMER_TYPE_MAX 0xFFFF
|
#define HAL_TIMER_TYPE_MAX 0xFFFF
|
||||||
|
|
||||||
|
#define HAL_TIMER_RATE (HAL_RCC_GetSysClockFreq() / 2) // frequency of timer peripherals
|
||||||
|
|
||||||
#define STEP_TIMER_NUM 0 // index of timer to use for stepper
|
#define STEP_TIMER_NUM 0 // index of timer to use for stepper
|
||||||
#define TEMP_TIMER_NUM 1 // index of timer to use for temperature
|
#define TEMP_TIMER_NUM 1 // index of timer to use for temperature
|
||||||
|
|
||||||
#define HAL_TIMER_RATE (HAL_RCC_GetSysClockFreq() / 2) // frequency of timer peripherals
|
|
||||||
#define STEPPER_TIMER_PRESCALE 54 // was 40,prescaler for setting stepper timer, 2Mhz
|
|
||||||
#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // frequency of stepper timer
|
|
||||||
#define HAL_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs
|
|
||||||
|
|
||||||
#define PULSE_TIMER_NUM STEP_TIMER_NUM
|
#define PULSE_TIMER_NUM STEP_TIMER_NUM
|
||||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
|
||||||
|
|
||||||
#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz
|
#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz
|
||||||
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
||||||
|
|
||||||
#define STEP_TIMER_MIN_INTERVAL 8 // minimum time in µs between stepper interrupts
|
#define STEPPER_TIMER_PRESCALE 54 // was 40,prescaler for setting stepper timer, 2Mhz
|
||||||
|
#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // frequency of stepper timer
|
||||||
|
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs
|
||||||
|
|
||||||
|
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer
|
||||||
|
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
||||||
|
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
||||||
|
|
||||||
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM)
|
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM)
|
||||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM)
|
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM)
|
||||||
|
|
|
@ -38,21 +38,22 @@
|
||||||
#define hal_timer_t uint32_t // TODO: One is 16-bit, one 32-bit - does this need to be checked?
|
#define hal_timer_t uint32_t // TODO: One is 16-bit, one 32-bit - does this need to be checked?
|
||||||
#define HAL_TIMER_TYPE_MAX 0xFFFF
|
#define HAL_TIMER_TYPE_MAX 0xFFFF
|
||||||
|
|
||||||
|
#define HAL_TIMER_RATE (HAL_RCC_GetSysClockFreq() / 2) // frequency of timer peripherals
|
||||||
|
|
||||||
#define STEP_TIMER_NUM 0 // index of timer to use for stepper
|
#define STEP_TIMER_NUM 0 // index of timer to use for stepper
|
||||||
#define TEMP_TIMER_NUM 1 // index of timer to use for temperature
|
#define TEMP_TIMER_NUM 1 // index of timer to use for temperature
|
||||||
|
|
||||||
#define HAL_TIMER_RATE (HAL_RCC_GetSysClockFreq() / 2) // frequency of timer peripherals
|
|
||||||
#define STEPPER_TIMER_PRESCALE 54 // was 40,prescaler for setting stepper timer, 2Mhz
|
|
||||||
#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // frequency of stepper timer
|
|
||||||
#define HAL_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs
|
|
||||||
|
|
||||||
#define PULSE_TIMER_NUM STEP_TIMER_NUM
|
#define PULSE_TIMER_NUM STEP_TIMER_NUM
|
||||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
|
||||||
|
|
||||||
#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz
|
|
||||||
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
#define TEMP_TIMER_FREQUENCY 1000 // temperature interrupt frequency
|
||||||
|
#define TEMP_TIMER_PRESCALE 1000 // prescaler for setting Temp timer, 72Khz
|
||||||
|
|
||||||
#define STEP_TIMER_MIN_INTERVAL 8 // minimum time in µs between stepper interrupts
|
#define STEPPER_TIMER_PRESCALE 54 // was 40,prescaler for setting stepper timer, 2Mhz
|
||||||
|
#define STEPPER_TIMER_RATE (HAL_TIMER_RATE / STEPPER_TIMER_PRESCALE) // frequency of stepper timer
|
||||||
|
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // stepper timer ticks per µs
|
||||||
|
|
||||||
|
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer
|
||||||
|
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
||||||
|
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
||||||
|
|
||||||
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM)
|
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM)
|
||||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM)
|
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM)
|
||||||
|
|
|
@ -43,10 +43,6 @@
|
||||||
typedef uint32_t hal_timer_t;
|
typedef uint32_t hal_timer_t;
|
||||||
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF
|
#define HAL_TIMER_TYPE_MAX 0xFFFFFFFF
|
||||||
|
|
||||||
#define STEP_TIMER_NUM 0
|
|
||||||
#define TEMP_TIMER_NUM 1
|
|
||||||
#define PULSE_TIMER_NUM STEP_TIMER_NUM
|
|
||||||
|
|
||||||
#define FTM0_TIMER_PRESCALE 8
|
#define FTM0_TIMER_PRESCALE 8
|
||||||
#define FTM1_TIMER_PRESCALE 4
|
#define FTM1_TIMER_PRESCALE 4
|
||||||
#define FTM0_TIMER_PRESCALE_BITS 0b011
|
#define FTM0_TIMER_PRESCALE_BITS 0b011
|
||||||
|
@ -56,14 +52,20 @@ typedef uint32_t hal_timer_t;
|
||||||
#define FTM1_TIMER_RATE (F_BUS / FTM1_TIMER_PRESCALE) // 60MHz / 4 = 15MHz
|
#define FTM1_TIMER_RATE (F_BUS / FTM1_TIMER_PRESCALE) // 60MHz / 4 = 15MHz
|
||||||
|
|
||||||
#define HAL_TIMER_RATE (FTM0_TIMER_RATE)
|
#define HAL_TIMER_RATE (FTM0_TIMER_RATE)
|
||||||
|
|
||||||
|
#define STEP_TIMER_NUM 0
|
||||||
|
#define TEMP_TIMER_NUM 1
|
||||||
|
#define PULSE_TIMER_NUM STEP_TIMER_NUM
|
||||||
|
|
||||||
|
#define TEMP_TIMER_FREQUENCY 1000
|
||||||
|
|
||||||
#define STEPPER_TIMER_RATE HAL_TIMER_RATE
|
#define STEPPER_TIMER_RATE HAL_TIMER_RATE
|
||||||
#define HAL_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000)
|
#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000)
|
||||||
#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / HAL_TICKS_PER_US)
|
#define STEPPER_TIMER_PRESCALE (CYCLES_PER_MICROSECOND / STEPPER_TIMER_TICKS_PER_US)
|
||||||
#define STEP_TIMER_MIN_INTERVAL 8 // minimum time in µs between stepper interrupts
|
|
||||||
|
|
||||||
#define TEMP_TIMER_FREQUENCY 1000
|
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE // frequency of pulse timer
|
||||||
|
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
||||||
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
|
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
|
||||||
|
|
||||||
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM)
|
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(STEP_TIMER_NUM)
|
||||||
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM)
|
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(STEP_TIMER_NUM)
|
||||||
|
|
|
@ -1263,7 +1263,7 @@ void Stepper::isr() {
|
||||||
#else
|
#else
|
||||||
1
|
1
|
||||||
#endif
|
#endif
|
||||||
* (HAL_TICKS_PER_US)
|
* (STEPPER_TIMER_TICKS_PER_US)
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1316,10 +1316,10 @@ void Stepper::stepper_pulse_phase_isr() {
|
||||||
// Just update the value we will get at the end of the loop
|
// Just update the value we will get at the end of the loop
|
||||||
step_events_completed += events_to_do;
|
step_events_completed += events_to_do;
|
||||||
|
|
||||||
#if MINIMUM_STEPPER_PULSE
|
// Get the timer count and estimate the end of the pulse
|
||||||
// Get the timer count and estimate the end of the pulse
|
hal_timer_t pulse_end = HAL_timer_get_count(PULSE_TIMER_NUM) + hal_timer_t(MIN_PULSE_TICKS);
|
||||||
hal_timer_t pulse_end = HAL_timer_get_count(PULSE_TIMER_NUM) + hal_timer_t((HAL_TICKS_PER_US) * (MINIMUM_STEPPER_PULSE));
|
|
||||||
#endif
|
const hal_timer_t added_step_ticks = ADDED_STEP_TICKS;
|
||||||
|
|
||||||
// Take multiple steps per interrupt (For high speed moves)
|
// Take multiple steps per interrupt (For high speed moves)
|
||||||
do {
|
do {
|
||||||
|
@ -1392,10 +1392,11 @@ void Stepper::stepper_pulse_phase_isr() {
|
||||||
#if MINIMUM_STEPPER_PULSE
|
#if MINIMUM_STEPPER_PULSE
|
||||||
// Just wait for the requested pulse duration
|
// Just wait for the requested pulse duration
|
||||||
while (HAL_timer_get_count(PULSE_TIMER_NUM) < pulse_end) { /* nada */ }
|
while (HAL_timer_get_count(PULSE_TIMER_NUM) < pulse_end) { /* nada */ }
|
||||||
// Add to the value, the value needed for the pulse end and ensuring the maximum driver rate is enforced
|
|
||||||
pulse_end += hal_timer_t(MIN_STEPPER_PULSE_CYCLES) - hal_timer_t((HAL_TICKS_PER_US) * (MINIMUM_STEPPER_PULSE));
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Add the delay needed to ensure the maximum driver rate is enforced
|
||||||
|
if (signed(added_step_ticks) > 0) pulse_end += hal_timer_t(added_step_ticks);
|
||||||
|
|
||||||
// Pulse stop
|
// Pulse stop
|
||||||
#if HAS_X_STEP
|
#if HAS_X_STEP
|
||||||
PULSE_STOP(X);
|
PULSE_STOP(X);
|
||||||
|
@ -1423,15 +1424,15 @@ void Stepper::stepper_pulse_phase_isr() {
|
||||||
// Decrement the count of pending pulses to do
|
// Decrement the count of pending pulses to do
|
||||||
--events_to_do;
|
--events_to_do;
|
||||||
|
|
||||||
#if MINIMUM_STEPPER_PULSE
|
// For minimum pulse time wait after stopping pulses also
|
||||||
// For minimum pulse time wait after stopping pulses also
|
if (events_to_do) {
|
||||||
if (events_to_do) {
|
// Just wait for the requested pulse duration
|
||||||
// Just wait for the requested pulse duration
|
while (HAL_timer_get_count(PULSE_TIMER_NUM) < pulse_end) { /* nada */ }
|
||||||
while (HAL_timer_get_count(PULSE_TIMER_NUM) < pulse_end) { /* nada */ }
|
#if MINIMUM_STEPPER_PULSE
|
||||||
// Add to the value, the time that the pulse must be active (to be used on the next loop)
|
// Add to the value, the time that the pulse must be active (to be used on the next loop)
|
||||||
pulse_end += hal_timer_t((HAL_TICKS_PER_US) * (MINIMUM_STEPPER_PULSE));
|
pulse_end += hal_timer_t(MIN_PULSE_TICKS);
|
||||||
}
|
#endif
|
||||||
#endif
|
}
|
||||||
|
|
||||||
} while (events_to_do);
|
} while (events_to_do);
|
||||||
}
|
}
|
||||||
|
@ -1810,13 +1811,15 @@ uint32_t Stepper::stepper_block_phase_isr() {
|
||||||
REV_E_DIR(active_extruder);
|
REV_E_DIR(active_extruder);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Get the timer count and estimate the end of the pulse
|
||||||
|
hal_timer_t pulse_end = HAL_timer_get_count(PULSE_TIMER_NUM) + hal_timer_t(MIN_PULSE_TICKS);
|
||||||
|
|
||||||
|
const hal_timer_t added_step_ticks = ADDED_STEP_TICKS;
|
||||||
|
|
||||||
// Step E stepper if we have steps
|
// Step E stepper if we have steps
|
||||||
while (LA_steps) {
|
while (LA_steps) {
|
||||||
|
|
||||||
#if MINIMUM_STEPPER_PULSE
|
// Set the STEP pulse ON
|
||||||
hal_timer_t pulse_end = HAL_timer_get_count(PULSE_TIMER_NUM) + hal_timer_t((HAL_TICKS_PER_US) * (MINIMUM_STEPPER_PULSE));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if ENABLED(MIXING_EXTRUDER)
|
#if ENABLED(MIXING_EXTRUDER)
|
||||||
MIXING_STEPPERS_LOOP(j) {
|
MIXING_STEPPERS_LOOP(j) {
|
||||||
// Step mixing steppers (proportionally)
|
// Step mixing steppers (proportionally)
|
||||||
|
@ -1828,15 +1831,18 @@ uint32_t Stepper::stepper_block_phase_isr() {
|
||||||
E_STEP_WRITE(active_extruder, !INVERT_E_STEP_PIN);
|
E_STEP_WRITE(active_extruder, !INVERT_E_STEP_PIN);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Enforce a minimum duration for STEP pulse ON
|
||||||
#if MINIMUM_STEPPER_PULSE
|
#if MINIMUM_STEPPER_PULSE
|
||||||
// Just wait for the requested pulse duration
|
// Just wait for the requested pulse duration
|
||||||
while (HAL_timer_get_count(PULSE_TIMER_NUM) < pulse_end) { /* nada */ }
|
while (HAL_timer_get_count(PULSE_TIMER_NUM) < pulse_end) { /* nada */ }
|
||||||
// Add to the value, the value needed for the pulse end and ensuring the maximum driver rate is enforced
|
|
||||||
pulse_end += hal_timer_t(MIN_STEPPER_PULSE_CYCLES) - hal_timer_t((HAL_TICKS_PER_US) * (MINIMUM_STEPPER_PULSE));
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Add the delay needed to ensure the maximum driver rate is enforced
|
||||||
|
if (signed(added_step_ticks) > 0) pulse_end += hal_timer_t(added_step_ticks);
|
||||||
|
|
||||||
LA_steps < 0 ? ++LA_steps : --LA_steps;
|
LA_steps < 0 ? ++LA_steps : --LA_steps;
|
||||||
|
|
||||||
|
// Set the STEP pulse OFF
|
||||||
#if ENABLED(MIXING_EXTRUDER)
|
#if ENABLED(MIXING_EXTRUDER)
|
||||||
MIXING_STEPPERS_LOOP(j) {
|
MIXING_STEPPERS_LOOP(j) {
|
||||||
if (delta_error_m[j] >= 0) {
|
if (delta_error_m[j] >= 0) {
|
||||||
|
@ -1848,12 +1854,15 @@ uint32_t Stepper::stepper_block_phase_isr() {
|
||||||
E_STEP_WRITE(active_extruder, INVERT_E_STEP_PIN);
|
E_STEP_WRITE(active_extruder, INVERT_E_STEP_PIN);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if MINIMUM_STEPPER_PULSE
|
// For minimum pulse time wait before looping
|
||||||
// For minimum pulse time wait before looping
|
// Just wait for the requested pulse duration
|
||||||
// Just wait for the requested pulse duration
|
if (LA_steps) {
|
||||||
if (LA_steps) while (HAL_timer_get_count(PULSE_TIMER_NUM) < pulse_end) { /* nada */ }
|
while (HAL_timer_get_count(PULSE_TIMER_NUM) < pulse_end) { /* nada */ }
|
||||||
#endif
|
#if MINIMUM_STEPPER_PULSE
|
||||||
|
// Add to the value, the time that the pulse must be active (to be used on the next loop)
|
||||||
|
pulse_end += hal_timer_t(MIN_PULSE_TICKS);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
} // LA_steps
|
} // LA_steps
|
||||||
|
|
||||||
return interval;
|
return interval;
|
||||||
|
|
Reference in a new issue