|
@@ -40,8 +40,10 @@
|
40
|
40
|
|
41
|
41
|
/**
|
42
|
42
|
* M907: Set digital trimpot motor current using axis codes X [Y] [Z] [I] [J] [K] [U] [V] [W] [E]
|
43
|
|
- * B<current> - Special case for 4th (E) axis
|
44
|
|
- * S<current> - Special case to set first 3 axes
|
|
43
|
+ * B<current> - Special case for E1 (Requires DIGIPOTSS_PIN or DIGIPOT_MCP4018 or DIGIPOT_MCP4451)
|
|
44
|
+ * C<current> - Special case for E2 (Requires DIGIPOTSS_PIN or DIGIPOT_MCP4018 or DIGIPOT_MCP4451)
|
|
45
|
+ * S<current> - Set current in mA for all axes (Requires DIGIPOTSS_PIN or DIGIPOT_MCP4018 or DIGIPOT_MCP4451), or
|
|
46
|
+ * Set percentage of max current for all axes (Requires HAS_DIGIPOT_DAC)
|
45
|
47
|
*/
|
46
|
48
|
void GcodeSuite::M907() {
|
47
|
49
|
#if HAS_MOTOR_CURRENT_SPI
|
|
@@ -49,47 +51,65 @@ void GcodeSuite::M907() {
|
49
|
51
|
if (!parser.seen("BS" LOGICAL_AXES_STRING))
|
50
|
52
|
return M907_report();
|
51
|
53
|
|
52
|
|
- LOOP_LOGICAL_AXES(i) if (parser.seenval(IAXIS_CHAR(i))) stepper.set_digipot_current(i, parser.value_int());
|
53
|
|
- if (parser.seenval('B')) stepper.set_digipot_current(4, parser.value_int());
|
54
|
|
- if (parser.seenval('S')) LOOP_LE_N(i, 4) stepper.set_digipot_current(i, parser.value_int());
|
|
54
|
+ if (parser.seenval('S')) LOOP_L_N(i, MOTOR_CURRENT_COUNT) stepper.set_digipot_current(i, parser.value_int());
|
|
55
|
+ LOOP_LOGICAL_AXES(i) if (parser.seenval(IAXIS_CHAR(i))) stepper.set_digipot_current(i, parser.value_int()); // X Y Z (I J K U V W) E (map to drivers according to DIGIPOT_CHANNELS. Default with NUM_AXES 3: map X Y Z E to X Y Z E0)
|
|
56
|
+ // Additional extruders use B,C.
|
|
57
|
+ // TODO: Change these parameters because 'E' is used and D should be reserved for debugging. B<index>?
|
|
58
|
+ #if E_STEPPERS >= 2
|
|
59
|
+ if (parser.seenval('B')) stepper.set_digipot_current(E_AXIS + 1, parser.value_int());
|
|
60
|
+ #if E_STEPPERS >= 3
|
|
61
|
+ if (parser.seenval('C')) stepper.set_digipot_current(E_AXIS + 2, parser.value_int());
|
|
62
|
+ #endif
|
|
63
|
+ #endif
|
55
|
64
|
|
56
|
65
|
#elif HAS_MOTOR_CURRENT_PWM
|
57
|
66
|
|
58
|
|
- if (!parser.seen(
|
59
|
|
- #if ANY_PIN(MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_I, MOTOR_CURRENT_PWM_J, MOTOR_CURRENT_PWM_K, MOTOR_CURRENT_PWM_U, MOTOR_CURRENT_PWM_V, MOTOR_CURRENT_PWM_W)
|
60
|
|
- "XY" SECONDARY_AXIS_GANG("I", "J", "K", "U", "V", "W")
|
|
67
|
+ #if ANY_PIN(MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_I, MOTOR_CURRENT_PWM_J, MOTOR_CURRENT_PWM_K, MOTOR_CURRENT_PWM_U, MOTOR_CURRENT_PWM_V, MOTOR_CURRENT_PWM_W)
|
|
68
|
+ #define HAS_X_Y_XY_I_J_K_U_V_W 1
|
|
69
|
+ #endif
|
|
70
|
+
|
|
71
|
+ #if HAS_X_Y_XY_I_J_K_U_V_W || ANY_PIN(MOTOR_CURRENT_PWM_E, MOTOR_CURRENT_PWM_Z)
|
|
72
|
+
|
|
73
|
+ if (!parser.seen("S"
|
|
74
|
+ #if HAS_X_Y_XY_I_J_K_U_V_W
|
|
75
|
+ "XY" SECONDARY_AXIS_GANG("I", "J", "K", "U", "V", "W")
|
|
76
|
+ #endif
|
|
77
|
+ #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z)
|
|
78
|
+ "Z"
|
|
79
|
+ #endif
|
|
80
|
+ #if PIN_EXISTS(MOTOR_CURRENT_PWM_E)
|
|
81
|
+ "E"
|
|
82
|
+ #endif
|
|
83
|
+ )) return M907_report();
|
|
84
|
+
|
|
85
|
+ if (parser.seenval('S')) LOOP_L_N(a, MOTOR_CURRENT_COUNT) stepper.set_digipot_current(a, parser.value_int());
|
|
86
|
+
|
|
87
|
+ #if HAS_X_Y_XY_I_J_K_U_V_W
|
|
88
|
+ if (NUM_AXIS_GANG(
|
|
89
|
+ parser.seenval('X'), || parser.seenval('Y'), || false,
|
|
90
|
+ || parser.seenval('I'), || parser.seenval('J'), || parser.seenval('K'),
|
|
91
|
+ || parser.seenval('U'), || parser.seenval('V'), || parser.seenval('W')
|
|
92
|
+ )) stepper.set_digipot_current(0, parser.value_int());
|
61
|
93
|
#endif
|
62
|
94
|
#if PIN_EXISTS(MOTOR_CURRENT_PWM_Z)
|
63
|
|
- "Z"
|
|
95
|
+ if (parser.seenval('Z')) stepper.set_digipot_current(1, parser.value_int());
|
64
|
96
|
#endif
|
65
|
97
|
#if PIN_EXISTS(MOTOR_CURRENT_PWM_E)
|
66
|
|
- "E"
|
|
98
|
+ if (parser.seenval('E')) stepper.set_digipot_current(2, parser.value_int());
|
67
|
99
|
#endif
|
68
|
|
- )) return M907_report();
|
69
|
100
|
|
70
|
|
- #if ANY_PIN(MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_I, MOTOR_CURRENT_PWM_J, MOTOR_CURRENT_PWM_K, MOTOR_CURRENT_PWM_U, MOTOR_CURRENT_PWM_V, MOTOR_CURRENT_PWM_W)
|
71
|
|
- if (NUM_AXIS_GANG(
|
72
|
|
- parser.seenval('X'), || parser.seenval('Y'), || false,
|
73
|
|
- || parser.seenval('I'), || parser.seenval('J'), || parser.seenval('K'),
|
74
|
|
- || parser.seenval('U'), || parser.seenval('V'), || parser.seenval('W')
|
75
|
|
- )) stepper.set_digipot_current(0, parser.value_int());
|
76
|
|
- #endif
|
77
|
|
- #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z)
|
78
|
|
- if (parser.seenval('Z')) stepper.set_digipot_current(1, parser.value_int());
|
79
|
|
- #endif
|
80
|
|
- #if PIN_EXISTS(MOTOR_CURRENT_PWM_E)
|
81
|
|
- if (parser.seenval('E')) stepper.set_digipot_current(2, parser.value_int());
|
82
|
101
|
#endif
|
83
|
102
|
|
84
|
103
|
#endif // HAS_MOTOR_CURRENT_PWM
|
85
|
104
|
|
86
|
105
|
#if HAS_MOTOR_CURRENT_I2C
|
87
|
106
|
// this one uses actual amps in floating point
|
88
|
|
- LOOP_LOGICAL_AXES(i) if (parser.seenval(IAXIS_CHAR(i))) digipot_i2c.set_current(i, parser.value_float());
|
89
|
|
- // Additional extruders use B,C,D for channels 4,5,6.
|
90
|
|
- // TODO: Change these parameters because 'E' is used. B<index>?
|
91
|
|
- #if HAS_EXTRUDERS
|
92
|
|
- for (uint8_t i = E_AXIS + 1; i < DIGIPOT_I2C_NUM_CHANNELS; i++)
|
|
107
|
+ if (parser.seenval('S')) LOOP_L_N(q, DIGIPOT_I2C_NUM_CHANNELS) digipot_i2c.set_current(q, parser.value_float());
|
|
108
|
+ LOOP_LOGICAL_AXES(i) if (parser.seenval(IAXIS_CHAR(i))) digipot_i2c.set_current(i, parser.value_float()); // X Y Z (I J K U V W) E (map to drivers according to pots adresses. Default with NUM_AXES 3 X Y Z E: map to X Y Z E0)
|
|
109
|
+ // Additional extruders use B,C,D.
|
|
110
|
+ // TODO: Change these parameters because 'E' is used and because 'D' should be reserved for debugging. B<index>?
|
|
111
|
+ #if E_STEPPERS >= 2
|
|
112
|
+ for (uint8_t i = E_AXIS + 1; i < _MAX(DIGIPOT_I2C_NUM_CHANNELS, (NUM_AXES + 3)); i++)
|
93
|
113
|
if (parser.seenval('B' + i - (E_AXIS + 1))) digipot_i2c.set_current(i, parser.value_float());
|
94
|
114
|
#endif
|
95
|
115
|
#endif
|
|
@@ -97,9 +117,9 @@ void GcodeSuite::M907() {
|
97
|
117
|
#if HAS_MOTOR_CURRENT_DAC
|
98
|
118
|
if (parser.seenval('S')) {
|
99
|
119
|
const float dac_percent = parser.value_float();
|
100
|
|
- LOOP_LE_N(i, 4) stepper_dac.set_current_percent(i, dac_percent);
|
|
120
|
+ LOOP_LOGICAL_AXES(i) stepper_dac.set_current_percent(i, dac_percent);
|
101
|
121
|
}
|
102
|
|
- LOOP_LOGICAL_AXES(i) if (parser.seenval(IAXIS_CHAR(i))) stepper_dac.set_current_percent(i, parser.value_float());
|
|
122
|
+ LOOP_LOGICAL_AXES(i) if (parser.seenval(IAXIS_CHAR(i))) stepper_dac.set_current_percent(i, parser.value_float()); // X Y Z (I J K U V W) E (map to drivers according to DAC_STEPPER_ORDER. Default with NUM_AXES 3: X Y Z E map to X Y Z E0)
|
103
|
123
|
#endif
|
104
|
124
|
}
|
105
|
125
|
|
|
@@ -119,8 +139,14 @@ void GcodeSuite::M907() {
|
119
|
139
|
SERIAL_CHAR(' ', IAXIS_CHAR(q));
|
120
|
140
|
SERIAL_ECHO(stepper.motor_current_setting[q]);
|
121
|
141
|
}
|
122
|
|
- SERIAL_CHAR(' ', 'B'); // B (maps to E1 by default)
|
123
|
|
- SERIAL_ECHOLN(stepper.motor_current_setting[4]);
|
|
142
|
+ #if E_STEPPERS >= 2
|
|
143
|
+ SERIAL_ECHOPGM_P(PSTR(" B"), stepper.motor_current_setting[E_AXIS + 1] // B (maps to E1 with NUM_AXES 3 according to DIGIPOT_CHANNELS)
|
|
144
|
+ #if E_STEPPERS >= 3
|
|
145
|
+ , PSTR(" C"), stepper.motor_current_setting[E_AXIS + 2] // C (mapping to E2 must be defined by DIGIPOT_CHANNELS)
|
|
146
|
+ #endif
|
|
147
|
+ );
|
|
148
|
+ #endif
|
|
149
|
+ SERIAL_EOL();
|
124
|
150
|
#endif
|
125
|
151
|
}
|
126
|
152
|
|