1
0
mirror of https://github.com/bdring/Grbl_Esp32.git synced 2025-08-29 17:19:50 +02:00

Laser mode (#692)

* Update Machine.h

* spindles now say if in laser mode

* name fix

* Updates

* Getting rid of crosstalk

* Update PWMSpindle.cpp

* Reset some values at spindle init()

* Update SettingsDefinitions.cpp

* Update Grbl.h

* Return to test_drive.h
This commit is contained in:
bdring
2020-12-04 19:23:18 -06:00
committed by GitHub
parent abfb33e2d3
commit 5f57cf7543
14 changed files with 53 additions and 36 deletions

View File

@@ -473,7 +473,7 @@ Error gc_execute_line(char* line, uint8_t client) {
gc_block.modal.spindle = SpindleState::Cw; gc_block.modal.spindle = SpindleState::Cw;
break; break;
case 4: // Supported if SPINDLE_DIR_PIN is defined or laser mode is on. case 4: // Supported if SPINDLE_DIR_PIN is defined or laser mode is on.
if (spindle->is_reversable || laser_mode->get()) { if (spindle->is_reversable || spindle->inLaserMode()) {
gc_block.modal.spindle = SpindleState::Ccw; gc_block.modal.spindle = SpindleState::Ccw;
} else { } else {
FAIL(Error::GcodeUnsupportedCommand); FAIL(Error::GcodeUnsupportedCommand);
@@ -1290,7 +1290,7 @@ Error gc_execute_line(char* line, uint8_t client) {
return status; return status;
} }
// If in laser mode, setup laser power based on current and past parser conditions. // If in laser mode, setup laser power based on current and past parser conditions.
if (laser_mode->get()) { if (spindle->inLaserMode()) {
if (!((gc_block.modal.motion == Motion::Linear) || (gc_block.modal.motion == Motion::CwArc) || if (!((gc_block.modal.motion == Motion::Linear) || (gc_block.modal.motion == Motion::CwArc) ||
(gc_block.modal.motion == Motion::CcwArc))) { (gc_block.modal.motion == Motion::CcwArc))) {
gc_parser_flags |= GCParserLaserDisable; gc_parser_flags |= GCParserLaserDisable;

View File

@@ -23,7 +23,7 @@
// Grbl versioning system // Grbl versioning system
const char* const GRBL_VERSION = "1.3a"; const char* const GRBL_VERSION = "1.3a";
const char* const GRBL_VERSION_BUILD = "20201128"; const char* const GRBL_VERSION_BUILD = "20201204";
//#include <sdkconfig.h> //#include <sdkconfig.h>
#include <Arduino.h> #include <Arduino.h>

View File

@@ -354,10 +354,6 @@ namespace Motors {
xLastWakeTime = xTaskGetTickCount(); // Initialise the xLastWakeTime variable with the current time. xLastWakeTime = xTaskGetTickCount(); // Initialise the xLastWakeTime variable with the current time.
while (true) { // don't ever return from this or the task dies while (true) { // don't ever return from this or the task dies
if (motorSettingChanged) {
motors_read_settings();
motorSettingChanged = false;
}
if (stallguard_debug_mask->get() != 0) { if (stallguard_debug_mask->get() != 0) {
if (sys.state == State::Cycle || sys.state == State::Homing || sys.state == State::Jog) { if (sys.state == State::Cycle || sys.state == State::Homing || sys.state == State::Jog) {
for (TrinamicDriver* p = List; p; p = p->link) { for (TrinamicDriver* p = List; p; p = p->link) {

View File

@@ -96,7 +96,7 @@ bool can_park() {
#ifdef ENABLE_PARKING_OVERRIDE_CONTROL #ifdef ENABLE_PARKING_OVERRIDE_CONTROL
sys.override_ctrl == Override::ParkingMotion && sys.override_ctrl == Override::ParkingMotion &&
#endif #endif
homing_enable->get() && !laser_mode->get(); homing_enable->get() && !spindle->inLaserMode();
} }
/* /*
@@ -558,7 +558,7 @@ static void protocol_exec_rt_suspend() {
restore_spindle_speed = block->spindle_speed; restore_spindle_speed = block->spindle_speed;
} }
#ifdef DISABLE_LASER_DURING_HOLD #ifdef DISABLE_LASER_DURING_HOLD
if (laser_mode->get()) { if (spindle->inLaserMode()) {
sys_rt_exec_accessory_override.bit.spindleOvrStop = true; sys_rt_exec_accessory_override.bit.spindleOvrStop = true;
} }
#endif #endif
@@ -661,7 +661,7 @@ static void protocol_exec_rt_suspend() {
if (gc_state.modal.spindle != SpindleState::Disable) { if (gc_state.modal.spindle != SpindleState::Disable) {
// Block if safety door re-opened during prior restore actions. // Block if safety door re-opened during prior restore actions.
if (!sys.suspend.bit.restartRetract) { if (!sys.suspend.bit.restartRetract) {
if (laser_mode->get()) { if (spindle->inLaserMode()) {
// When in laser mode, ignore spindle spin-up delay. Set to turn on laser when cycle starts. // When in laser mode, ignore spindle spin-up delay. Set to turn on laser when cycle starts.
sys.step_control.updateSpindleRpm = true; sys.step_control.updateSpindleRpm = true;
} else { } else {
@@ -717,7 +717,7 @@ static void protocol_exec_rt_suspend() {
} else if (sys.spindle_stop_ovr.bit.restore || sys.spindle_stop_ovr.bit.restoreCycle) { } else if (sys.spindle_stop_ovr.bit.restore || sys.spindle_stop_ovr.bit.restoreCycle) {
if (gc_state.modal.spindle != SpindleState::Disable) { if (gc_state.modal.spindle != SpindleState::Disable) {
report_feedback_message(Message::SpindleRestore); report_feedback_message(Message::SpindleRestore);
if (laser_mode->get()) { if (spindle->inLaserMode()) {
// When in laser mode, ignore spindle spin-up delay. Set to turn on laser when cycle starts. // When in laser mode, ignore spindle spin-up delay. Set to turn on laser when cycle starts.
sys.step_control.updateSpindleRpm = true; sys.step_control.updateSpindleRpm = true;
} else { } else {

View File

@@ -1,7 +1,5 @@
#include "Grbl.h" #include "Grbl.h"
bool motorSettingChanged = false;
FlagSetting* verbose_errors; FlagSetting* verbose_errors;
FakeSetting<int>* number_axis; FakeSetting<int>* number_axis;
@@ -177,22 +175,27 @@ static bool checkStartupLine(char* value) {
} }
static bool postTMC(char* value) { static bool postTMC(char* value) {
if (!value) { // No POST functionality if (!value) {
motorSettingChanged = true; motors_read_settings();
} }
return true; return true;
} }
static bool checkSpindleChange(char* val) { static bool checkSpindleChange(char* val) {
if (!val) { if (!val) {
spindle->deinit(); // if not in disable (M5) ...
Spindles::Spindle::select(); if (gc_state.modal.spindle != SpindleState::Disable) {
gc_state.modal.spindle = SpindleState::Disable;
if (spindle->use_delays && spindle_delay_spindown->get() != 0) { // old spindle
vTaskDelay(spindle_delay_spindown->get() * 1000);
}
grbl_msg_sendf(CLIENT_ALL, MsgLevel::Info, "Spindle turned off with setting change");
}
gc_state.spindle_speed = 0; // Set S value to 0
spindle->deinit(); // old spindle
Spindles::Spindle::select(); // get new spindle
return true; return true;
} }
if (gc_state.modal.spindle != SpindleState::Disable) {
grbl_msg_sendf(CLIENT_ALL, MsgLevel::Info, "Spindle must be off to make this change");
return false;
}
return true; return true;
} }

View File

@@ -1,7 +1,5 @@
#pragma once #pragma once
extern bool motorSettingChanged;
extern FlagSetting* verbose_errors; extern FlagSetting* verbose_errors;
extern FakeSetting<int>* number_axis; extern FakeSetting<int>* number_axis;

View File

@@ -170,20 +170,25 @@ namespace Spindles {
void _10v::deinit() { void _10v::deinit() {
#ifdef SPINDLE_OUTPUT_PIN #ifdef SPINDLE_OUTPUT_PIN
gpio_reset_pin(SPINDLE_OUTPUT_PIN);
pinMode(SPINDLE_OUTPUT_PIN, INPUT); pinMode(SPINDLE_OUTPUT_PIN, INPUT);
#endif #endif
#ifdef SPINDLE_ENABLE_PIN #ifdef SPINDLE_ENABLE_PIN
gpio_reset_pin(SPINDLE_ENABLE_PIN);
pinMode(SPINDLE_ENABLE_PIN, INPUT); pinMode(SPINDLE_ENABLE_PIN, INPUT);
#endif #endif
#ifdef SPINDLE_DIR_PIN #ifdef SPINDLE_DIR_PIN
gpio_reset_pin(SPINDLE_DIR_PIN);
pinMode(SPINDLE_DIR_PIN, INPUT); pinMode(SPINDLE_DIR_PIN, INPUT);
#endif #endif
#ifdef SPINDLE_FORWARD_PIN #ifdef SPINDLE_FORWARD_PIN
gpio_reset_pin(SPINDLE_FORWARD_PIN);
pinMode(SPINDLE_FORWARD_PIN, INPUT); pinMode(SPINDLE_FORWARD_PIN, INPUT);
#endif #endif
#ifdef SPINDLE_REVERSE_PIN #ifdef SPINDLE_REVERSE_PIN
gpio_reset_pin(SPINDLE_FORWARD_PIN);
pinMode(SPINDLE_FORWARD_PIN, INPUT); pinMode(SPINDLE_FORWARD_PIN, INPUT);
#endif #endif
} }

View File

@@ -24,8 +24,8 @@
// ===================================== Laser ============================================== // ===================================== Laser ==============================================
namespace Spindles { namespace Spindles {
bool Laser::isRateAdjusted() { bool Laser::inLaserMode() {
return true; // can use M4 (CCW) laser mode. return laser_mode->get(); // can use M4 (CCW) laser mode.
} }
void Laser::config_message() { void Laser::config_message() {
@@ -89,10 +89,12 @@ namespace Spindles {
void Laser::deinit() { void Laser::deinit() {
stop(); stop();
#ifdef LASER_OUTPUT_PIN #ifdef LASER_OUTPUT_PIN
gpio_reset_pin(LASER_OUTPUT_PIN);
pinMode(LASER_OUTPUT_PIN, INPUT); pinMode(LASER_OUTPUT_PIN, INPUT);
#endif #endif
#ifdef LASER_ENABLE_PIN #ifdef LASER_ENABLE_PIN
gpio_reset_pin(LASER_ENABLE_PIN);
pinMode(LASER_ENABLE_PIN, INPUT); pinMode(LASER_ENABLE_PIN, INPUT);
#endif #endif
} }

View File

@@ -34,7 +34,7 @@ namespace Spindles {
Laser& operator=(const Laser&) = delete; Laser& operator=(const Laser&) = delete;
Laser& operator=(Laser&&) = delete; Laser& operator=(Laser&&) = delete;
bool isRateAdjusted() override; bool inLaserMode() override;
void config_message() override; void config_message() override;
void get_pins_and_settings() override; void get_pins_and_settings() override;
void deinit() override; void deinit() override;

View File

@@ -42,14 +42,15 @@ namespace Spindles {
return; return;
} }
_current_state = SpindleState::Disable;
_current_pwm_duty = 0;
use_delays = true;
ledcSetup(_pwm_chan_num, (double)_pwm_freq, _pwm_precision); // setup the channel ledcSetup(_pwm_chan_num, (double)_pwm_freq, _pwm_precision); // setup the channel
ledcAttachPin(_output_pin, _pwm_chan_num); // attach the PWM to the pin ledcAttachPin(_output_pin, _pwm_chan_num); // attach the PWM to the pin
pinMode(_enable_pin, OUTPUT); pinMode(_enable_pin, OUTPUT);
pinMode(_direction_pin, OUTPUT); pinMode(_direction_pin, OUTPUT);
use_delays = true;
config_message(); config_message();
} }
@@ -146,7 +147,7 @@ namespace Spindles {
} }
} }
set_enable_pin(_current_state != SpindleState::Disable); set_enable_pin(gc_state.modal.spindle != SpindleState::Disable);
set_output(pwm_value); set_output(pwm_value);
return 0; return 0;
@@ -225,6 +226,14 @@ namespace Spindles {
} }
void PWM::set_enable_pin(bool enable) { void PWM::set_enable_pin(bool enable) {
// static bool prev_enable = false;
// if (prev_enable == enable) {
// return;
// }
// prev_enable = enable;
if (_enable_pin == UNDEFINED_PIN) { if (_enable_pin == UNDEFINED_PIN) {
return; return;
} }
@@ -262,13 +271,16 @@ namespace Spindles {
void PWM::deinit() { void PWM::deinit() {
stop(); stop();
#ifdef SPINDLE_OUTPUT_PIN #ifdef SPINDLE_OUTPUT_PIN
gpio_reset_pin(SPINDLE_OUTPUT_PIN);
pinMode(SPINDLE_OUTPUT_PIN, INPUT); pinMode(SPINDLE_OUTPUT_PIN, INPUT);
#endif #endif
#ifdef SPINDLE_ENABLE_PIN #ifdef SPINDLE_ENABLE_PIN
gpio_reset_pin(SPINDLE_ENABLE_PIN);
pinMode(SPINDLE_ENABLE_PIN, INPUT); pinMode(SPINDLE_ENABLE_PIN, INPUT);
#endif #endif
#ifdef SPINDLE_DIR_PIN #ifdef SPINDLE_DIR_PIN
gpio_reset_pin(SPINDLE_DIR_PIN);
pinMode(SPINDLE_DIR_PIN, INPUT); pinMode(SPINDLE_DIR_PIN, INPUT);
#endif #endif
} }

View File

@@ -89,7 +89,7 @@ namespace Spindles {
// ========================= Spindle ================================== // ========================= Spindle ==================================
bool Spindle::isRateAdjusted() { bool Spindle::inLaserMode() {
return false; // default for basic spindle is false return false; // default for basic spindle is false
} }

View File

@@ -64,7 +64,7 @@ namespace Spindles {
virtual SpindleState get_state() = 0; virtual SpindleState get_state() = 0;
virtual void stop() = 0; virtual void stop() = 0;
virtual void config_message() = 0; virtual void config_message() = 0;
virtual bool isRateAdjusted(); virtual bool inLaserMode();
virtual void sync(SpindleState state, uint32_t rpm); virtual void sync(SpindleState state, uint32_t rpm);
virtual void deinit(); virtual void deinit();

View File

@@ -273,7 +273,7 @@ namespace Spindles {
} }
// Initialization is complete, so now it's okay to run the queue task: // Initialization is complete, so now it's okay to run the queue task:
task_active = true; task_active = true;
if (vfd_cmd_queue != nullptr) { if (vfd_cmd_queue != nullptr) {
vfd_cmd_queue = xQueueCreate(VFD_RS485_QUEUE_SIZE, sizeof(ModbusCommand)); vfd_cmd_queue = xQueueCreate(VFD_RS485_QUEUE_SIZE, sizeof(ModbusCommand));
} }
@@ -323,6 +323,7 @@ namespace Spindles {
pins_settings_ok = false; pins_settings_ok = false;
#endif #endif
// TODO Test no longer required.
if (laser_mode->get()) { if (laser_mode->get()) {
grbl_msg_sendf(CLIENT_ALL, MsgLevel::Info, "VFD spindle disabled in laser mode. Set $GCode/LaserMode=Off and restart"); grbl_msg_sendf(CLIENT_ALL, MsgLevel::Info, "VFD spindle disabled in laser mode. Set $GCode/LaserMode=Off and restart");
pins_settings_ok = false; pins_settings_ok = false;

View File

@@ -551,7 +551,7 @@ void st_prep_buffer() {
prep.current_speed = sqrt(pl_block->entry_speed_sqr); prep.current_speed = sqrt(pl_block->entry_speed_sqr);
} }
if (spindle->isRateAdjusted()) { // laser_mode->get() { if (spindle->inLaserMode()) { //
if (pl_block->spindle == SpindleState::Ccw) { if (pl_block->spindle == SpindleState::Ccw) {
// Pre-compute inverse programmed rate to speed up PWM updating per step segment. // Pre-compute inverse programmed rate to speed up PWM updating per step segment.
prep.inv_rate = 1.0 / pl_block->programmed_rate; prep.inv_rate = 1.0 / pl_block->programmed_rate;