Parcourir la source

Fix #5699 - LIN_ADVANCE freeze when ADV_RATE returns 0

Ross Allan il y a 8 ans
Parent
révision
cfcd069501
1 fichiers modifiés avec 18 ajouts et 5 suppressions
  1. 18
    5
      Marlin/stepper.cpp

+ 18
- 5
Marlin/stepper.cpp Voir le fichier

110
          Stepper::advance;
110
          Stepper::advance;
111
   #endif
111
   #endif
112
 
112
 
113
-  #define ADV_RATE(T, L) (e_steps[TOOL_E_INDEX] ? (T) * (L) / abs(e_steps[TOOL_E_INDEX]) : ADV_NEVER)
113
+  /**
114
+   * See https://github.com/MarlinFirmware/Marlin/issues/5699#issuecomment-309264382
115
+   *
116
+   * This fix isn't perfect and may lose steps - but better than locking up completely
117
+   * in future the planner should slow down if advance stepping rate would be too high
118
+   */
119
+  FORCE_INLINE uint16_t adv_rate(const int steps, const uint16_t timer, const uint8_t loops) {
120
+    if (steps) {
121
+      const uint16_t rate = (timer * loops) / abs(steps);
122
+      //return constrain(rate, 1, ADV_NEVER - 1)
123
+      return rate ? rate : 1;
124
+    }
125
+    return ADV_NEVER;
126
+  }
114
 
127
 
115
-#endif
128
+#endif // ADVANCE || LIN_ADVANCE
116
 
129
 
117
 long Stepper::acceleration_time, Stepper::deceleration_time;
130
 long Stepper::acceleration_time, Stepper::deceleration_time;
118
 
131
 
743
     #endif // ADVANCE or LIN_ADVANCE
756
     #endif // ADVANCE or LIN_ADVANCE
744
 
757
 
745
     #if ENABLED(ADVANCE) || ENABLED(LIN_ADVANCE)
758
     #if ENABLED(ADVANCE) || ENABLED(LIN_ADVANCE)
746
-      eISR_Rate = ADV_RATE(timer, step_loops);
759
+      eISR_Rate = adv_rate(e_steps[TOOL_E_INDEX], timer, step_loops);
747
     #endif
760
     #endif
748
   }
761
   }
749
   else if (step_events_completed > (uint32_t)current_block->decelerate_after) {
762
   else if (step_events_completed > (uint32_t)current_block->decelerate_after) {
797
     #endif // ADVANCE or LIN_ADVANCE
810
     #endif // ADVANCE or LIN_ADVANCE
798
 
811
 
799
     #if ENABLED(ADVANCE) || ENABLED(LIN_ADVANCE)
812
     #if ENABLED(ADVANCE) || ENABLED(LIN_ADVANCE)
800
-      eISR_Rate = ADV_RATE(timer, step_loops);
813
+      eISR_Rate = adv_rate(e_steps[TOOL_E_INDEX], timer, step_loops);
801
     #endif
814
     #endif
802
   }
815
   }
803
   else {
816
   else {
807
       if (current_block->use_advance_lead)
820
       if (current_block->use_advance_lead)
808
         current_estep_rate[TOOL_E_INDEX] = final_estep_rate;
821
         current_estep_rate[TOOL_E_INDEX] = final_estep_rate;
809
 
822
 
810
-      eISR_Rate = ADV_RATE(OCR1A_nominal, step_loops_nominal);
823
+      eISR_Rate = adv_rate(e_steps[TOOL_E_INDEX], OCR1A_nominal, step_loops_nominal);
811
 
824
 
812
     #endif
825
     #endif
813
 
826
 

Chargement…
Annuler
Enregistrer