39
39
#endif
40
40
41
41
SpindleLaser cutter;
42
- uint8_t SpindleLaser::power,
42
+ bool SpindleLaser::enable_state; // Virtual enable state, controls enable pin if present and or apply power if > 0
43
+ uint8_t SpindleLaser::power, // Actual power output 0-255 ocr or "0 = off" > 0 = "on"
43
44
SpindleLaser::last_power_applied; // = 0 // Basic power state tracking
45
+
44
46
#if ENABLED(LASER_FEATURE)
45
- cutter_test_pulse_t SpindleLaser::testPulse = 50 ; // Test fire Pulse time ms value.
47
+ cutter_test_pulse_t SpindleLaser::testPulse = 50 ; // (ms) Test fire pulse default duration
48
+ uint8_t SpindleLaser::last_block_power; // = 0 // Track power changes for dynamic inline power
49
+ feedRate_t SpindleLaser::feedrate_mm_m = 1500 ,
50
+ SpindleLaser::last_feedrate_mm_m; // = 0 // (mm/min) Track feedrate changes for dynamic power
46
51
#endif
47
- bool SpindleLaser::isReady; // Ready to apply power setting from the UI to OCR
48
- cutter_power_t SpindleLaser::menuPower, // Power set via LCD menu in PWM, PERCENT, or RPM
49
- SpindleLaser::unitPower; // LCD status power in PWM, PERCENT, or RPM
50
52
51
- #if ENABLED(MARLIN_DEV_MODE)
52
- cutter_frequency_t SpindleLaser::frequency; // PWM frequency setting; range: 2K - 50K
53
- #endif
53
+ bool SpindleLaser::isReadyForUI = false ; // Ready to apply power setting from the UI to OCR
54
+ CutterMode SpindleLaser::cutter_mode = CUTTER_MODE_STANDARD; // Default is standard mode
55
+
56
+ constexpr cutter_cpower_t SpindleLaser::power_floor;
57
+ cutter_power_t SpindleLaser::menuPower = 0 , // Power value via LCD menu in PWM, PERCENT, or RPM based on configured format set by CUTTER_POWER_UNIT.
58
+ SpindleLaser::unitPower = 0 ; // Unit power is in PWM, PERCENT, or RPM based on CUTTER_POWER_UNIT.
59
+
60
+ cutter_frequency_t SpindleLaser::frequency; // PWM frequency setting; range: 2K - 50K
61
+
54
62
#define SPINDLE_LASER_PWM_OFF TERN (SPINDLE_LASER_PWM_INVERT, 255 , 0 )
55
63
56
64
/* *
@@ -65,14 +73,14 @@ void SpindleLaser::init() {
65
73
#if ENABLED(SPINDLE_CHANGE_DIR)
66
74
OUT_WRITE (SPINDLE_DIR_PIN, SPINDLE_INVERT_DIR); // Init rotation to clockwise (M3)
67
75
#endif
76
+ #if ENABLED(HAL_CAN_SET_PWM_FREQ) && SPINDLE_LASER_FREQUENCY
77
+ frequency = SPINDLE_LASER_FREQUENCY;
78
+ hal.set_pwm_frequency (pin_t (SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_FREQUENCY);
79
+ #endif
68
80
#if ENABLED(SPINDLE_LASER_USE_PWM)
69
81
SET_PWM (SPINDLE_LASER_PWM_PIN);
70
82
hal.set_pwm_duty (pin_t (SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_PWM_OFF); // Set to lowest speed
71
83
#endif
72
- #if ENABLED(HAL_CAN_SET_PWM_FREQ) && SPINDLE_LASER_FREQUENCY
73
- hal.set_pwm_frequency (pin_t (SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_FREQUENCY);
74
- TERN_ (MARLIN_DEV_MODE, frequency = SPINDLE_LASER_FREQUENCY);
75
- #endif
76
84
#if ENABLED(AIR_EVACUATION)
77
85
OUT_WRITE (AIR_EVACUATION_PIN, !AIR_EVACUATION_ACTIVE); // Init Vacuum/Blower OFF
78
86
#endif
@@ -90,7 +98,7 @@ void SpindleLaser::init() {
90
98
*/
91
99
void SpindleLaser::_set_ocr (const uint8_t ocr) {
92
100
#if ENABLED(HAL_CAN_SET_PWM_FREQ) && SPINDLE_LASER_FREQUENCY
93
- hal.set_pwm_frequency (pin_t (SPINDLE_LASER_PWM_PIN), TERN (MARLIN_DEV_MODE, frequency, SPINDLE_LASER_FREQUENCY) );
101
+ hal.set_pwm_frequency (pin_t (SPINDLE_LASER_PWM_PIN), frequency);
94
102
#endif
95
103
hal.set_pwm_duty (pin_t (SPINDLE_LASER_PWM_PIN), ocr ^ SPINDLE_LASER_PWM_OFF);
96
104
}
@@ -107,35 +115,41 @@ void SpindleLaser::init() {
107
115
#endif // SPINDLE_LASER_USE_PWM
108
116
109
117
/* *
110
- * Apply power for laser/spindle
118
+ * Apply power for Laser or Spindle
111
119
*
112
120
* Apply cutter power value for PWM, Servo, and on/off pin.
113
121
*
114
- * @param opwr Power value. Range 0 to MAX. When 0 disable spindle/laser.
122
+ * @param opwr Power value. Range 0 to MAX.
115
123
*/
116
124
void SpindleLaser::apply_power (const uint8_t opwr) {
117
- if (opwr == last_power_applied) return ;
118
- last_power_applied = opwr;
119
- power = opwr;
120
- #if ENABLED(SPINDLE_LASER_USE_PWM)
121
- if (cutter.unitPower == 0 && CUTTER_UNIT_IS (RPM)) {
122
- ocr_off ();
123
- isReady = false ;
124
- }
125
- else if (ENABLED (CUTTER_POWER_RELATIVE) || enabled ()) {
126
- set_ocr (power);
127
- isReady = true ;
128
- }
129
- else {
130
- ocr_off ();
131
- isReady = false ;
132
- }
133
- #elif ENABLED(SPINDLE_SERVO)
134
- servo[SPINDLE_SERVO_NR].move (power);
135
- #else
136
- WRITE (SPINDLE_LASER_ENA_PIN, enabled () ? SPINDLE_LASER_ACTIVE_STATE : !SPINDLE_LASER_ACTIVE_STATE);
137
- isReady = true ;
138
- #endif
125
+ if (enabled () || opwr == 0 ) { // 0 check allows us to disable where no ENA pin exists
126
+ // Test and set the last power used to improve performance
127
+ if (opwr == last_power_applied) return ;
128
+ last_power_applied = opwr;
129
+ // Handle PWM driven or just simple on/off
130
+ #if ENABLED(SPINDLE_LASER_USE_PWM)
131
+ if (CUTTER_UNIT_IS (RPM) && unitPower == 0 )
132
+ ocr_off ();
133
+ else if (ENABLED (CUTTER_POWER_RELATIVE) || enabled () || opwr == 0 ) {
134
+ set_ocr (opwr);
135
+ isReadyForUI = true ;
136
+ }
137
+ else
138
+ ocr_off ();
139
+ #elif ENABLED(SPINDLE_SERVO)
140
+ MOVE_SERVO (SPINDLE_SERVO_NR, power);
141
+ #else
142
+ WRITE (SPINDLE_LASER_ENA_PIN, enabled () ? SPINDLE_LASER_ACTIVE_STATE : !SPINDLE_LASER_ACTIVE_STATE);
143
+ isReadyForUI = true ;
144
+ #endif
145
+ }
146
+ else {
147
+ #if PIN_EXISTS(SPINDLE_LASER_ENA)
148
+ WRITE (SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_STATE);
149
+ #endif
150
+ isReadyForUI = false ; // Only used for UI display updates.
151
+ TERN_ (SPINDLE_LASER_USE_PWM, ocr_off ());
152
+ }
139
153
}
140
154
141
155
#if ENABLED(SPINDLE_CHANGE_DIR)
0 commit comments