Parcourir la source

Use prior babystep delay method (#16833)

Scott Lahteine il y a 4 ans
Parent
révision
189c101793
Aucun compte lié à l'adresse e-mail de l'auteur
1 fichiers modifiés avec 57 ajouts et 28 suppressions
  1. 57
    28
      Marlin/src/module/stepper.cpp

+ 57
- 28
Marlin/src/module/stepper.cpp Voir le fichier

@@ -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

Chargement…
Annuler
Enregistrer