Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/edge' into upstreamedge
Browse files Browse the repository at this point in the history
  • Loading branch information
wolfmanjm committed Apr 6, 2016
2 parents 41367a8 + 2879783 commit 48292a0
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 58 deletions.
76 changes: 25 additions & 51 deletions src/modules/tools/spindle/Spindle.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,9 @@ void Spindle::on_module_loaded()
time_since_update = 0;
spindle_on = true;

if (!THEKERNEL->config->value(spindle_enable_checksum)->by_default(false)->as_bool())
{
delete this; // Spindle control module is disabled
return;
if (!THEKERNEL->config->value(spindle_enable_checksum)->by_default(false)->as_bool()) {
delete this; // Spindle control module is disabled
return;
}

pulses_per_rev = THEKERNEL->config->value(spindle_pulses_per_rev_checksum)->by_default(1.0f)->as_number();
Expand All @@ -79,8 +78,7 @@ void Spindle::on_module_loaded()
delete smoothie_pin;
}

if (spindle_pin == NULL)
{
if (spindle_pin == NULL) {
THEKERNEL->streams->printf("Error: Spindle PWM pin must be P2.0-2.5 or other PWM pin\n");
delete this;
return;
Expand All @@ -95,15 +93,12 @@ void Spindle::on_module_loaded()
Pin *smoothie_pin = new Pin();
smoothie_pin->from_string(THEKERNEL->config->value(spindle_feedback_pin_checksum)->by_default("nc")->as_string());
smoothie_pin->as_input();
if (smoothie_pin->port_number == 0 || smoothie_pin->port_number == 2)
{
if (smoothie_pin->port_number == 0 || smoothie_pin->port_number == 2) {
PinName pinname = port_pin((PortName)smoothie_pin->port_number, smoothie_pin->pin);
feedback_pin = new mbed::InterruptIn(pinname);
feedback_pin->rise(this, &Spindle::on_pin_rise);
NVIC_SetPriority(EINT3_IRQn, 16);
}
else
{
} else {
THEKERNEL->streams->printf("Error: Spindle feedback pin has to be on P0 or P2.\n");
delete this;
return;
Expand All @@ -113,7 +108,6 @@ void Spindle::on_module_loaded()

THEKERNEL->slow_ticker->attach(UPDATE_FREQ, this, &Spindle::on_update_speed);
register_for_event(ON_GCODE_RECEIVED);
register_for_event(ON_GCODE_EXECUTE);
}

void Spindle::on_pin_rise()
Expand All @@ -139,18 +133,14 @@ uint32_t Spindle::on_update_speed(uint32_t dummy)

// Calculate current RPM
uint32_t t = last_time;
if (t == 0)
{
if (t == 0) {
current_rpm = 0;
}
else
{
} else {
float new_rpm = 1000000 * 60.0f / (t * pulses_per_rev);
current_rpm = smoothing_decay * new_rpm + (1.0f - smoothing_decay) * current_rpm;
}

if (spindle_on)
{
if (spindle_on) {
float error = target_rpm - current_rpm;

current_I_value += control_I_term * error * 1.0f / UPDATE_FREQ;
Expand All @@ -164,9 +154,7 @@ uint32_t Spindle::on_update_speed(uint32_t dummy)
prev_error = error;

current_pwm_value = new_pwm;
}
else
{
} else {
current_I_value = 0;
current_pwm_value = 0;
}
Expand All @@ -184,16 +172,12 @@ void Spindle::on_gcode_received(void* argument)
{
Gcode *gcode = static_cast<Gcode *>(argument);

if (gcode->has_m)
{
if (gcode->m == 957)
{
if (gcode->has_m) {
if (gcode->m == 957) {
// M957: report spindle speed
THEKERNEL->streams->printf("Current RPM: %5.0f Target RPM: %5.0f PWM value: %5.3f\n",
current_rpm, target_rpm, current_pwm_value);
}
else if (gcode->m == 958)
{
} else if (gcode->m == 958) {
// M958: set spindle PID parameters
if (gcode->has_letter('P'))
control_P_term = gcode->get_value('P');
Expand All @@ -202,36 +186,26 @@ void Spindle::on_gcode_received(void* argument)
if (gcode->has_letter('D'))
control_D_term = gcode->get_value('D');
THEKERNEL->streams->printf("P: %0.6f I: %0.6f D: %0.6f\n",
control_P_term, control_I_term, control_D_term);
}
else if (gcode->m == 3 || gcode->m == 5)
{
// M3: Spindle on, M5: Spindle off
THEKERNEL->conveyor->append_gcode(gcode);
}
}
}

void Spindle::on_gcode_execute(void* argument)
{
Gcode *gcode = static_cast<Gcode *>(argument);
control_P_term, control_I_term, control_D_term);
} else if (gcode->m == 3) {
THEKERNEL->conveyor->wait_for_empty_queue();

if (gcode->has_m)
{
if (gcode->m == 3)
{
// M3: Spindle on
spindle_on = true;

if (gcode->has_letter('S'))
{
if (gcode->has_letter('S')) {
target_rpm = gcode->get_value('S');
}
}
else if (gcode->m == 5)
{

} else if (gcode->m == 5) {
THEKERNEL->conveyor->wait_for_empty_queue();
spindle_on = false;
}

}else if(!gcode->has_m && !gcode->has_g && gcode->has_letter('S')) {
// special case S on its own
THEKERNEL->conveyor->wait_for_empty_queue();
target_rpm = gcode->get_value('S');
}
}

13 changes: 6 additions & 7 deletions src/modules/tools/spindle/Spindle.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,18 +22,17 @@ class Spindle: public Module {
Spindle();
virtual ~Spindle() {};
void on_module_loaded();


private:
void on_pin_rise();
void on_gcode_received(void *argument);
void on_gcode_execute(void *argument);
uint32_t on_update_speed(uint32_t dummy);

mbed::PwmOut *spindle_pin; // PWM output for spindle speed control
mbed::InterruptIn *feedback_pin; // Interrupt pin for measuring speed
bool output_inverted;

// Current values, updated at runtime
bool spindle_on;
float current_rpm;
Expand All @@ -43,14 +42,14 @@ class Spindle: public Module {
float current_pwm_value;
int time_since_update;
uint32_t last_irq;

// Values from config
float pulses_per_rev;
float control_P_term;
float control_I_term;
float control_D_term;
float smoothing_decay;

// These fields are updated by the interrupt
uint32_t last_edge; // Timestamp of last edge
volatile uint32_t last_time; // Time delay between last two edges
Expand Down

0 comments on commit 48292a0

Please sign in to comment.