|
@@ -2432,47 +2432,78 @@ void Stepper::report_positions() {
|
2432
|
2432
|
#define _INVERT_DIR(AXIS) INVERT_## AXIS ##_DIR
|
2433
|
2433
|
#define _APPLY_DIR(AXIS, INVERT) AXIS ##_APPLY_DIR(INVERT, true)
|
2434
|
2434
|
|
|
2435
|
+ #if MINIMUM_STEPPER_PULSE
|
|
2436
|
+ #define STEP_PULSE_CYCLES ((MINIMUM_STEPPER_PULSE) * CYCLES_PER_MICROSECOND)
|
|
2437
|
+ #else
|
|
2438
|
+ #define STEP_PULSE_CYCLES 0
|
|
2439
|
+ #endif
|
|
2440
|
+
|
|
2441
|
+ #if ENABLED(DELTA)
|
|
2442
|
+ #define CYCLES_EATEN_BABYSTEP (2 * 15)
|
|
2443
|
+ #else
|
|
2444
|
+ #define CYCLES_EATEN_BABYSTEP 0
|
|
2445
|
+ #endif
|
|
2446
|
+ #define EXTRA_CYCLES_BABYSTEP (STEP_PULSE_CYCLES - (CYCLES_EATEN_BABYSTEP))
|
|
2447
|
+
|
|
2448
|
+ #if EXTRA_CYCLES_BABYSTEP > 20
|
|
2449
|
+ #define _SAVE_START() const hal_timer_t pulse_start = HAL_timer_get_count(PULSE_TIMER_NUM)
|
|
2450
|
+ #define _PULSE_WAIT() while (EXTRA_CYCLES_BABYSTEP > (uint32_t)(HAL_timer_get_count(PULSE_TIMER_NUM) - pulse_start) * (PULSE_TIMER_PRESCALE)) { /* nada */ }
|
|
2451
|
+ #else
|
|
2452
|
+ #define _SAVE_START() NOOP
|
|
2453
|
+ #if EXTRA_CYCLES_BABYSTEP > 0
|
|
2454
|
+ #define _PULSE_WAIT() DELAY_NS(EXTRA_CYCLES_BABYSTEP * NANOSECONDS_PER_CYCLE)
|
|
2455
|
+ #elif ENABLED(DELTA)
|
|
2456
|
+ #define _PULSE_WAIT() DELAY_US(2);
|
|
2457
|
+ #elif STEP_PULSE_CYCLES > 0
|
|
2458
|
+ #define _PULSE_WAIT() NOOP
|
|
2459
|
+ #else
|
|
2460
|
+ #define _PULSE_WAIT() DELAY_US(4);
|
|
2461
|
+ #endif
|
|
2462
|
+ #endif
|
|
2463
|
+
|
2435
|
2464
|
#if DISABLED(DELTA)
|
|
2465
|
+
|
2436
|
2466
|
#define BABYSTEP_AXIS(AXIS, INV, DIR) do{ \
|
2437
|
2467
|
const uint8_t old_dir = _READ_DIR(AXIS); \
|
2438
|
2468
|
_ENABLE_AXIS(AXIS); \
|
2439
|
2469
|
DIR_WAIT_BEFORE(); \
|
2440
|
2470
|
_APPLY_DIR(AXIS, _INVERT_DIR(AXIS)^DIR^INV); \
|
2441
|
2471
|
DIR_WAIT_AFTER(); \
|
2442
|
|
- USING_TIMED_PULSE(); \
|
2443
|
|
- START_HIGH_PULSE(); \
|
|
2472
|
+ _SAVE_START(); \
|
2444
|
2473
|
_APPLY_STEP(AXIS, !_INVERT_STEP_PIN(AXIS), true); \
|
2445
|
|
- AWAIT_HIGH_PULSE(); \
|
2446
|
|
- _APPLY_STEP(AXIS, _INVERT_STEP_PIN(AXIS), true); \
|
|
2474
|
+ _PULSE_WAIT(); \
|
|
2475
|
+ _APPLY_STEP(AXIS, _INVERT_STEP_PIN(AXIS), true); \
|
|
2476
|
+ DIR_WAIT_BEFORE(); \
|
2447
|
2477
|
_APPLY_DIR(AXIS, old_dir); \
|
|
2478
|
+ DIR_WAIT_AFTER(); \
|
2448
|
2479
|
}while(0)
|
2449
|
|
- #endif
|
2450
|
2480
|
|
2451
|
|
- #if IS_CORE
|
2452
|
|
- #define BABYSTEP_CORE(A, B, INV, DIR) do{ \
|
|
2481
|
+ #elif IS_CORE
|
|
2482
|
+
|
|
2483
|
+ #define BABYSTEP_CORE(A, B, INV, DIR) do{ \
|
2453
|
2484
|
const xy_byte_t old_dir = { _READ_DIR(A), _READ_DIR(B) }; \
|
2454
|
|
- _ENABLE_AXIS(A); _ENABLE_AXIS(B); \
|
2455
|
|
- DIR_WAIT_BEFORE(); \
|
2456
|
|
- _APPLY_DIR(A, _INVERT_DIR(A)^DIR^INV); \
|
2457
|
|
- _APPLY_DIR(B, _INVERT_DIR(B)^DIR^INV^(CORESIGN(1)<0)); \
|
2458
|
|
- DIR_WAIT_AFTER(); \
|
2459
|
|
- USING_TIMED_PULSE(); \
|
2460
|
|
- START_HIGH_PULSE(); \
|
2461
|
|
- _APPLY_STEP(A, !_INVERT_STEP_PIN(A), true); \
|
2462
|
|
- _APPLY_STEP(B, !_INVERT_STEP_PIN(B), true); \
|
2463
|
|
- AWAIT_HIGH_PULSE(); \
|
2464
|
|
- _APPLY_STEP(A, _INVERT_STEP_PIN(A), true); \
|
2465
|
|
- _APPLY_STEP(B, _INVERT_STEP_PIN(B), true); \
|
2466
|
|
- _APPLY_DIR(A, old_dir.a); _APPLY_DIR(B, old_dir.b); \
|
|
2485
|
+ _ENABLE_AXIS(A); _ENABLE_AXIS(B); \
|
|
2486
|
+ DIR_WAIT_BEFORE(); \
|
|
2487
|
+ _APPLY_DIR(A, _INVERT_DIR(A)^DIR^INV); \
|
|
2488
|
+ _APPLY_DIR(B, _INVERT_DIR(B)^DIR^INV^(CORESIGN(1)<0)); \
|
|
2489
|
+ DIR_WAIT_AFTER(); \
|
|
2490
|
+ _SAVE_START(); \
|
|
2491
|
+ _APPLY_STEP(A, !_INVERT_STEP_PIN(A), true); \
|
|
2492
|
+ _APPLY_STEP(B, !_INVERT_STEP_PIN(B), true); \
|
|
2493
|
+ _PULSE_WAIT(); \
|
|
2494
|
+ _APPLY_STEP(A, _INVERT_STEP_PIN(A), true); \
|
|
2495
|
+ _APPLY_STEP(B, _INVERT_STEP_PIN(B), true); \
|
|
2496
|
+ DIR_WAIT_BEFORE(); \
|
|
2497
|
+ _APPLY_DIR(A, old_dir.a); _APPLY_DIR(B, old_dir.b); \
|
|
2498
|
+ DIR_WAIT_AFTER(); \
|
2467
|
2499
|
}while(0)
|
|
2500
|
+
|
2468
|
2501
|
#endif
|
2469
|
2502
|
|
2470
|
2503
|
// MUST ONLY BE CALLED BY AN ISR,
|
2471
|
2504
|
// No other ISR should ever interrupt this!
|
2472
|
2505
|
void Stepper::babystep(const AxisEnum axis, const bool direction) {
|
2473
|
|
- DISABLE_ISRS();
|
2474
|
|
-
|
2475
|
|
- USING_TIMED_PULSE();
|
|
2506
|
+ cli();
|
2476
|
2507
|
|
2477
|
2508
|
switch (axis) {
|
2478
|
2509
|
|
|
@@ -2527,13 +2558,13 @@ void Stepper::report_positions() {
|
2527
|
2558
|
|
2528
|
2559
|
DIR_WAIT_AFTER();
|
2529
|
2560
|
|
2530
|
|
- START_HIGH_PULSE();
|
|
2561
|
+ _SAVE_START();
|
2531
|
2562
|
|
2532
|
2563
|
X_STEP_WRITE(!INVERT_X_STEP_PIN);
|
2533
|
2564
|
Y_STEP_WRITE(!INVERT_Y_STEP_PIN);
|
2534
|
2565
|
Z_STEP_WRITE(!INVERT_Z_STEP_PIN);
|
2535
|
2566
|
|
2536
|
|
- AWAIT_HIGH_PULSE();
|
|
2567
|
+ _PULSE_WAIT();
|
2537
|
2568
|
|
2538
|
2569
|
X_STEP_WRITE(INVERT_X_STEP_PIN);
|
2539
|
2570
|
Y_STEP_WRITE(INVERT_Y_STEP_PIN);
|
|
@@ -2550,9 +2581,7 @@ void Stepper::report_positions() {
|
2550
|
2581
|
|
2551
|
2582
|
default: break;
|
2552
|
2583
|
}
|
2553
|
|
-
|
2554
|
|
- START_LOW_PULSE(); AWAIT_LOW_PULSE(); // Prevent Stepper::ISR pulsing too soon
|
2555
|
|
- ENABLE_ISRS(); // Now it's ok for the ISR to run
|
|
2584
|
+ sei();
|
2556
|
2585
|
}
|
2557
|
2586
|
|
2558
|
2587
|
#endif // BABYSTEPPING
|