Merge pull request #191 from synthetos/dev-184-no-spindle-pwm

Fix for Issue #184 - spindle PWM broken
This commit is contained in:
Rob Giseburt
2016-12-15 10:20:33 -06:00
committed by GitHub
4 changed files with 21 additions and 42 deletions
+2 -2
View File
@@ -119,10 +119,10 @@ _MAKE_MOTATE_PIN(kCoolant_EnablePinNumber, 'A', 1); // Coolant_EnableP
_MAKE_MOTATE_PIN(kSocket4_VrefPinNumber, 'A', 2); // Socket4_VrefPinNumber
_MAKE_MOTATE_PIN(kSocket5_VrefPinNumber, 'A', 3); // Socket5_VrefPinNumber
_MAKE_MOTATE_PIN(kSocket2_Microstep_2PinNumber, 'A', 4); // Socket2_Microstep_2PinNumber
_MAKE_MOTATE_PIN(kOutput3_PinNumber, 'A', 5); // Spindle_EnablePinNumber -- now used for Fan 1
_MAKE_MOTATE_PIN(kSpindle_EnablePinNumber, 'A', 5); // Spindle_EnablePinNumber
_MAKE_MOTATE_PIN(kSocket1_DirPinNumber, 'A', 6); // Socket1_DirPinNumber
_MAKE_MOTATE_PIN(kSpindle_DirPinNumber, 'A', 7); // Spindle_DirPinNumber
_MAKE_MOTATE_PIN(kOutput1_PinNumber, 'A', 8); // Spindle_PwmPinNumber -- now used for Extruder 1
_MAKE_MOTATE_PIN(kSpindle_PwmPinNumber, 'A', 8); // Spindle_PwmPinNumber
_MAKE_MOTATE_PIN(kInput2_PinNumber, 'A', 9); // XAxis_MaxPinNumber
_MAKE_MOTATE_PIN(kInput3_PinNumber, 'A', 10); // YAxis_MinPinNumber
_MAKE_MOTATE_PIN(kInput4_PinNumber, 'A', 11); // YAxis_MaxPinNumber
+6 -6
View File
@@ -139,15 +139,15 @@ pin_number kInput10_PinNumber = 109;
pin_number kInput11_PinNumber = 110;
pin_number kInput12_PinNumber = 111;
pin_number kSpindle_EnablePinNumber = 112;
pin_number kSpindle_DirPinNumber = 113;
pin_number kSpindle_PwmPinNumber = 114;
pin_number kSpindle_Pwm2PinNumber = 115;
pin_number kCoolant_EnablePinNumber = 116;
// START DEBUG PINS - Convenient pins to hijack for hardware debugging
// To reuse a pin for debug change the original pin number to -1
// and uncomment the corresponding debug pin
pin_number kSpindle_EnablePinNumber = 112; // Spindle ON implemented in g2ref
pin_number kSpindle_DirPinNumber = 113; // Spindle ON implemented in g2ref
pin_number kSpindle_PwmPinNumber = -1; // 114; // Not implemented (superseded by Extruder1_PWM)
pin_number kSpindle_Pwm2PinNumber = -1; // 115; // Not implemented (superseded by Fan1B_PWM)
pin_number kCoolant_EnablePinNumber = 116; // Spindle ON implemented in g2ref
pin_number kDebug1_PinNumber = -1; // 112;
pin_number kDebug2_PinNumber = -1; // 113;
pin_number kDebug3_PinNumber = -1; // 116; // Note the out-of-order numbering & 115 missing
+10 -31
View File
@@ -31,6 +31,8 @@
#include "spindle.h"
#include "text_parser.h"
#include "pwm.h"
#include "canonical_machine.h"
#include "settings.h"
/***** PWM defines, structures and memory allocation *****/
@@ -38,37 +40,8 @@ pwmSingleton_t pwm;
// Setup motate PWM pins
static Motate::PWMOutputPin<Motate::kSpindle_PwmPinNumber> spindle_pwm_pin;
static Motate::PWMOutputPin<Motate::kSpindle_Pwm2PinNumber> secondary_pwm_pin;
// defines common to all PWM channels
//#define PWM_TIMER_TYPE TC1_struct // PWM uses TC1's
#define PWM_TIMER_t TC1_t // PWM uses TC1's
#define PWM_TIMER_DISABLE 0 // turn timer off (clock = 0 Hz)
//#define PWM_MAX_FREQ (F_CPU/256) // max frequency with 8-bits duty cycle precision
//#define PWM_MIN_FREQ (F_CPU/64/65536) // min frequency with supported prescaling
// channel specific defines
/* CLKSEL is used to configure default PWM clock operating ranges
* These can be changed by pwm_freq() depending on the PWM frequency selected
*
* The useful ranges (assuming a 32 Mhz system clock) are:
* TC_CLKSEL_DIV1_gc - good for about 500 Hz to 125 Khz practical upper limit
* TC_CLKSEL_DIV2_gc - good for about 250 Hz to 62 KHz
* TC_CLKSEL_DIV4_gc - good for about 125 Hz to 31 KHz
* TC_CLKSEL_DIV8_gc - good for about 62 Hz to 16 KHz
* TC_CLKSEL_DIV64_gc - good for about 8 Hz to 2 Khz
*/
#define PWM1_CTRLA_CLKSEL TC_CLKSEL_DIV1_gc // starting clock select value
#define PWM1_CTRLB (3 | TC0_CCBEN_bm) // single slope PWM enabled on channel B
#define PWM1_ISR_vect TCD1_CCB_vect // must match timer assignments in system.h
#define PWM1_INTCTRLB 0 // timer interrupt level (0=off, 1=lo, 2=med, 3=hi)
#define PWM2_CTRLA_CLKSEL TC_CLKSEL_DIV1_gc
#define PWM2_CTRLB 3 // single slope PWM enabled, no output channel
//#define PWM2_CTRLB (3 | TC0_CCBEN_bm) // single slope PWM enabled on channel B
#define PWM2_ISR_vect TCE1_CCB_vect // must match timer assignments in system.h
#define PWM2_INTCTRLB 0 // timer interrupt level (0=off, 1=lo, 2=med, 3=hi)
Motate::PWMOutputPin<Motate::kSpindle_PwmPinNumber> spindle_pwm_pin {Motate::kNormal, P1_PWM_FREQUENCY};
Motate::PWMOutputPin<Motate::kSpindle_Pwm2PinNumber> secondary_pwm_pin {Motate::kNormal, P1_PWM_FREQUENCY}; // assume the same frequency, to start with at least
/***** PWM code *****/
/*
@@ -126,8 +99,14 @@ stat_t pwm_set_duty(uint8_t chan, float duty)
if (duty > 1.0) { return (STAT_INPUT_EXCEEDS_MAX_VALUE);}
if (chan == PWM_1) {
if (spindle_pwm_pin.isNull()) {
cm_alarm(STAT_ALARM, "attempt to turn on a non-existant spindle");
}
spindle_pwm_pin = duty;
} else if (chan == PWM_2) {
if (secondary_pwm_pin.isNull()) {
cm_alarm(STAT_ALARM, "attempt to turn on a non-existant spindle");
}
secondary_pwm_pin = duty;
}
+3 -3
View File
@@ -862,13 +862,13 @@
// *** PWM Settings *** //
#ifndef P1_PWM_FREQUENCY
#define P1_PWM_FREQUENCY 100.0 // in Hz
#define P1_PWM_FREQUENCY 100 // in Hz
#endif
#ifndef P1_CW_SPEED_LO
#define P1_CW_SPEED_LO 7900.0 // in RPM (arbitrary units)
#define P1_CW_SPEED_LO 7900 // in RPM (arbitrary units)
#endif
#ifndef P1_CW_SPEED_HI
#define P1_CW_SPEED_HI 12800.0
#define P1_CW_SPEED_HI 12800
#endif
#ifndef P1_CW_PHASE_LO
#define P1_CW_PHASE_LO 0.13 // phase [0..1]