🚸 Refine stepper-driver-related G-codes (#23372)
This commit is contained in:
		
							parent
							
								
									56adbc3ebf
								
							
						
					
					
						commit
						99c237e05e
					
				| @ -45,6 +45,12 @@ constexpr uint16_t _tmc_thrs(const uint16_t msteps, const uint32_t thrs, const u | |||||||
|   return 12650000UL * msteps / (256 * thrs * spmm); |   return 12650000UL * msteps / (256 * thrs * spmm); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | typedef struct { | ||||||
|  |   uint8_t toff; | ||||||
|  |   int8_t hend; | ||||||
|  |   uint8_t hstrt; | ||||||
|  | } chopper_timing_t; | ||||||
|  | 
 | ||||||
| template<char AXIS_LETTER, char DRIVER_ID> | template<char AXIS_LETTER, char DRIVER_ID> | ||||||
| class TMCStorage { | class TMCStorage { | ||||||
|   protected: |   protected: | ||||||
| @ -297,43 +303,6 @@ class TMCMarlin<TMC2660Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> : public TMC266 | |||||||
|                             sgt_max =  63; |                             sgt_max =  63; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| template<typename TMC> |  | ||||||
| void tmc_print_current(TMC &st) { |  | ||||||
|   st.printLabel(); |  | ||||||
|   SERIAL_ECHOLNPGM(" driver current: ", st.getMilliamps()); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #if ENABLED(MONITOR_DRIVER_STATUS) |  | ||||||
|   template<typename TMC> |  | ||||||
|   void tmc_report_otpw(TMC &st) { |  | ||||||
|     st.printLabel(); |  | ||||||
|     SERIAL_ECHOPGM(" temperature prewarn triggered: "); |  | ||||||
|     serialprint_truefalse(st.getOTPW()); |  | ||||||
|     SERIAL_EOL(); |  | ||||||
|   } |  | ||||||
|   template<typename TMC> |  | ||||||
|   void tmc_clear_otpw(TMC &st) { |  | ||||||
|     st.clear_otpw(); |  | ||||||
|     st.printLabel(); |  | ||||||
|     SERIAL_ECHOLNPGM(" prewarn flag cleared"); |  | ||||||
|   } |  | ||||||
| #endif |  | ||||||
| #if ENABLED(HYBRID_THRESHOLD) |  | ||||||
|   template<typename TMC> |  | ||||||
|   void tmc_print_pwmthrs(TMC &st) { |  | ||||||
|     st.printLabel(); |  | ||||||
|     SERIAL_ECHOLNPGM(" stealthChop max speed: ", st.get_pwm_thrs()); |  | ||||||
|   } |  | ||||||
| #endif |  | ||||||
| #if USE_SENSORLESS |  | ||||||
|   template<typename TMC> |  | ||||||
|   void tmc_print_sgt(TMC &st) { |  | ||||||
|     st.printLabel(); |  | ||||||
|     SERIAL_ECHOPGM(" homing sensitivity: "); |  | ||||||
|     SERIAL_PRINTLN(st.homing_threshold(), PrintBase::Dec); |  | ||||||
|   } |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| void monitor_tmc_drivers(); | void monitor_tmc_drivers(); | ||||||
| void test_tmc_connection(LOGICAL_AXIS_DECL(const bool, true)); | void test_tmc_connection(LOGICAL_AXIS_DECL(const bool, true)); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -202,12 +202,11 @@ void L64XX_report_current(L64XX &motor, const L64XX_axis_t axis) { | |||||||
|  * On L6474 this sets the TVAL register (same address). |  * On L6474 this sets the TVAL register (same address). | ||||||
|  * |  * | ||||||
|  * I - select which driver(s) to change on multi-driver axis |  * I - select which driver(s) to change on multi-driver axis | ||||||
|  *     0 - (default) all drivers on the axis or E0 |  *         (default) all drivers on the axis | ||||||
|  *     1 - monitor only X, Y, Z or E1 |  *     0 - monitor only the first XYZ... driver | ||||||
|  *     2 - monitor only X2, Y2, Z2 or E2 |  *     1 - monitor only X2, Y2, Z2 | ||||||
|  *     3 - monitor only Z3 or E3 |  *     2 - monitor only Z3 | ||||||
|  *     4 - monitor only Z4 or E4 |  *     3 - monitor only Z4 | ||||||
|  *     5 - monitor only E5 |  | ||||||
|  * Xxxx, Yxxx, Zxxx, Exxx - axis to change (optional) |  * Xxxx, Yxxx, Zxxx, Exxx - axis to change (optional) | ||||||
|  *     L6474 - current in mA (4A max) |  *     L6474 - current in mA (4A max) | ||||||
|  *     All others - 0-255 |  *     All others - 0-255 | ||||||
| @ -227,8 +226,10 @@ void GcodeSuite::M906() { | |||||||
| 
 | 
 | ||||||
|   uint8_t report_current = true; |   uint8_t report_current = true; | ||||||
| 
 | 
 | ||||||
|   #if HAS_L64XX |   #if AXIS_IS_L64XX(X2) || AXIS_IS_L64XX(Y2) || AXIS_IS_L64XX(Z2) || AXIS_IS_L64XX(Z3) || AXIS_IS_L64XX(Z4) | ||||||
|     const uint8_t index = parser.byteval('I'); |     const int8_t index = parser.byteval('I', -1); | ||||||
|  |   #else | ||||||
|  |     constexpr int8_t index = -1; | ||||||
|   #endif |   #endif | ||||||
| 
 | 
 | ||||||
|   LOOP_LOGICAL_AXES(i) if (uint16_t value = parser.intval(axis_codes[i])) { |   LOOP_LOGICAL_AXES(i) if (uint16_t value = parser.intval(axis_codes[i])) { | ||||||
| @ -243,20 +244,20 @@ void GcodeSuite::M906() { | |||||||
|     switch (i) { |     switch (i) { | ||||||
|       case X_AXIS: |       case X_AXIS: | ||||||
|         #if AXIS_IS_L64XX(X) |         #if AXIS_IS_L64XX(X) | ||||||
|           if (index == 0) L6470_SET_KVAL_HOLD(X); |           if (index < 0 || index == 0) L6470_SET_KVAL_HOLD(X); | ||||||
|         #endif |         #endif | ||||||
|         #if AXIS_IS_L64XX(X2) |         #if AXIS_IS_L64XX(X2) | ||||||
|           if (index == 1) L6470_SET_KVAL_HOLD(X2); |           if (index < 0 || index == 1) L6470_SET_KVAL_HOLD(X2); | ||||||
|         #endif |         #endif | ||||||
|         break; |         break; | ||||||
| 
 | 
 | ||||||
|       #if HAS_Y_AXIS |       #if HAS_Y_AXIS | ||||||
|         case Y_AXIS: |         case Y_AXIS: | ||||||
|           #if AXIS_IS_L64XX(Y) |           #if AXIS_IS_L64XX(Y) | ||||||
|             if (index == 0) L6470_SET_KVAL_HOLD(Y); |             if (index < 0 || index == 0) L6470_SET_KVAL_HOLD(Y); | ||||||
|           #endif |           #endif | ||||||
|           #if AXIS_IS_L64XX(Y2) |           #if AXIS_IS_L64XX(Y2) | ||||||
|             if (index == 1) L6470_SET_KVAL_HOLD(Y2); |             if (index < 0 || index == 1) L6470_SET_KVAL_HOLD(Y2); | ||||||
|           #endif |           #endif | ||||||
|           break; |           break; | ||||||
|       #endif |       #endif | ||||||
| @ -264,50 +265,47 @@ void GcodeSuite::M906() { | |||||||
|       #if HAS_Z_AXIS |       #if HAS_Z_AXIS | ||||||
|         case Z_AXIS: |         case Z_AXIS: | ||||||
|           #if AXIS_IS_L64XX(Z) |           #if AXIS_IS_L64XX(Z) | ||||||
|             if (index == 0) L6470_SET_KVAL_HOLD(Z); |             if (index < 0 || index == 0) L6470_SET_KVAL_HOLD(Z); | ||||||
|           #endif |           #endif | ||||||
|           #if AXIS_IS_L64XX(Z2) |           #if AXIS_IS_L64XX(Z2) | ||||||
|             if (index == 1) L6470_SET_KVAL_HOLD(Z2); |             if (index < 0 || index == 1) L6470_SET_KVAL_HOLD(Z2); | ||||||
|           #endif |           #endif | ||||||
|           #if AXIS_IS_L64XX(Z3) |           #if AXIS_IS_L64XX(Z3) | ||||||
|             if (index == 2) L6470_SET_KVAL_HOLD(Z3); |             if (index < 0 || index == 2) L6470_SET_KVAL_HOLD(Z3); | ||||||
|           #endif |           #endif | ||||||
|           #if AXIS_DRIVER_TYPE_Z4(L6470) |           #if AXIS_DRIVER_TYPE_Z4(L6470) | ||||||
|             if (index == 3) L6470_SET_KVAL_HOLD(Z4); |             if (index < 0 || index == 3) L6470_SET_KVAL_HOLD(Z4); | ||||||
|           #endif |           #endif | ||||||
|           break; |           break; | ||||||
|       #endif |       #endif | ||||||
| 
 | 
 | ||||||
|       #if E_STEPPERS |       #if E_STEPPERS | ||||||
|         case E_AXIS: { |         case E_AXIS: { | ||||||
|           const int8_t target_e_stepper = get_target_e_stepper_from_command(0); |           const int8_t eindex = get_target_e_stepper_from_command(-2); | ||||||
|           if (target_e_stepper < 0) return; |           #if AXIS_IS_L64XX(E0) | ||||||
|           switch (target_e_stepper) { |             if (eindex < 0 || eindex == 0) L6470_SET_KVAL_HOLD(E0); | ||||||
|             #if AXIS_IS_L64XX(E0) |           #endif | ||||||
|               case 0: L6470_SET_KVAL_HOLD(E0); break; |           #if AXIS_IS_L64XX(E1) | ||||||
|             #endif |             if (eindex < 0 || eindex == 1) L6470_SET_KVAL_HOLD(E1); | ||||||
|             #if AXIS_IS_L64XX(E1) |           #endif | ||||||
|               case 1: L6470_SET_KVAL_HOLD(E1); break; |           #if AXIS_IS_L64XX(E2) | ||||||
|             #endif |             if (eindex < 0 || eindex == 2) L6470_SET_KVAL_HOLD(E2); | ||||||
|             #if AXIS_IS_L64XX(E2) |           #endif | ||||||
|               case 2: L6470_SET_KVAL_HOLD(E2); break; |           #if AXIS_IS_L64XX(E3) | ||||||
|             #endif |             if (eindex < 0 || eindex == 3) L6470_SET_KVAL_HOLD(E3); | ||||||
|             #if AXIS_IS_L64XX(E3) |           #endif | ||||||
|               case 3: L6470_SET_KVAL_HOLD(E3); break; |           #if AXIS_IS_L64XX(E4) | ||||||
|             #endif |             if (eindex < 0 || eindex == 4) L6470_SET_KVAL_HOLD(E4); | ||||||
|             #if AXIS_IS_L64XX(E4) |           #endif | ||||||
|               case 4: L6470_SET_KVAL_HOLD(E4); break; |           #if AXIS_IS_L64XX(E5) | ||||||
|             #endif |             if (eindex < 0 || eindex == 5) L6470_SET_KVAL_HOLD(E5); | ||||||
|             #if AXIS_IS_L64XX(E5) |           #endif | ||||||
|               case 5: L6470_SET_KVAL_HOLD(E5); break; |           #if AXIS_IS_L64XX(E6) | ||||||
|             #endif |             if (eindex < 0 || eindex == 6) L6470_SET_KVAL_HOLD(E6); | ||||||
|             #if AXIS_IS_L64XX(E6) |           #endif | ||||||
|               case 6: L6470_SET_KVAL_HOLD(E6); break; |           #if AXIS_IS_L64XX(E7) | ||||||
|             #endif |             if (eindex < 0 || eindex == 7) L6470_SET_KVAL_HOLD(E7); | ||||||
|             #if AXIS_IS_L64XX(E7) |           #endif | ||||||
|               case 7: L6470_SET_KVAL_HOLD(E7); break; |  | ||||||
|             #endif |  | ||||||
|           } |  | ||||||
|         } break; |         } break; | ||||||
|       #endif |       #endif | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -40,35 +40,35 @@ void tmc_set_stealthChop(TMC &st, const bool enable) { | |||||||
|   st.refresh_stepping_mode(); |   st.refresh_stepping_mode(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void set_stealth_status(const bool enable, const int8_t target_e_stepper) { | static void set_stealth_status(const bool enable, const int8_t eindex) { | ||||||
|   #define TMC_SET_STEALTH(Q) tmc_set_stealthChop(stepper##Q, enable) |   #define TMC_SET_STEALTH(Q) tmc_set_stealthChop(stepper##Q, enable) | ||||||
| 
 | 
 | ||||||
|   #if    X_HAS_STEALTHCHOP  || Y_HAS_STEALTHCHOP  || Z_HAS_STEALTHCHOP \ |   #if X2_HAS_STEALTHCHOP || Y2_HAS_STEALTHCHOP || Z2_HAS_STEALTHCHOP || Z3_HAS_STEALTHCHOP || Z4_HAS_STEALTHCHOP | ||||||
|       || I_HAS_STEALTHCHOP  || J_HAS_STEALTHCHOP  || K_HAS_STEALTHCHOP \ |     const int8_t index = parser.byteval('I', -1); | ||||||
|       || X2_HAS_STEALTHCHOP || Y2_HAS_STEALTHCHOP || Z2_HAS_STEALTHCHOP || Z3_HAS_STEALTHCHOP || Z4_HAS_STEALTHCHOP |   #else | ||||||
|     const uint8_t index = parser.byteval('I'); |     constexpr int8_t index = -1; | ||||||
|   #endif |   #endif | ||||||
| 
 | 
 | ||||||
|   LOOP_LOGICAL_AXES(i) if (parser.seen(axis_codes[i])) { |   LOOP_LOGICAL_AXES(i) if (parser.seen(axis_codes[i])) { | ||||||
|     switch (i) { |     switch (i) { | ||||||
|       case X_AXIS: |       case X_AXIS: | ||||||
|         TERN_(X_HAS_STEALTHCHOP,  if (index == 0) TMC_SET_STEALTH(X)); |         TERN_(X_HAS_STEALTHCHOP,  if (index < 0 || index == 0) TMC_SET_STEALTH(X)); | ||||||
|         TERN_(X2_HAS_STEALTHCHOP, if (index == 1) TMC_SET_STEALTH(X2)); |         TERN_(X2_HAS_STEALTHCHOP, if (index < 0 || index == 1) TMC_SET_STEALTH(X2)); | ||||||
|         break; |         break; | ||||||
| 
 | 
 | ||||||
|       #if HAS_Y_AXIS |       #if HAS_Y_AXIS | ||||||
|         case Y_AXIS: |         case Y_AXIS: | ||||||
|           TERN_(Y_HAS_STEALTHCHOP,  if (index == 0) TMC_SET_STEALTH(Y)); |           TERN_(Y_HAS_STEALTHCHOP,  if (index < 0 || index == 0) TMC_SET_STEALTH(Y)); | ||||||
|           TERN_(Y2_HAS_STEALTHCHOP, if (index == 1) TMC_SET_STEALTH(Y2)); |           TERN_(Y2_HAS_STEALTHCHOP, if (index < 0 || index == 1) TMC_SET_STEALTH(Y2)); | ||||||
|           break; |           break; | ||||||
|       #endif |       #endif | ||||||
| 
 | 
 | ||||||
|       #if HAS_Z_AXIS |       #if HAS_Z_AXIS | ||||||
|         case Z_AXIS: |         case Z_AXIS: | ||||||
|           TERN_(Z_HAS_STEALTHCHOP,  if (index == 0) TMC_SET_STEALTH(Z)); |           TERN_(Z_HAS_STEALTHCHOP,  if (index < 0 || index == 0) TMC_SET_STEALTH(Z)); | ||||||
|           TERN_(Z2_HAS_STEALTHCHOP, if (index == 1) TMC_SET_STEALTH(Z2)); |           TERN_(Z2_HAS_STEALTHCHOP, if (index < 0 || index == 1) TMC_SET_STEALTH(Z2)); | ||||||
|           TERN_(Z3_HAS_STEALTHCHOP, if (index == 2) TMC_SET_STEALTH(Z3)); |           TERN_(Z3_HAS_STEALTHCHOP, if (index < 0 || index == 2) TMC_SET_STEALTH(Z3)); | ||||||
|           TERN_(Z4_HAS_STEALTHCHOP, if (index == 3) TMC_SET_STEALTH(Z4)); |           TERN_(Z4_HAS_STEALTHCHOP, if (index < 0 || index == 3) TMC_SET_STEALTH(Z4)); | ||||||
|           break; |           break; | ||||||
|       #endif |       #endif | ||||||
| 
 | 
 | ||||||
| @ -84,17 +84,14 @@ static void set_stealth_status(const bool enable, const int8_t target_e_stepper) | |||||||
| 
 | 
 | ||||||
|       #if E_STEPPERS |       #if E_STEPPERS | ||||||
|         case E_AXIS: { |         case E_AXIS: { | ||||||
|           if (target_e_stepper < 0) return; |           TERN_(E0_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 0) TMC_SET_STEALTH(E0)); | ||||||
|           switch (target_e_stepper) { |           TERN_(E1_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 1) TMC_SET_STEALTH(E1)); | ||||||
|             TERN_(E0_HAS_STEALTHCHOP, case 0: TMC_SET_STEALTH(E0); break;) |           TERN_(E2_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 2) TMC_SET_STEALTH(E2)); | ||||||
|             TERN_(E1_HAS_STEALTHCHOP, case 1: TMC_SET_STEALTH(E1); break;) |           TERN_(E3_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 3) TMC_SET_STEALTH(E3)); | ||||||
|             TERN_(E2_HAS_STEALTHCHOP, case 2: TMC_SET_STEALTH(E2); break;) |           TERN_(E4_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 4) TMC_SET_STEALTH(E4)); | ||||||
|             TERN_(E3_HAS_STEALTHCHOP, case 3: TMC_SET_STEALTH(E3); break;) |           TERN_(E5_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 5) TMC_SET_STEALTH(E5)); | ||||||
|             TERN_(E4_HAS_STEALTHCHOP, case 4: TMC_SET_STEALTH(E4); break;) |           TERN_(E6_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 6) TMC_SET_STEALTH(E6)); | ||||||
|             TERN_(E5_HAS_STEALTHCHOP, case 5: TMC_SET_STEALTH(E5); break;) |           TERN_(E7_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 7) TMC_SET_STEALTH(E7)); | ||||||
|             TERN_(E6_HAS_STEALTHCHOP, case 6: TMC_SET_STEALTH(E6); break;) |  | ||||||
|             TERN_(E7_HAS_STEALTHCHOP, case 7: TMC_SET_STEALTH(E7); break;) |  | ||||||
|           } |  | ||||||
|         } break; |         } break; | ||||||
|       #endif |       #endif | ||||||
|     } |     } | ||||||
| @ -133,7 +130,7 @@ static void say_stealth_status() { | |||||||
|  */ |  */ | ||||||
| void GcodeSuite::M569() { | void GcodeSuite::M569() { | ||||||
|   if (parser.seen('S')) |   if (parser.seen('S')) | ||||||
|     set_stealth_status(parser.value_bool(), get_target_e_stepper_from_command(0)); |     set_stealth_status(parser.value_bool(), get_target_e_stepper_from_command(-2)); | ||||||
|   else |   else | ||||||
|     say_stealth_status(); |     say_stealth_status(); | ||||||
| } | } | ||||||
|  | |||||||
| @ -28,6 +28,12 @@ | |||||||
| #include "../../../feature/tmc_util.h" | #include "../../../feature/tmc_util.h" | ||||||
| #include "../../../module/stepper/indirection.h" | #include "../../../module/stepper/indirection.h" | ||||||
| 
 | 
 | ||||||
|  | template<typename TMC> | ||||||
|  | static void tmc_print_current(TMC &st) { | ||||||
|  |   st.printLabel(); | ||||||
|  |   SERIAL_ECHOLNPGM(" driver current: ", st.getMilliamps()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * M906: Set motor current in milliamps. |  * M906: Set motor current in milliamps. | ||||||
|  * |  * | ||||||
| @ -48,8 +54,10 @@ void GcodeSuite::M906() { | |||||||
| 
 | 
 | ||||||
|   bool report = true; |   bool report = true; | ||||||
| 
 | 
 | ||||||
|   #if AXIS_IS_TMC(X) || AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) || AXIS_IS_TMC(I) || AXIS_IS_TMC(J) || AXIS_IS_TMC(K) |   #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) | ||||||
|     const uint8_t index = parser.byteval('I'); |     const int8_t index = parser.byteval('I', -1); | ||||||
|  |   #else | ||||||
|  |     constexpr int8_t index = -1; | ||||||
|   #endif |   #endif | ||||||
| 
 | 
 | ||||||
|   LOOP_LOGICAL_AXES(i) if (uint16_t value = parser.intval(axis_codes[i])) { |   LOOP_LOGICAL_AXES(i) if (uint16_t value = parser.intval(axis_codes[i])) { | ||||||
| @ -57,20 +65,20 @@ void GcodeSuite::M906() { | |||||||
|     switch (i) { |     switch (i) { | ||||||
|       case X_AXIS: |       case X_AXIS: | ||||||
|         #if AXIS_IS_TMC(X) |         #if AXIS_IS_TMC(X) | ||||||
|           if (index == 0) TMC_SET_CURRENT(X); |           if (index < 0 || index == 0) TMC_SET_CURRENT(X); | ||||||
|         #endif |         #endif | ||||||
|         #if AXIS_IS_TMC(X2) |         #if AXIS_IS_TMC(X2) | ||||||
|           if (index == 1) TMC_SET_CURRENT(X2); |           if (index < 0 || index == 1) TMC_SET_CURRENT(X2); | ||||||
|         #endif |         #endif | ||||||
|         break; |         break; | ||||||
| 
 | 
 | ||||||
|       #if HAS_Y_AXIS |       #if HAS_Y_AXIS | ||||||
|         case Y_AXIS: |         case Y_AXIS: | ||||||
|           #if AXIS_IS_TMC(Y) |           #if AXIS_IS_TMC(Y) | ||||||
|             if (index == 0) TMC_SET_CURRENT(Y); |             if (index < 0 || index == 0) TMC_SET_CURRENT(Y); | ||||||
|           #endif |           #endif | ||||||
|           #if AXIS_IS_TMC(Y2) |           #if AXIS_IS_TMC(Y2) | ||||||
|             if (index == 1) TMC_SET_CURRENT(Y2); |             if (index < 0 || index == 1) TMC_SET_CURRENT(Y2); | ||||||
|           #endif |           #endif | ||||||
|           break; |           break; | ||||||
|       #endif |       #endif | ||||||
| @ -78,16 +86,16 @@ void GcodeSuite::M906() { | |||||||
|       #if HAS_Z_AXIS |       #if HAS_Z_AXIS | ||||||
|         case Z_AXIS: |         case Z_AXIS: | ||||||
|           #if AXIS_IS_TMC(Z) |           #if AXIS_IS_TMC(Z) | ||||||
|             if (index == 0) TMC_SET_CURRENT(Z); |             if (index < 0 || index == 0) TMC_SET_CURRENT(Z); | ||||||
|           #endif |           #endif | ||||||
|           #if AXIS_IS_TMC(Z2) |           #if AXIS_IS_TMC(Z2) | ||||||
|             if (index == 1) TMC_SET_CURRENT(Z2); |             if (index < 0 || index == 1) TMC_SET_CURRENT(Z2); | ||||||
|           #endif |           #endif | ||||||
|           #if AXIS_IS_TMC(Z3) |           #if AXIS_IS_TMC(Z3) | ||||||
|             if (index == 2) TMC_SET_CURRENT(Z3); |             if (index < 0 || index == 2) TMC_SET_CURRENT(Z3); | ||||||
|           #endif |           #endif | ||||||
|           #if AXIS_IS_TMC(Z4) |           #if AXIS_IS_TMC(Z4) | ||||||
|             if (index == 3) TMC_SET_CURRENT(Z4); |             if (index < 0 || index == 3) TMC_SET_CURRENT(Z4); | ||||||
|           #endif |           #endif | ||||||
|           break; |           break; | ||||||
|       #endif |       #endif | ||||||
| @ -104,34 +112,31 @@ void GcodeSuite::M906() { | |||||||
| 
 | 
 | ||||||
|       #if E_STEPPERS |       #if E_STEPPERS | ||||||
|         case E_AXIS: { |         case E_AXIS: { | ||||||
|           const int8_t target_e_stepper = get_target_e_stepper_from_command(0); |           const int8_t eindex = get_target_e_stepper_from_command(-2); | ||||||
|           if (target_e_stepper < 0) return; |           #if AXIS_IS_TMC(E0) | ||||||
|           switch (target_e_stepper) { |             if (eindex < 0 || eindex == 0) TMC_SET_CURRENT(E0); | ||||||
|             #if AXIS_IS_TMC(E0) |           #endif | ||||||
|               case 0: TMC_SET_CURRENT(E0); break; |           #if AXIS_IS_TMC(E1) | ||||||
|             #endif |             if (eindex < 0 || eindex == 1) TMC_SET_CURRENT(E1); | ||||||
|             #if AXIS_IS_TMC(E1) |           #endif | ||||||
|               case 1: TMC_SET_CURRENT(E1); break; |           #if AXIS_IS_TMC(E2) | ||||||
|             #endif |             if (eindex < 0 || eindex == 2) TMC_SET_CURRENT(E2); | ||||||
|             #if AXIS_IS_TMC(E2) |           #endif | ||||||
|               case 2: TMC_SET_CURRENT(E2); break; |           #if AXIS_IS_TMC(E3) | ||||||
|             #endif |             if (eindex < 0 || eindex == 3) TMC_SET_CURRENT(E3); | ||||||
|             #if AXIS_IS_TMC(E3) |           #endif | ||||||
|               case 3: TMC_SET_CURRENT(E3); break; |           #if AXIS_IS_TMC(E4) | ||||||
|             #endif |             if (eindex < 0 || eindex == 4) TMC_SET_CURRENT(E4); | ||||||
|             #if AXIS_IS_TMC(E4) |           #endif | ||||||
|               case 4: TMC_SET_CURRENT(E4); break; |           #if AXIS_IS_TMC(E5) | ||||||
|             #endif |             if (eindex < 0 || eindex == 5) TMC_SET_CURRENT(E5); | ||||||
|             #if AXIS_IS_TMC(E5) |           #endif | ||||||
|               case 5: TMC_SET_CURRENT(E5); break; |           #if AXIS_IS_TMC(E6) | ||||||
|             #endif |             if (eindex < 0 || eindex == 6) TMC_SET_CURRENT(E6); | ||||||
|             #if AXIS_IS_TMC(E6) |           #endif | ||||||
|               case 6: TMC_SET_CURRENT(E6); break; |           #if AXIS_IS_TMC(E7) | ||||||
|             #endif |             if (eindex < 0 || eindex == 7) TMC_SET_CURRENT(E7); | ||||||
|             #if AXIS_IS_TMC(E7) |           #endif | ||||||
|               case 7: TMC_SET_CURRENT(E7); break; |  | ||||||
|             #endif |  | ||||||
|           } |  | ||||||
|         } break; |         } break; | ||||||
|       #endif |       #endif | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -62,6 +62,21 @@ | |||||||
|     #error "MONITOR_DRIVER_STATUS requires at least one TMC2130, 2160, 2208, 2209, 2660, 5130, or 5160." |     #error "MONITOR_DRIVER_STATUS requires at least one TMC2130, 2160, 2208, 2209, 2660, 5130, or 5160." | ||||||
|   #endif |   #endif | ||||||
| 
 | 
 | ||||||
|  |   template<typename TMC> | ||||||
|  |   static void tmc_report_otpw(TMC &st) { | ||||||
|  |     st.printLabel(); | ||||||
|  |     SERIAL_ECHOPGM(" temperature prewarn triggered: "); | ||||||
|  |     serialprint_truefalse(st.getOTPW()); | ||||||
|  |     SERIAL_EOL(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   template<typename TMC> | ||||||
|  |   static void tmc_clear_otpw(TMC &st) { | ||||||
|  |     st.clear_otpw(); | ||||||
|  |     st.printLabel(); | ||||||
|  |     SERIAL_ECHOLNPGM(" prewarn flag cleared"); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   /**
 |   /**
 | ||||||
|    * M911: Report TMC stepper driver overtemperature pre-warn flag |    * M911: Report TMC stepper driver overtemperature pre-warn flag | ||||||
|    *       This flag is held by the library, persisting until cleared by M912 |    *       This flag is held by the library, persisting until cleared by M912 | ||||||
| @ -223,11 +238,17 @@ | |||||||
| 
 | 
 | ||||||
| #endif // MONITOR_DRIVER_STATUS
 | #endif // MONITOR_DRIVER_STATUS
 | ||||||
| 
 | 
 | ||||||
| /**
 |  | ||||||
|  * M913: Set HYBRID_THRESHOLD speed. |  | ||||||
|  */ |  | ||||||
| #if ENABLED(HYBRID_THRESHOLD) | #if ENABLED(HYBRID_THRESHOLD) | ||||||
| 
 | 
 | ||||||
|  |   template<typename TMC> | ||||||
|  |   static void tmc_print_pwmthrs(TMC &st) { | ||||||
|  |     st.printLabel(); | ||||||
|  |     SERIAL_ECHOLNPGM(" stealthChop max speed: ", st.get_pwm_thrs()); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /**
 | ||||||
|  |    * M913: Set HYBRID_THRESHOLD speed. | ||||||
|  |    */ | ||||||
|   void GcodeSuite::M913() { |   void GcodeSuite::M913() { | ||||||
|     #define TMC_SAY_PWMTHRS(A,Q) tmc_print_pwmthrs(stepper##Q) |     #define TMC_SAY_PWMTHRS(A,Q) tmc_print_pwmthrs(stepper##Q) | ||||||
|     #define TMC_SET_PWMTHRS(A,Q) stepper##Q.set_pwm_thrs(value) |     #define TMC_SET_PWMTHRS(A,Q) stepper##Q.set_pwm_thrs(value) | ||||||
| @ -235,19 +256,21 @@ | |||||||
|     #define TMC_SET_PWMTHRS_E(E) stepperE##E.set_pwm_thrs(value) |     #define TMC_SET_PWMTHRS_E(E) stepperE##E.set_pwm_thrs(value) | ||||||
| 
 | 
 | ||||||
|     bool report = true; |     bool report = true; | ||||||
|     #if AXIS_IS_TMC(X) || AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) || AXIS_IS_TMC(I) || AXIS_IS_TMC(J) || AXIS_IS_TMC(K) |     #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) | ||||||
|       const uint8_t index = parser.byteval('I'); |       const int8_t index = parser.byteval('I', -1); | ||||||
|  |     #else | ||||||
|  |       constexpr int8_t index = -1; | ||||||
|     #endif |     #endif | ||||||
|     LOOP_LOGICAL_AXES(i) if (int32_t value = parser.longval(axis_codes[i])) { |     LOOP_LOGICAL_AXES(i) if (int32_t value = parser.longval(axis_codes[i])) { | ||||||
|       report = false; |       report = false; | ||||||
|       switch (i) { |       switch (i) { | ||||||
|         case X_AXIS: |         case X_AXIS: | ||||||
|           TERN_(X_HAS_STEALTHCHOP,  if (index < 2) TMC_SET_PWMTHRS(X,X)); |           TERN_(X_HAS_STEALTHCHOP,  if (index < 0 || index == 0) TMC_SET_PWMTHRS(X,X)); | ||||||
|           TERN_(X2_HAS_STEALTHCHOP, if (!(index & 1)) TMC_SET_PWMTHRS(X,X2)); |           TERN_(X2_HAS_STEALTHCHOP, if (index < 0 || index == 1) TMC_SET_PWMTHRS(X,X2)); | ||||||
|           break; |           break; | ||||||
|         case Y_AXIS: |         case Y_AXIS: | ||||||
|           TERN_(Y_HAS_STEALTHCHOP,  if (index < 2) TMC_SET_PWMTHRS(Y,Y)); |           TERN_(Y_HAS_STEALTHCHOP,  if (index < 0 || index == 0) TMC_SET_PWMTHRS(Y,Y)); | ||||||
|           TERN_(Y2_HAS_STEALTHCHOP, if (!(index & 1)) TMC_SET_PWMTHRS(Y,Y2)); |           TERN_(Y2_HAS_STEALTHCHOP, if (index < 0 || index == 1) TMC_SET_PWMTHRS(Y,Y2)); | ||||||
|           break; |           break; | ||||||
| 
 | 
 | ||||||
|         #if I_HAS_STEALTHCHOP |         #if I_HAS_STEALTHCHOP | ||||||
| @ -261,25 +284,22 @@ | |||||||
|         #endif |         #endif | ||||||
| 
 | 
 | ||||||
|         case Z_AXIS: |         case Z_AXIS: | ||||||
|           TERN_(Z_HAS_STEALTHCHOP, if (index < 2) TMC_SET_PWMTHRS(Z,Z)); |           TERN_(Z_HAS_STEALTHCHOP,  if (index < 0 || index == 0) TMC_SET_PWMTHRS(Z,Z)); | ||||||
|           TERN_(Z2_HAS_STEALTHCHOP, if (index == 0 || index == 2) TMC_SET_PWMTHRS(Z,Z2)); |           TERN_(Z2_HAS_STEALTHCHOP, if (index < 0 || index == 1) TMC_SET_PWMTHRS(Z,Z2)); | ||||||
|           TERN_(Z3_HAS_STEALTHCHOP, if (index == 0 || index == 3) TMC_SET_PWMTHRS(Z,Z3)); |           TERN_(Z3_HAS_STEALTHCHOP, if (index < 0 || index == 2) TMC_SET_PWMTHRS(Z,Z3)); | ||||||
|           TERN_(Z4_HAS_STEALTHCHOP, if (index == 0 || index == 4) TMC_SET_PWMTHRS(Z,Z4)); |           TERN_(Z4_HAS_STEALTHCHOP, if (index < 0 || index == 3) TMC_SET_PWMTHRS(Z,Z4)); | ||||||
|           break; |           break; | ||||||
|         #if E_STEPPERS |         #if E_STEPPERS | ||||||
|           case E_AXIS: { |           case E_AXIS: { | ||||||
|             const int8_t target_e_stepper = get_target_e_stepper_from_command(0); |             const int8_t eindex = get_target_e_stepper_from_command(-2); | ||||||
|             if (target_e_stepper < 0) return; |             TERN_(E0_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 0) TMC_SET_PWMTHRS_E(0)); | ||||||
|             switch (target_e_stepper) { |             TERN_(E1_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 1) TMC_SET_PWMTHRS_E(1)); | ||||||
|               TERN_(E0_HAS_STEALTHCHOP, case 0: TMC_SET_PWMTHRS_E(0); break;) |             TERN_(E2_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 2) TMC_SET_PWMTHRS_E(2)); | ||||||
|               TERN_(E1_HAS_STEALTHCHOP, case 1: TMC_SET_PWMTHRS_E(1); break;) |             TERN_(E3_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 3) TMC_SET_PWMTHRS_E(3)); | ||||||
|               TERN_(E2_HAS_STEALTHCHOP, case 2: TMC_SET_PWMTHRS_E(2); break;) |             TERN_(E4_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 4) TMC_SET_PWMTHRS_E(4)); | ||||||
|               TERN_(E3_HAS_STEALTHCHOP, case 3: TMC_SET_PWMTHRS_E(3); break;) |             TERN_(E5_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 5) TMC_SET_PWMTHRS_E(5)); | ||||||
|               TERN_(E4_HAS_STEALTHCHOP, case 4: TMC_SET_PWMTHRS_E(4); break;) |             TERN_(E6_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 6) TMC_SET_PWMTHRS_E(6)); | ||||||
|               TERN_(E5_HAS_STEALTHCHOP, case 5: TMC_SET_PWMTHRS_E(5); break;) |             TERN_(E7_HAS_STEALTHCHOP, if (eindex < 0 || eindex == 7) TMC_SET_PWMTHRS_E(7)); | ||||||
|               TERN_(E6_HAS_STEALTHCHOP, case 6: TMC_SET_PWMTHRS_E(6); break;) |  | ||||||
|               TERN_(E7_HAS_STEALTHCHOP, case 7: TMC_SET_PWMTHRS_E(7); break;) |  | ||||||
|             } |  | ||||||
|           } break; |           } break; | ||||||
|         #endif // E_STEPPERS
 |         #endif // E_STEPPERS
 | ||||||
|       } |       } | ||||||
| @ -407,11 +427,18 @@ | |||||||
| 
 | 
 | ||||||
| #endif // HYBRID_THRESHOLD
 | #endif // HYBRID_THRESHOLD
 | ||||||
| 
 | 
 | ||||||
| /**
 |  | ||||||
|  * M914: Set StallGuard sensitivity. |  | ||||||
|  */ |  | ||||||
| #if USE_SENSORLESS | #if USE_SENSORLESS | ||||||
| 
 | 
 | ||||||
|  |   template<typename TMC> | ||||||
|  |   static void tmc_print_sgt(TMC &st) { | ||||||
|  |     st.printLabel(); | ||||||
|  |     SERIAL_ECHOPGM(" homing sensitivity: "); | ||||||
|  |     SERIAL_PRINTLN(st.homing_threshold(), PrintBase::Dec); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /**
 | ||||||
|  |    * M914: Set StallGuard sensitivity. | ||||||
|  |    */ | ||||||
|   void GcodeSuite::M914() { |   void GcodeSuite::M914() { | ||||||
| 
 | 
 | ||||||
|     bool report = true; |     bool report = true; | ||||||
|  | |||||||
| @ -148,6 +148,7 @@ int8_t GcodeSuite::get_target_extruder_from_command() { | |||||||
| int8_t GcodeSuite::get_target_e_stepper_from_command(const int8_t dval/*=-1*/) { | int8_t GcodeSuite::get_target_e_stepper_from_command(const int8_t dval/*=-1*/) { | ||||||
|   const int8_t e = parser.intval('T', dval); |   const int8_t e = parser.intval('T', dval); | ||||||
|   if (WITHIN(e, 0, E_STEPPERS - 1)) return e; |   if (WITHIN(e, 0, E_STEPPERS - 1)) return e; | ||||||
|  |   if (dval == -2) return dval; | ||||||
| 
 | 
 | ||||||
|   SERIAL_ECHO_START(); |   SERIAL_ECHO_START(); | ||||||
|   SERIAL_CHAR('M'); SERIAL_ECHO(parser.codenum); |   SERIAL_CHAR('M'); SERIAL_ECHO(parser.codenum); | ||||||
| @ -159,7 +160,7 @@ int8_t GcodeSuite::get_target_e_stepper_from_command(const int8_t dval/*=-1*/) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Set XYZIJKE destination and feedrate from the current GCode command |  * Set XYZ...E destination and feedrate from the current GCode command | ||||||
|  * |  * | ||||||
|  *  - Set destination from included axis codes |  *  - Set destination from included axis codes | ||||||
|  *  - Set to current for missing axis codes |  *  - Set to current for missing axis codes | ||||||
|  | |||||||
| @ -284,7 +284,7 @@ | |||||||
|  * M871 - Print/reset/clear first layer temperature offset values. (Requires PTC_PROBE, PTC_BED, or PTC_HOTEND) |  * M871 - Print/reset/clear first layer temperature offset values. (Requires PTC_PROBE, PTC_BED, or PTC_HOTEND) | ||||||
|  * M876 - Handle Prompt Response. (Requires HOST_PROMPT_SUPPORT and not EMERGENCY_PARSER) |  * M876 - Handle Prompt Response. (Requires HOST_PROMPT_SUPPORT and not EMERGENCY_PARSER) | ||||||
|  * M900 - Get or Set Linear Advance K-factor. (Requires LIN_ADVANCE) |  * M900 - Get or Set Linear Advance K-factor. (Requires LIN_ADVANCE) | ||||||
|  * M906 - Set or get motor current in milliamps using axis codes X, Y, Z, E. Report values if no axis codes given. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660 or L6470) |  * M906 - Set or get motor current in milliamps using axis codes XYZE, etc. Report values if no axis codes given. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660 or L6470) | ||||||
|  * M907 - Set digital trimpot motor current using axis codes. (Requires a board with digital trimpots) |  * M907 - Set digital trimpot motor current using axis codes. (Requires a board with digital trimpots) | ||||||
|  * M908 - Control digital trimpot directly. (Requires HAS_MOTOR_CURRENT_DAC or DIGIPOTSS_PIN) |  * M908 - Control digital trimpot directly. (Requires HAS_MOTOR_CURRENT_DAC or DIGIPOTSS_PIN) | ||||||
|  * M909 - Print digipot/DAC current value. (Requires HAS_MOTOR_CURRENT_DAC) |  * M909 - Print digipot/DAC current value. (Requires HAS_MOTOR_CURRENT_DAC) | ||||||
|  | |||||||
| @ -74,12 +74,6 @@ | |||||||
|   #define TMC_CLASS_E(N) TMC_CLASS(E##N, E) |   #define TMC_CLASS_E(N) TMC_CLASS(E##N, E) | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| typedef struct { |  | ||||||
|   uint8_t toff; |  | ||||||
|   int8_t hend; |  | ||||||
|   uint8_t hstrt; |  | ||||||
| } chopper_timing_t; |  | ||||||
| 
 |  | ||||||
| #ifndef CHOPPER_TIMING_X | #ifndef CHOPPER_TIMING_X | ||||||
|   #define CHOPPER_TIMING_X CHOPPER_TIMING |   #define CHOPPER_TIMING_X CHOPPER_TIMING | ||||||
| #endif | #endif | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user