#define spindle_checksum CHECKSUM("spindle")
#define spindle_max_rpm_checksum CHECKSUM("max_rpm")
+#define spindle_min_rpm_checksum CHECKSUM("min_rpm")
#define spindle_pwm_pin_checksum CHECKSUM("pwm_pin")
#define spindle_pwm_period_checksum CHECKSUM("pwm_period")
#define spindle_switch_on_pin_checksum CHECKSUM("switch_on_pin")
spindle_on = false;
target_rpm = 0;
+ min_rpm = THEKERNEL->config->value(spindle_checksum, spindle_min_rpm_checksum)->by_default(100)->as_int();
max_rpm = THEKERNEL->config->value(spindle_checksum, spindle_max_rpm_checksum)->by_default(5000)->as_int();
// Get the pin for hardware pwm
Pin *smoothie_pin = new Pin();
smoothie_pin->from_string(THEKERNEL->config->value(spindle_checksum, spindle_pwm_pin_checksum)->by_default("nc")->as_string());
pwm_pin = smoothie_pin->as_output()->hardware_pwm();
- output_inverted = smoothie_pin->inverting;
+ output_inverted = smoothie_pin->is_inverting();
delete smoothie_pin;
}
// If we got no hardware PWM pin, delete this module
// Get digital out pin for switching the VFD on and off (wired to a digital input on the VFD via an optocoupler)
std::string switch_on_pin = THEKERNEL->config->value(spindle_checksum, spindle_switch_on_pin_checksum)->by_default("nc")->as_string();
- switch_on = new Pin();
- switch_on->from_string(switch_on_pin)->as_output()->set(false);
-
- // register for events
- register_for_event(ON_GCODE_RECEIVED);
- register_for_event(ON_GCODE_EXECUTE);
-
+ switch_on = NULL;
+ if(switch_on_pin.compare("nc") != 0) {
+ switch_on = new Pin();
+ switch_on->from_string(switch_on_pin)->as_output()->set(false);
+ }
}
void AnalogSpindleControl::turn_on()
{
- // set the output for switching the VFD on
- switch_on->set(true);
+ // set the output for switching the VFD on
+ if(switch_on != NULL)
+ switch_on->set(true);
spindle_on = true;
}
void AnalogSpindleControl::turn_off()
{
// clear the output for switching the VFD on
- switch_on->set(false);
+ if(switch_on != NULL)
+ switch_on->set(false);
spindle_on = false;
// set the PWM value to 0 to make sure it stops
update_pwm(0);
target_rpm = 0;
} else if (rpm > max_rpm) {
target_rpm = max_rpm;
+ } else if (rpm > 0 && rpm < min_rpm){
+ target_rpm = min_rpm;
} else {
target_rpm = rpm;
}
void AnalogSpindleControl::update_pwm(float value)
{
// set the requested PWM value, invert it if necessary
- if (output_inverted)
+ if(output_inverted)
pwm_pin->write(1.0f - value);
else
pwm_pin->write(value);