Merged multiple extruder support.
Soft PWM. (Sanguinololu can also have PID temperature control) Interrupt save WRITE for addresses > 0x0FF
This commit is contained in:
parent
3664ed6aad
commit
e017228569
|
@ -4,11 +4,11 @@
|
||||||
|
|
||||||
|
|
||||||
// This determines the communication speed of the printer
|
// This determines the communication speed of the printer
|
||||||
//#define BAUDRATE 250000
|
#define BAUDRATE 250000
|
||||||
#define BAUDRATE 115200
|
//#define BAUDRATE 115200
|
||||||
//#define BAUDRATE 230400
|
//#define BAUDRATE 230400
|
||||||
|
|
||||||
#define EXTRUDERS 2
|
#define EXTRUDERS 1
|
||||||
|
|
||||||
// Frequency limit
|
// Frequency limit
|
||||||
// See nophead's blog for more info
|
// See nophead's blog for more info
|
||||||
|
@ -32,7 +32,7 @@
|
||||||
// Sanguinololu 1.2 and above = 62
|
// Sanguinololu 1.2 and above = 62
|
||||||
// Ultimaker = 7,
|
// Ultimaker = 7,
|
||||||
// Teensylu = 8
|
// Teensylu = 8
|
||||||
#define MOTHERBOARD 33
|
#define MOTHERBOARD 7
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//=============================Thermal Settings ============================
|
//=============================Thermal Settings ============================
|
||||||
|
@ -46,16 +46,21 @@
|
||||||
// 5 is ParCan supplied 104GT-2 100K
|
// 5 is ParCan supplied 104GT-2 100K
|
||||||
// 6 is EPCOS 100k
|
// 6 is EPCOS 100k
|
||||||
// 7 is 100k Honeywell thermistor 135-104LAG-J01
|
// 7 is 100k Honeywell thermistor 135-104LAG-J01
|
||||||
#define THERMISTORHEATER_0 1
|
|
||||||
#define THERMISTORHEATER_1 1
|
//#define THERMISTORHEATER_0 3
|
||||||
#define HEATER_0_USES_THERMISTOR
|
//#define THERMISTORHEATER_1 1
|
||||||
#define HEATER_1_USES_THERMISTOR
|
//#define THERMISTORHEATER_2 1
|
||||||
//#define HEATER_0_USES_AD595
|
|
||||||
|
//#define HEATER_0_USES_THERMISTOR
|
||||||
|
//#define HEATER_1_USES_THERMISTOR
|
||||||
|
//#define HEATER_2_USES_THERMISTOR
|
||||||
|
#define HEATER_0_USES_AD595
|
||||||
//#define HEATER_1_USES_AD595
|
//#define HEATER_1_USES_AD595
|
||||||
|
//#define HEATER_2_USES_AD595
|
||||||
|
|
||||||
// Select one of these only to define how the bed temp is read.
|
// Select one of these only to define how the bed temp is read.
|
||||||
#define THERMISTORBED 1
|
//#define THERMISTORBED 1
|
||||||
#define BED_USES_THERMISTOR
|
//#define BED_USES_THERMISTOR
|
||||||
//#define BED_USES_AD595
|
//#define BED_USES_AD595
|
||||||
|
|
||||||
#define BED_CHECK_INTERVAL 5000 //ms
|
#define BED_CHECK_INTERVAL 5000 //ms
|
||||||
|
@ -73,7 +78,8 @@
|
||||||
//// The minimal temperature defines the temperature below which the heater will not be enabled
|
//// The minimal temperature defines the temperature below which the heater will not be enabled
|
||||||
#define HEATER_0_MINTEMP 5
|
#define HEATER_0_MINTEMP 5
|
||||||
//#define HEATER_1_MINTEMP 5
|
//#define HEATER_1_MINTEMP 5
|
||||||
#define BED_MINTEMP 5
|
//#define HEATER_2_MINTEMP 5
|
||||||
|
//#define BED_MINTEMP 5
|
||||||
|
|
||||||
|
|
||||||
// When temperature exceeds max temp, your heater will be switched off.
|
// When temperature exceeds max temp, your heater will be switched off.
|
||||||
|
@ -81,7 +87,8 @@
|
||||||
// You should use MINTEMP for thermistor short/failure protection.
|
// You should use MINTEMP for thermistor short/failure protection.
|
||||||
#define HEATER_0_MAXTEMP 275
|
#define HEATER_0_MAXTEMP 275
|
||||||
//#define HEATER_1_MAXTEMP 275
|
//#define HEATER_1_MAXTEMP 275
|
||||||
#define BED_MAXTEMP 150
|
//#define HEATER_2_MAXTEMP 275
|
||||||
|
//#define BED_MAXTEMP 150
|
||||||
|
|
||||||
|
|
||||||
// Wait for Cooldown
|
// Wait for Cooldown
|
||||||
|
@ -92,21 +99,17 @@
|
||||||
|
|
||||||
// Heating is finished if a temperature close to this degree shift is reached
|
// Heating is finished if a temperature close to this degree shift is reached
|
||||||
#define HEATING_EARLY_FINISH_DEG_OFFSET 1 //Degree
|
#define HEATING_EARLY_FINISH_DEG_OFFSET 1 //Degree
|
||||||
|
|
||||||
// PID settings:
|
// PID settings:
|
||||||
// Uncomment the following line to enable PID support.
|
// Uncomment the following line to enable PID support.
|
||||||
|
|
||||||
#define PIDTEMP
|
#define PIDTEMP
|
||||||
|
#define PID_MAX 255 // limits current to nozzle; 255=full current
|
||||||
#ifdef PIDTEMP
|
#ifdef PIDTEMP
|
||||||
#if MOTHERBOARD == 62
|
|
||||||
#error Sanguinololu does not support PID, sorry. Please disable it.
|
|
||||||
#endif
|
|
||||||
//#define PID_DEBUG // Sends debug data to the serial port.
|
//#define PID_DEBUG // Sends debug data to the serial port.
|
||||||
//#define PID_OPENLOOP 1 // Puts PID in open loop. M104 sets the output power in %
|
//#define PID_OPENLOOP 1 // Puts PID in open loop. M104 sets the output power in %
|
||||||
|
|
||||||
#define PID_MAX 255 // limits current to nozzle; 255=full current
|
|
||||||
#define PID_INTEGRAL_DRIVE_MAX 255 //limit for the integral term
|
#define PID_INTEGRAL_DRIVE_MAX 255 //limit for the integral term
|
||||||
#define K1 0.95 //smoothing factor withing the PID
|
#define K1 0.95 //smoothing factor withing the PID
|
||||||
#define PID_dT 0.1 //sampling period of the PID
|
#define PID_dT 0.128 //sampling period of the PID
|
||||||
|
|
||||||
//To develop some PID settings for your machine, you can initiall follow
|
//To develop some PID settings for your machine, you can initiall follow
|
||||||
// the Ziegler-Nichols method.
|
// the Ziegler-Nichols method.
|
||||||
|
@ -130,14 +133,14 @@
|
||||||
// #define DEFAULT_Kd (PID_SWING_AT_CRITIAL/8./PID_dT)
|
// #define DEFAULT_Kd (PID_SWING_AT_CRITIAL/8./PID_dT)
|
||||||
|
|
||||||
// Ultitmaker
|
// Ultitmaker
|
||||||
// #define DEFAULT_Kp 22.2
|
#define DEFAULT_Kp 22.2
|
||||||
// #define DEFAULT_Ki (1.25*PID_dT)
|
#define DEFAULT_Ki (1.25*PID_dT)
|
||||||
// #define DEFAULT_Kd (99/PID_dT)
|
#define DEFAULT_Kd (99/PID_dT)
|
||||||
|
|
||||||
// Makergear
|
// Makergear
|
||||||
#define DEFAULT_Kp 7.0
|
// #define DEFAULT_Kp 7.0
|
||||||
#define DEFAULT_Ki 0.1
|
// #define DEFAULT_Ki 0.1
|
||||||
#define DEFAULT_Kd 12
|
// #define DEFAULT_Kd 12
|
||||||
|
|
||||||
// Mendel Parts V9 on 12V
|
// Mendel Parts V9 on 12V
|
||||||
// #define DEFAULT_Kp 63.0
|
// #define DEFAULT_Kp 63.0
|
||||||
|
@ -170,12 +173,12 @@
|
||||||
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
|
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
|
||||||
|
|
||||||
// The pullups are needed if you directly connect a mechanical endswitch between the signal and ground pins.
|
// The pullups are needed if you directly connect a mechanical endswitch between the signal and ground pins.
|
||||||
const bool X_ENDSTOPS_INVERTING = false; // set to true to invert the logic of the endstops.
|
const bool X_ENDSTOPS_INVERTING = true; // set to true to invert the logic of the endstops.
|
||||||
const bool Y_ENDSTOPS_INVERTING = false; // set to true to invert the logic of the endstops.
|
const bool Y_ENDSTOPS_INVERTING = true; // set to true to invert the logic of the endstops.
|
||||||
const bool Z_ENDSTOPS_INVERTING = false; // set to true to invert the logic of the endstops.
|
const bool Z_ENDSTOPS_INVERTING = true; // set to true to invert the logic of the endstops.
|
||||||
// For optos H21LOB set to true, for Mendel-Parts newer optos TCST2103 set to false
|
// For optos H21LOB set to true, for Mendel-Parts newer optos TCST2103 set to false
|
||||||
|
|
||||||
//#define ENDSTOPS_ONLY_FOR_HOMING // If defined the endstops will only be used for homing
|
#define ENDSTOPS_ONLY_FOR_HOMING // If defined the endstops will only be used for homing
|
||||||
|
|
||||||
// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1
|
// For Inverting Stepper Enable Pins (Active Low) use 0, Non Inverting (Active High) use 1
|
||||||
#define X_ENABLE_ON 0
|
#define X_ENABLE_ON 0
|
||||||
|
@ -186,7 +189,7 @@ const bool Z_ENDSTOPS_INVERTING = false; // set to true to invert the logic of t
|
||||||
// Disables axis when it's not being used.
|
// Disables axis when it's not being used.
|
||||||
#define DISABLE_X false
|
#define DISABLE_X false
|
||||||
#define DISABLE_Y false
|
#define DISABLE_Y false
|
||||||
#define DISABLE_Z true
|
#define DISABLE_Z false
|
||||||
#define DISABLE_E false // For all extruders
|
#define DISABLE_E false // For all extruders
|
||||||
|
|
||||||
// Inverting axis direction
|
// Inverting axis direction
|
||||||
|
@ -195,11 +198,11 @@ const bool Z_ENDSTOPS_INVERTING = false; // set to true to invert the logic of t
|
||||||
//#define INVERT_Z_DIR false // for Mendel set to false, for Orca set to true
|
//#define INVERT_Z_DIR false // for Mendel set to false, for Orca set to true
|
||||||
//#define INVERT_E*_DIR true // for direct drive extruder v9 set to true, for geared extruder set to false, used for all extruders
|
//#define INVERT_E*_DIR true // for direct drive extruder v9 set to true, for geared extruder set to false, used for all extruders
|
||||||
|
|
||||||
#define INVERT_X_DIR false // for Mendel set to false, for Orca set to true
|
#define INVERT_X_DIR true // for Mendel set to false, for Orca set to true
|
||||||
#define INVERT_Y_DIR false // for Mendel set to true, for Orca set to false
|
#define INVERT_Y_DIR false // for Mendel set to true, for Orca set to false
|
||||||
#define INVERT_Z_DIR true // for Mendel set to false, for Orca set to true
|
#define INVERT_Z_DIR true // for Mendel set to false, for Orca set to true
|
||||||
#define INVERT_E0_DIR false // for direct drive extruder v9 set to true, for geared extruder set to false
|
#define INVERT_E0_DIR false // for direct drive extruder v9 set to true, for geared extruder set to false
|
||||||
#define INVERT_E1_DIR true // for direct drive extruder v9 set to true, for geared extruder set to false
|
#define INVERT_E1_DIR false // for direct drive extruder v9 set to true, for geared extruder set to false
|
||||||
#define INVERT_E2_DIR false // for direct drive extruder v9 set to true, for geared extruder set to false
|
#define INVERT_E2_DIR false // for direct drive extruder v9 set to true, for geared extruder set to false
|
||||||
|
|
||||||
//// ENDSTOP SETTINGS:
|
//// ENDSTOP SETTINGS:
|
||||||
|
@ -208,15 +211,15 @@ const bool Z_ENDSTOPS_INVERTING = false; // set to true to invert the logic of t
|
||||||
#define Y_HOME_DIR -1
|
#define Y_HOME_DIR -1
|
||||||
#define Z_HOME_DIR -1
|
#define Z_HOME_DIR -1
|
||||||
|
|
||||||
#define min_software_endstops false //If true, axis won't move to coordinates less than zero.
|
#define min_software_endstops true //If true, axis won't move to coordinates less than zero.
|
||||||
#define max_software_endstops false //If true, axis won't move to coordinates greater than the defined lengths below.
|
#define max_software_endstops true //If true, axis won't move to coordinates greater than the defined lengths below.
|
||||||
#define X_MAX_LENGTH 210
|
#define X_MAX_LENGTH 205
|
||||||
#define Y_MAX_LENGTH 210
|
#define Y_MAX_LENGTH 205
|
||||||
#define Z_MAX_LENGTH 210
|
#define Z_MAX_LENGTH 200
|
||||||
|
|
||||||
//// MOVEMENT SETTINGS
|
//// MOVEMENT SETTINGS
|
||||||
#define NUM_AXIS 4 // The axis order in all axis related arrays is X, Y, Z, E
|
#define NUM_AXIS 4 // The axis order in all axis related arrays is X, Y, Z, E
|
||||||
#define HOMING_FEEDRATE {30*60, 30*60, 2*60, 0} // set the homing speeds (mm/min)
|
#define HOMING_FEEDRATE {50*60, 50*60, 4*60, 0} // set the homing speeds (mm/min)
|
||||||
|
|
||||||
//homing hits the endstop, then retracts by this distance, before it tries to slowly bump again:
|
//homing hits the endstop, then retracts by this distance, before it tries to slowly bump again:
|
||||||
#define X_HOME_RETRACT_MM 5
|
#define X_HOME_RETRACT_MM 5
|
||||||
|
@ -230,9 +233,9 @@ const bool Z_ENDSTOPS_INVERTING = false; // set to true to invert the logic of t
|
||||||
|
|
||||||
// default settings
|
// default settings
|
||||||
|
|
||||||
//#define DEFAULT_AXIS_STEPS_PER_UNIT {78.7402,78.7402,200*8/3,760*1.1} // default steps per unit for ultimaker
|
#define DEFAULT_AXIS_STEPS_PER_UNIT {78.7402,78.7402,200*8/3,760*1.1} // default steps per unit for ultimaker
|
||||||
//#define DEFAULT_AXIS_STEPS_PER_UNIT {40, 40, 3333.92, 67} //sells mendel with v9 extruder
|
//#define DEFAULT_AXIS_STEPS_PER_UNIT {40, 40, 3333.92, 360} //sells mendel with v9 extruder
|
||||||
#define DEFAULT_AXIS_STEPS_PER_UNIT {80.3232, 80.8900, 2284.7651, 757.2218} // SAE Prusa w/ Wade extruder
|
//#define DEFAULT_AXIS_STEPS_PER_UNIT {80.3232, 80.8900, 2284.7651, 757.2218} // SAE Prusa w/ Wade extruder
|
||||||
#define DEFAULT_MAX_FEEDRATE {500, 500, 5, 45} // (mm/sec)
|
#define DEFAULT_MAX_FEEDRATE {500, 500, 5, 45} // (mm/sec)
|
||||||
#define DEFAULT_MAX_ACCELERATION {9000,9000,100,10000} // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for skeinforge 40+, for older versions raise them a lot.
|
#define DEFAULT_MAX_ACCELERATION {9000,9000,100,10000} // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for skeinforge 40+, for older versions raise them a lot.
|
||||||
|
|
||||||
|
@ -283,10 +286,10 @@ const bool Z_ENDSTOPS_INVERTING = false; // set to true to invert the logic of t
|
||||||
// hooke's law says: force = k * distance
|
// hooke's law says: force = k * distance
|
||||||
// bernoulli's priniciple says: v ^ 2 / 2 + g . h + pressure / density = constant
|
// bernoulli's priniciple says: v ^ 2 / 2 + g . h + pressure / density = constant
|
||||||
// so: v ^ 2 is proportional to number of steps we advance the extruder
|
// so: v ^ 2 is proportional to number of steps we advance the extruder
|
||||||
//#define ADVANCE
|
#define ADVANCE
|
||||||
|
|
||||||
#ifdef ADVANCE
|
#ifdef ADVANCE
|
||||||
#define EXTRUDER_ADVANCE_K .3
|
#define EXTRUDER_ADVANCE_K .0
|
||||||
|
|
||||||
#define D_FILAMENT 2.85
|
#define D_FILAMENT 2.85
|
||||||
#define STEPS_MM_E 836
|
#define STEPS_MM_E 836
|
||||||
|
@ -298,10 +301,10 @@ const bool Z_ENDSTOPS_INVERTING = false; // set to true to invert the logic of t
|
||||||
|
|
||||||
//LCD and SD support
|
//LCD and SD support
|
||||||
//#define ULTRA_LCD //general lcd support, also 16x2
|
//#define ULTRA_LCD //general lcd support, also 16x2
|
||||||
#define SDSUPPORT // Enable SD Card Support in Hardware Console
|
//#define SDSUPPORT // Enable SD Card Support in Hardware Console
|
||||||
#define SD_FINISHED_STEPPERRELEASE true //if sd support and the file is finished: disable steppers?
|
#define SD_FINISHED_STEPPERRELEASE true //if sd support and the file is finished: disable steppers?
|
||||||
|
|
||||||
//#define ULTIPANEL
|
#define ULTIPANEL
|
||||||
#ifdef ULTIPANEL
|
#ifdef ULTIPANEL
|
||||||
//#define NEWPANEL //enable this if you have a click-encoder panel
|
//#define NEWPANEL //enable this if you have a click-encoder panel
|
||||||
#define SDSUPPORT
|
#define SDSUPPORT
|
||||||
|
|
|
@ -57,8 +57,6 @@ const prog_char echomagic[] PROGMEM ="echo:";
|
||||||
|
|
||||||
#define SERIAL_ECHOPAIR(name,value) {SERIAL_ECHOPGM(name);SERIAL_ECHO(value);}
|
#define SERIAL_ECHOPAIR(name,value) {SERIAL_ECHOPGM(name);SERIAL_ECHO(value);}
|
||||||
|
|
||||||
// Macro for getting current active extruder
|
|
||||||
#define ACTIVE_EXTRUDER (active_extruder)
|
|
||||||
|
|
||||||
//things to write to serial from Programmemory. saves 400 to 2k of RAM.
|
//things to write to serial from Programmemory. saves 400 to 2k of RAM.
|
||||||
#define SerialprintPGM(x) serialprintPGM(MYPGM(x))
|
#define SerialprintPGM(x) serialprintPGM(MYPGM(x))
|
||||||
|
|
|
@ -465,16 +465,16 @@ FORCE_INLINE bool code_seen(char code)
|
||||||
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); \
|
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); \
|
||||||
destination[LETTER##_AXIS] = 1.5 * LETTER##_MAX_LENGTH * LETTER##_HOME_DIR; \
|
destination[LETTER##_AXIS] = 1.5 * LETTER##_MAX_LENGTH * LETTER##_HOME_DIR; \
|
||||||
feedrate = homing_feedrate[LETTER##_AXIS]; \
|
feedrate = homing_feedrate[LETTER##_AXIS]; \
|
||||||
prepare_move(); \
|
plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder); \
|
||||||
\
|
\
|
||||||
current_position[LETTER##_AXIS] = 0;\
|
current_position[LETTER##_AXIS] = 0;\
|
||||||
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);\
|
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);\
|
||||||
destination[LETTER##_AXIS] = -LETTER##_HOME_RETRACT_MM * LETTER##_HOME_DIR;\
|
destination[LETTER##_AXIS] = -LETTER##_HOME_RETRACT_MM * LETTER##_HOME_DIR;\
|
||||||
prepare_move(); \
|
plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder); \
|
||||||
\
|
\
|
||||||
destination[LETTER##_AXIS] = 2*LETTER##_HOME_RETRACT_MM * LETTER##_HOME_DIR;\
|
destination[LETTER##_AXIS] = 2*LETTER##_HOME_RETRACT_MM * LETTER##_HOME_DIR;\
|
||||||
feedrate = homing_feedrate[LETTER##_AXIS]/2 ; \
|
feedrate = homing_feedrate[LETTER##_AXIS]/2 ; \
|
||||||
prepare_move(); \
|
plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder); \
|
||||||
\
|
\
|
||||||
current_position[LETTER##_AXIS] = (LETTER##_HOME_DIR == -1) ? 0 : LETTER##_MAX_LENGTH;\
|
current_position[LETTER##_AXIS] = (LETTER##_HOME_DIR == -1) ? 0 : LETTER##_MAX_LENGTH;\
|
||||||
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);\
|
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);\
|
||||||
|
@ -541,6 +541,7 @@ FORCE_INLINE void process_commands()
|
||||||
if( code_seen(axis_codes[0]) && code_seen(axis_codes[1]) ) //first diagonal move
|
if( code_seen(axis_codes[0]) && code_seen(axis_codes[1]) ) //first diagonal move
|
||||||
{
|
{
|
||||||
current_position[X_AXIS] = 0; current_position[Y_AXIS] = 0;
|
current_position[X_AXIS] = 0; current_position[Y_AXIS] = 0;
|
||||||
|
|
||||||
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
|
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
|
||||||
destination[X_AXIS] = 1.5 * X_MAX_LENGTH * X_HOME_DIR;
|
destination[X_AXIS] = 1.5 * X_MAX_LENGTH * X_HOME_DIR;
|
||||||
destination[Y_AXIS] = 1.5 * Y_MAX_LENGTH * Y_HOME_DIR;
|
destination[Y_AXIS] = 1.5 * Y_MAX_LENGTH * Y_HOME_DIR;
|
||||||
|
@ -723,7 +724,7 @@ FORCE_INLINE void process_commands()
|
||||||
if (code_seen('S')) setTargetBed(code_value());
|
if (code_seen('S')) setTargetBed(code_value());
|
||||||
break;
|
break;
|
||||||
case 105 : // M105
|
case 105 : // M105
|
||||||
tmp_extruder = ACTIVE_EXTRUDER;
|
tmp_extruder = active_extruder;
|
||||||
if(code_seen('T')) {
|
if(code_seen('T')) {
|
||||||
tmp_extruder = code_value();
|
tmp_extruder = code_value();
|
||||||
if(tmp_extruder >= EXTRUDERS) {
|
if(tmp_extruder >= EXTRUDERS) {
|
||||||
|
@ -743,6 +744,10 @@ FORCE_INLINE void process_commands()
|
||||||
#else
|
#else
|
||||||
SERIAL_ERROR_START;
|
SERIAL_ERROR_START;
|
||||||
SERIAL_ERRORLNPGM("No thermistors - no temp");
|
SERIAL_ERRORLNPGM("No thermistors - no temp");
|
||||||
|
#endif
|
||||||
|
#ifdef PIDTEMP
|
||||||
|
SERIAL_PROTOCOLPGM(" @:");
|
||||||
|
SERIAL_PROTOCOL(getHeaterPower(tmp_extruder));
|
||||||
#endif
|
#endif
|
||||||
SERIAL_PROTOCOLLN("");
|
SERIAL_PROTOCOLLN("");
|
||||||
return;
|
return;
|
||||||
|
@ -788,24 +793,26 @@ FORCE_INLINE void process_commands()
|
||||||
while((residencyStart == -1) ||
|
while((residencyStart == -1) ||
|
||||||
(residencyStart > -1 && (millis() - residencyStart) < TEMP_RESIDENCY_TIME*1000) ) {
|
(residencyStart > -1 && (millis() - residencyStart) < TEMP_RESIDENCY_TIME*1000) ) {
|
||||||
#else
|
#else
|
||||||
while ( target_direction ? (isHeatingHotend(tmp_extruder)) : (isCoolingHotend(tmp_extruder)&&(CooldownNoWait==false)) ) {
|
while ( target_direction ? (isHeatingHotend(tmp_extruder)) : (isCoolingHotend(tmp_extruder)&&(CooldownNoWait==false)) ) {
|
||||||
#endif //TEMP_RESIDENCY_TIME
|
#endif //TEMP_RESIDENCY_TIME
|
||||||
if( (millis() - codenum) > 1000 )
|
if( (millis() - codenum) > 1000 )
|
||||||
{ //Print Temp Reading and remaining time every 1 second while heating up/cooling down
|
{ //Print Temp Reading and remaining time every 1 second while heating up/cooling down
|
||||||
SERIAL_PROTOCOLPGM("T:");
|
SERIAL_PROTOCOLPGM("T:");
|
||||||
SERIAL_PROTOCOLLN( degHotend(tmp_extruder) );
|
SERIAL_PROTOCOL( degHotend(tmp_extruder) );
|
||||||
SERIAL_PROTOCOLPGM(" E:");
|
SERIAL_PROTOCOLPGM(" E:");
|
||||||
SERIAL_PROTOCOLLN( (int)tmp_extruder );
|
SERIAL_PROTOCOLLN( (int)tmp_extruder );
|
||||||
SERIAL_PROTOCOLPGM(" W:");
|
#ifdef TEMP_RESIDENCY_TIME
|
||||||
if(residencyStart > -1)
|
SERIAL_PROTOCOLPGM(" W:");
|
||||||
{
|
if(residencyStart > -1)
|
||||||
codenum = TEMP_RESIDENCY_TIME - ((millis() - residencyStart) / 1000);
|
{
|
||||||
SERIAL_PROTOCOLLN( codenum );
|
codenum = TEMP_RESIDENCY_TIME - ((millis() - residencyStart) / 1000);
|
||||||
}
|
SERIAL_PROTOCOLLN( codenum );
|
||||||
else
|
}
|
||||||
{
|
else
|
||||||
SERIAL_PROTOCOLLN( "?" );
|
{
|
||||||
}
|
SERIAL_PROTOCOLLN( "?" );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
codenum = millis();
|
codenum = millis();
|
||||||
}
|
}
|
||||||
manage_heater();
|
manage_heater();
|
||||||
|
@ -834,11 +841,11 @@ FORCE_INLINE void process_commands()
|
||||||
{
|
{
|
||||||
if( (millis()-codenum) > 1000 ) //Print Temp Reading every 1 second while heating up.
|
if( (millis()-codenum) > 1000 ) //Print Temp Reading every 1 second while heating up.
|
||||||
{
|
{
|
||||||
float tt=degHotend(ACTIVE_EXTRUDER);
|
float tt=degHotend(active_extruder);
|
||||||
SERIAL_PROTOCOLPGM("T:");
|
SERIAL_PROTOCOLPGM("T:");
|
||||||
SERIAL_PROTOCOL(tt);
|
SERIAL_PROTOCOL(tt);
|
||||||
SERIAL_PROTOCOLPGM(" E:");
|
SERIAL_PROTOCOLPGM(" E:");
|
||||||
SERIAL_PROTOCOLLN( (int)tmp_extruder );
|
SERIAL_PROTOCOLLN( (int)active_extruder );
|
||||||
SERIAL_PROTOCOLPGM(" B:");
|
SERIAL_PROTOCOLPGM(" B:");
|
||||||
SERIAL_PROTOCOLLN(degBed());
|
SERIAL_PROTOCOLLN(degBed());
|
||||||
codenum = millis();
|
codenum = millis();
|
||||||
|
@ -1191,6 +1198,7 @@ void manage_inactivity(byte debug)
|
||||||
|
|
||||||
void kill()
|
void kill()
|
||||||
{
|
{
|
||||||
|
cli(); // Stop interrupts
|
||||||
disable_heater();
|
disable_heater();
|
||||||
|
|
||||||
disable_x();
|
disable_x();
|
||||||
|
@ -1207,4 +1215,4 @@ void kill()
|
||||||
while(1); // Wait for reset
|
while(1); // Wait for reset
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
5153
Marlin/fastio.h
5153
Marlin/fastio.h
File diff suppressed because it is too large
Load diff
1473
Marlin/pins.h
1473
Marlin/pins.h
File diff suppressed because it is too large
Load diff
|
@ -191,8 +191,8 @@ void calculate_trapezoid_for_block(block_t *block, float entry_factor, float exi
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ADVANCE
|
#ifdef ADVANCE
|
||||||
long initial_advance = block->advance*entry_factor*entry_factor;
|
volatile long initial_advance = block->advance*entry_factor*entry_factor;
|
||||||
long final_advance = block->advance*exit_factor*exit_factor;
|
volatile long final_advance = block->advance*exit_factor*exit_factor;
|
||||||
#endif // ADVANCE
|
#endif // ADVANCE
|
||||||
|
|
||||||
// block->accelerate_until = accelerate_steps;
|
// block->accelerate_until = accelerate_steps;
|
||||||
|
|
|
@ -57,7 +57,7 @@ volatile static unsigned long step_events_completed; // The number of step event
|
||||||
static long advance_rate, advance, final_advance = 0;
|
static long advance_rate, advance, final_advance = 0;
|
||||||
static long old_advance = 0;
|
static long old_advance = 0;
|
||||||
#endif
|
#endif
|
||||||
static long e_steps;
|
static long e_steps[3];
|
||||||
static unsigned char busy = false; // TRUE when SIG_OUTPUT_COMPARE1A is being serviced. Used to avoid retriggering that handler.
|
static unsigned char busy = false; // TRUE when SIG_OUTPUT_COMPARE1A is being serviced. Used to avoid retriggering that handler.
|
||||||
static long acceleration_time, deceleration_time;
|
static long acceleration_time, deceleration_time;
|
||||||
//static unsigned long accelerate_until, decelerate_after, acceleration_rate, initial_rate, final_rate, nominal_rate;
|
//static unsigned long accelerate_until, decelerate_after, acceleration_rate, initial_rate, final_rate, nominal_rate;
|
||||||
|
@ -266,7 +266,7 @@ FORCE_INLINE void trapezoid_generator_reset() {
|
||||||
advance = current_block->initial_advance;
|
advance = current_block->initial_advance;
|
||||||
final_advance = current_block->final_advance;
|
final_advance = current_block->final_advance;
|
||||||
// Do E steps + advance steps
|
// Do E steps + advance steps
|
||||||
e_steps += ((advance >>8) - old_advance);
|
e_steps[current_block->active_extruder] += ((advance >>8) - old_advance);
|
||||||
old_advance = advance >>8;
|
old_advance = advance >>8;
|
||||||
#endif
|
#endif
|
||||||
deceleration_time = 0;
|
deceleration_time = 0;
|
||||||
|
@ -303,8 +303,8 @@ ISR(TIMER1_COMPA_vect)
|
||||||
counter_z = counter_x;
|
counter_z = counter_x;
|
||||||
counter_e = counter_x;
|
counter_e = counter_x;
|
||||||
step_events_completed = 0;
|
step_events_completed = 0;
|
||||||
// #ifdef ADVANCE
|
// #ifdef ADVANCE
|
||||||
e_steps = 0;
|
// e_steps[current_block->active_extruder] = 0;
|
||||||
// #endif
|
// #endif
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -418,11 +418,11 @@ ISR(TIMER1_COMPA_vect)
|
||||||
|
|
||||||
#ifndef ADVANCE
|
#ifndef ADVANCE
|
||||||
if ((out_bits & (1<<E_AXIS)) != 0) { // -direction
|
if ((out_bits & (1<<E_AXIS)) != 0) { // -direction
|
||||||
NORM_E_DIR();
|
REV_E_DIR();
|
||||||
count_direction[E_AXIS]=-1;
|
count_direction[E_AXIS]=-1;
|
||||||
}
|
}
|
||||||
else { // +direction
|
else { // +direction
|
||||||
REV_E_DIR();
|
NORM_E_DIR();
|
||||||
count_direction[E_AXIS]=-1;
|
count_direction[E_AXIS]=-1;
|
||||||
}
|
}
|
||||||
#endif //!ADVANCE
|
#endif //!ADVANCE
|
||||||
|
@ -437,10 +437,10 @@ ISR(TIMER1_COMPA_vect)
|
||||||
if (counter_e > 0) {
|
if (counter_e > 0) {
|
||||||
counter_e -= current_block->step_event_count;
|
counter_e -= current_block->step_event_count;
|
||||||
if ((out_bits & (1<<E_AXIS)) != 0) { // - direction
|
if ((out_bits & (1<<E_AXIS)) != 0) { // - direction
|
||||||
e_steps--;
|
e_steps[current_block->active_extruder]--;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
e_steps++;
|
e_steps[current_block->active_extruder]++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif //ADVANCE
|
#endif //ADVANCE
|
||||||
|
@ -503,7 +503,7 @@ ISR(TIMER1_COMPA_vect)
|
||||||
}
|
}
|
||||||
//if(advance > current_block->advance) advance = current_block->advance;
|
//if(advance > current_block->advance) advance = current_block->advance;
|
||||||
// Do E steps + advance steps
|
// Do E steps + advance steps
|
||||||
e_steps += ((advance >>8) - old_advance);
|
e_steps[current_block->active_extruder] += ((advance >>8) - old_advance);
|
||||||
old_advance = advance >>8;
|
old_advance = advance >>8;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -532,7 +532,7 @@ ISR(TIMER1_COMPA_vect)
|
||||||
}
|
}
|
||||||
if(advance < final_advance) advance = final_advance;
|
if(advance < final_advance) advance = final_advance;
|
||||||
// Do E steps + advance steps
|
// Do E steps + advance steps
|
||||||
e_steps += ((advance >>8) - old_advance);
|
e_steps[current_block->active_extruder] += ((advance >>8) - old_advance);
|
||||||
old_advance = advance >>8;
|
old_advance = advance >>8;
|
||||||
#endif //ADVANCE
|
#endif //ADVANCE
|
||||||
}
|
}
|
||||||
|
@ -557,20 +557,50 @@ ISR(TIMER1_COMPA_vect)
|
||||||
old_OCR0A += 52; // ~10kHz interrupt (250000 / 26 = 9615kHz)
|
old_OCR0A += 52; // ~10kHz interrupt (250000 / 26 = 9615kHz)
|
||||||
OCR0A = old_OCR0A;
|
OCR0A = old_OCR0A;
|
||||||
// Set E direction (Depends on E direction + advance)
|
// Set E direction (Depends on E direction + advance)
|
||||||
for(unsigned char i=0; i<4;) {
|
for(unsigned char i=0; i<4;i++) {
|
||||||
WRITE_E_STEP(LOW);
|
if (e_steps[0] != 0) {
|
||||||
if (e_steps == 0) break;
|
WRITE(E0_STEP_PIN, LOW);
|
||||||
i++;
|
if (e_steps[0] < 0) {
|
||||||
if (e_steps < 0) {
|
WRITE(E0_DIR_PIN, INVERT_E0_DIR);
|
||||||
WRITE_E_DIR(INVERT_E_DIR);
|
e_steps[0]++;
|
||||||
e_steps++;
|
WRITE(E0_STEP_PIN, HIGH);
|
||||||
WRITE_E_STEP(HIGH);
|
}
|
||||||
}
|
else if (e_steps[0] > 0) {
|
||||||
else if (e_steps > 0) {
|
WRITE(E0_DIR_PIN, !INVERT_E0_DIR);
|
||||||
WRITE_E_DIR(!INVERT_E_DIR);
|
e_steps[0]--;
|
||||||
e_steps--;
|
WRITE(E0_STEP_PIN, HIGH);
|
||||||
WRITE_E_STEP(HIGH);
|
}
|
||||||
}
|
}
|
||||||
|
#if EXTRUDERS > 1
|
||||||
|
if (e_steps[1] != 0) {
|
||||||
|
WRITE(E1_STEP_PIN, LOW);
|
||||||
|
if (e_steps[1] < 0) {
|
||||||
|
WRITE(E1_DIR_PIN, INVERT_E1_DIR);
|
||||||
|
e_steps[1]++;
|
||||||
|
WRITE(E1_STEP_PIN, HIGH);
|
||||||
|
}
|
||||||
|
else if (e_steps[1] > 0) {
|
||||||
|
WRITE(E1_DIR_PIN, !INVERT_E1_DIR);
|
||||||
|
e_steps[1]--;
|
||||||
|
WRITE(E1_STEP_PIN, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if EXTRUDERS > 2
|
||||||
|
if (e_steps[2] != 0) {
|
||||||
|
WRITE(E2_STEP_PIN, LOW);
|
||||||
|
if (e_steps[2] < 0) {
|
||||||
|
WRITE(E2_DIR_PIN, INVERT_E2_DIR);
|
||||||
|
e_steps[2]++;
|
||||||
|
WRITE(E2_STEP_PIN, HIGH);
|
||||||
|
}
|
||||||
|
else if (e_steps[2] > 0) {
|
||||||
|
WRITE(E2_DIR_PIN, !INVERT_E2_DIR);
|
||||||
|
e_steps[2]--;
|
||||||
|
WRITE(E2_STEP_PIN, HIGH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // ADVANCE
|
#endif // ADVANCE
|
||||||
|
@ -712,7 +742,9 @@ void st_init()
|
||||||
TCCR0A &= ~(1<<WGM01);
|
TCCR0A &= ~(1<<WGM01);
|
||||||
TCCR0A &= ~(1<<WGM00);
|
TCCR0A &= ~(1<<WGM00);
|
||||||
#endif
|
#endif
|
||||||
e_steps = 0;
|
e_steps[0] = 0;
|
||||||
|
e_steps[1] = 0;
|
||||||
|
e_steps[2] = 0;
|
||||||
TIMSK0 |= (1<<OCIE0A);
|
TIMSK0 |= (1<<OCIE0A);
|
||||||
#endif //ADVANCE
|
#endif //ADVANCE
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,21 @@
|
||||||
|
|
||||||
#include "planner.h"
|
#include "planner.h"
|
||||||
|
|
||||||
|
#if EXTRUDERS > 2
|
||||||
|
#define WRITE_E_STEP(v) { if(current_block->active_extruder == 2) { WRITE(E2_STEP_PIN, v); } else { if(current_block->active_extruder == 1) { WRITE(E1_STEP_PIN, v); } else { WRITE(E0_STEP_PIN, v); }}}
|
||||||
|
#define NORM_E_DIR() { if(current_block->active_extruder == 2) { WRITE(!E2_DIR_PIN, INVERT_E2_DIR); } else { if(current_block->active_extruder == 1) { WRITE(!E1_DIR_PIN, INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, !INVERT_E0_DIR); }}}
|
||||||
|
#define REV_E_DIR() { if(current_block->active_extruder == 2) { WRITE(E2_DIR_PIN, INVERT_E2_DIR); } else { if(current_block->active_extruder == 1) { WRITE(E1_DIR_PIN, INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, INVERT_E0_DIR); }}}
|
||||||
|
#elif EXTRUDERS > 1
|
||||||
|
#define WRITE_E_STEP(v) { if(current_block->active_extruder == 1) { WRITE(E1_STEP_PIN, v); } else { WRITE(E0_STEP_PIN, v); }}
|
||||||
|
#define NORM_E_DIR() { if(current_block->active_extruder == 1) { WRITE(E1_DIR_PIN, !INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, !INVERT_E0_DIR); }}
|
||||||
|
#define REV_E_DIR() { if(current_block->active_extruder == 1) { WRITE(E1_DIR_PIN, INVERT_E1_DIR); } else { WRITE(E0_DIR_PIN, INVERT_E0_DIR); }}
|
||||||
|
#else
|
||||||
|
#define WRITE_E_STEP(v) WRITE(E0_STEP_PIN, v)
|
||||||
|
#define NORM_E_DIR() WRITE(E0_DIR_PIN, !INVERT_E0_DIR)
|
||||||
|
#define REV_E_DIR() WRITE(E0_DIR_PIN, INVERT_E0_DIR)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// Initialize and start the stepper motor subsystem
|
// Initialize and start the stepper motor subsystem
|
||||||
void st_init();
|
void st_init();
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,6 @@
|
||||||
It has preliminary support for Matthew Roberts advance algorithm
|
It has preliminary support for Matthew Roberts advance algorithm
|
||||||
http://reprap.org/pipermail/reprap-dev/2011-May/003323.html
|
http://reprap.org/pipermail/reprap-dev/2011-May/003323.html
|
||||||
|
|
||||||
This firmware is optimized for gen6 electronics.
|
|
||||||
*/
|
*/
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
|
@ -82,6 +81,7 @@ static unsigned long previous_millis_bed_heater;
|
||||||
// static float pid_output[EXTRUDERS];
|
// static float pid_output[EXTRUDERS];
|
||||||
static bool pid_reset[EXTRUDERS];
|
static bool pid_reset[EXTRUDERS];
|
||||||
#endif //PIDTEMP
|
#endif //PIDTEMP
|
||||||
|
static unsigned char soft_pwm[EXTRUDERS];
|
||||||
|
|
||||||
#ifdef WATCHPERIOD
|
#ifdef WATCHPERIOD
|
||||||
static int watch_raw[EXTRUDERS] = { -1000 }; // the first value used for all
|
static int watch_raw[EXTRUDERS] = { -1000 }; // the first value used for all
|
||||||
|
@ -140,6 +140,10 @@ void updatePID()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int getHeaterPower(int heater) {
|
||||||
|
return soft_pwm[heater];
|
||||||
|
}
|
||||||
|
|
||||||
void manage_heater()
|
void manage_heater()
|
||||||
{
|
{
|
||||||
#ifdef USE_WATCHDOG
|
#ifdef USE_WATCHDOG
|
||||||
|
@ -198,15 +202,16 @@ void manage_heater()
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Check if temperature is within the correct range
|
// Check if temperature is within the correct range
|
||||||
if((current_raw[e] > minttemp[e]) && (current_raw[e] < maxttemp[e]))
|
if((current_raw[e] > minttemp[e]) && (current_raw[e] < maxttemp[e]))
|
||||||
{
|
{
|
||||||
analogWrite(heater_pin_map[e], pid_output);
|
//analogWrite(heater_pin_map[e], pid_output);
|
||||||
}
|
soft_pwm[e] = (int)pid_output >> 1;
|
||||||
else {
|
}
|
||||||
analogWrite(heater_pin_map[e], 0);
|
else {
|
||||||
}
|
//analogWrite(heater_pin_map[e], 0);
|
||||||
|
soft_pwm[e] = 0;
|
||||||
|
}
|
||||||
} // End extruder for loop
|
} // End extruder for loop
|
||||||
|
|
||||||
if(millis() - previous_millis_bed_heater < BED_CHECK_INTERVAL)
|
if(millis() - previous_millis_bed_heater < BED_CHECK_INTERVAL)
|
||||||
|
@ -418,7 +423,6 @@ void tp_init()
|
||||||
DIDR0 |= 1 << TEMP_0_PIN;
|
DIDR0 |= 1 << TEMP_0_PIN;
|
||||||
#else
|
#else
|
||||||
DIDR2 |= 1<<(TEMP_0_PIN - 8);
|
DIDR2 |= 1<<(TEMP_0_PIN - 8);
|
||||||
ADCSRB = 1<<MUX5;
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if (TEMP_1_PIN > -1)
|
#if (TEMP_1_PIN > -1)
|
||||||
|
@ -426,7 +430,6 @@ void tp_init()
|
||||||
DIDR0 |= 1<<TEMP_1_PIN;
|
DIDR0 |= 1<<TEMP_1_PIN;
|
||||||
#else
|
#else
|
||||||
DIDR2 |= 1<<(TEMP_1_PIN - 8);
|
DIDR2 |= 1<<(TEMP_1_PIN - 8);
|
||||||
ADCSRB = 1<<MUX5;
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if (TEMP_2_PIN > -1)
|
#if (TEMP_2_PIN > -1)
|
||||||
|
@ -434,7 +437,6 @@ void tp_init()
|
||||||
DIDR0 |= 1 << TEMP_2_PIN;
|
DIDR0 |= 1 << TEMP_2_PIN;
|
||||||
#else
|
#else
|
||||||
DIDR2 = 1<<(TEMP_2_PIN - 8);
|
DIDR2 = 1<<(TEMP_2_PIN - 8);
|
||||||
ADCSRB = 1<<MUX5;
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#if (TEMP_BED_PIN > -1)
|
#if (TEMP_BED_PIN > -1)
|
||||||
|
@ -442,7 +444,6 @@ void tp_init()
|
||||||
DIDR0 |= 1<<TEMP_BED_PIN;
|
DIDR0 |= 1<<TEMP_BED_PIN;
|
||||||
#else
|
#else
|
||||||
DIDR2 |= 1<<(TEMP_BED_PIN - 8);
|
DIDR2 |= 1<<(TEMP_BED_PIN - 8);
|
||||||
ADCSRB = 1<<MUX5;
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -506,6 +507,7 @@ void disable_heater()
|
||||||
{
|
{
|
||||||
#if TEMP_0_PIN > -1
|
#if TEMP_0_PIN > -1
|
||||||
target_raw[0]=0;
|
target_raw[0]=0;
|
||||||
|
soft_pwm[0]=0;
|
||||||
#if HEATER_0_PIN > -1
|
#if HEATER_0_PIN > -1
|
||||||
digitalWrite(HEATER_0_PIN,LOW);
|
digitalWrite(HEATER_0_PIN,LOW);
|
||||||
#endif
|
#endif
|
||||||
|
@ -513,6 +515,7 @@ void disable_heater()
|
||||||
|
|
||||||
#if TEMP_1_PIN > -1
|
#if TEMP_1_PIN > -1
|
||||||
target_raw[1]=0;
|
target_raw[1]=0;
|
||||||
|
soft_pwm[1]=0;
|
||||||
#if HEATER_1_PIN > -1
|
#if HEATER_1_PIN > -1
|
||||||
digitalWrite(HEATER_1_PIN,LOW);
|
digitalWrite(HEATER_1_PIN,LOW);
|
||||||
#endif
|
#endif
|
||||||
|
@ -520,6 +523,7 @@ void disable_heater()
|
||||||
|
|
||||||
#if TEMP_2_PIN > -1
|
#if TEMP_2_PIN > -1
|
||||||
target_raw[2]=0;
|
target_raw[2]=0;
|
||||||
|
soft_pwm[2]=0;
|
||||||
#if HEATER_2_PIN > -1
|
#if HEATER_2_PIN > -1
|
||||||
digitalWrite(HEATER_2_PIN,LOW);
|
digitalWrite(HEATER_2_PIN,LOW);
|
||||||
#endif
|
#endif
|
||||||
|
@ -533,6 +537,26 @@ void disable_heater()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void max_temp_error(uint8_t e) {
|
||||||
|
digitalWrite(heater_pin_map[e], 0);
|
||||||
|
SERIAL_ERROR_START;
|
||||||
|
SERIAL_ERRORLN(e);
|
||||||
|
SERIAL_ERRORLNPGM(": Extruder switched off. MAXTEMP triggered !");
|
||||||
|
}
|
||||||
|
|
||||||
|
void min_temp_error(uint8_t e) {
|
||||||
|
digitalWrite(heater_pin_map[e], 0);
|
||||||
|
SERIAL_ERROR_START;
|
||||||
|
SERIAL_ERRORLN(e);
|
||||||
|
SERIAL_ERRORLNPGM(": Extruder switched off. MINTEMP triggered !");
|
||||||
|
}
|
||||||
|
|
||||||
|
void bed_max_temp_error(void) {
|
||||||
|
digitalWrite(HEATER_BED_PIN, 0);
|
||||||
|
SERIAL_ERROR_START;
|
||||||
|
SERIAL_ERRORLNPGM("Temperature heated bed switched off. MAXTEMP triggered !!");
|
||||||
|
}
|
||||||
|
|
||||||
// Timer 0 is shared with millies
|
// Timer 0 is shared with millies
|
||||||
ISR(TIMER0_COMPB_vect)
|
ISR(TIMER0_COMPB_vect)
|
||||||
{
|
{
|
||||||
|
@ -543,6 +567,33 @@ ISR(TIMER0_COMPB_vect)
|
||||||
static unsigned long raw_temp_2_value = 0;
|
static unsigned long raw_temp_2_value = 0;
|
||||||
static unsigned long raw_temp_bed_value = 0;
|
static unsigned long raw_temp_bed_value = 0;
|
||||||
static unsigned char temp_state = 0;
|
static unsigned char temp_state = 0;
|
||||||
|
static unsigned char pwm_count = 1;
|
||||||
|
static unsigned char soft_pwm_0;
|
||||||
|
static unsigned char soft_pwm_1;
|
||||||
|
static unsigned char soft_pwm_2;
|
||||||
|
|
||||||
|
if(pwm_count == 0){
|
||||||
|
soft_pwm_0 = soft_pwm[0];
|
||||||
|
if(soft_pwm_0 > 0) WRITE(HEATER_0_PIN,1);
|
||||||
|
#if EXTRUDERS > 1
|
||||||
|
soft_pwm_1 = soft_pwm[1];
|
||||||
|
if(soft_pwm_1 > 0) WRITE(HEATER_1_PIN,1);
|
||||||
|
#endif
|
||||||
|
#if EXTRUDERS > 2
|
||||||
|
soft_pwm_2 = soft_pwm[2];
|
||||||
|
if(soft_pwm_2 > 0) WRITE(HEATER_2_PIN,1);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if(soft_pwm_0 <= pwm_count) WRITE(HEATER_0_PIN,0);
|
||||||
|
#if EXTRUDERS > 1
|
||||||
|
if(soft_pwm_1 <= pwm_count) WRITE(HEATER_1_PIN,0);
|
||||||
|
#endif
|
||||||
|
#if EXTRUDERS > 2
|
||||||
|
if(soft_pwm_2 <= pwm_count) WRITE(HEATER_2_PIN,0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
pwm_count++;
|
||||||
|
pwm_count &= 0x7f;
|
||||||
|
|
||||||
switch(temp_state) {
|
switch(temp_state) {
|
||||||
case 0: // Prepare TEMP_0
|
case 0: // Prepare TEMP_0
|
||||||
|
@ -628,10 +679,10 @@ ISR(TIMER0_COMPB_vect)
|
||||||
temp_state = 0;
|
temp_state = 0;
|
||||||
temp_count++;
|
temp_count++;
|
||||||
break;
|
break;
|
||||||
default:
|
// default:
|
||||||
SERIAL_ERROR_START;
|
// SERIAL_ERROR_START;
|
||||||
SERIAL_ERRORLNPGM("Temp measurement error!");
|
// SERIAL_ERRORLNPGM("Temp measurement error!");
|
||||||
break;
|
// break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(temp_count >= 16) // 8 ms * 16 = 128ms.
|
if(temp_count >= 16) // 8 ms * 16 = 128ms.
|
||||||
|
@ -671,21 +722,15 @@ ISR(TIMER0_COMPB_vect)
|
||||||
raw_temp_2_value = 0;
|
raw_temp_2_value = 0;
|
||||||
raw_temp_bed_value = 0;
|
raw_temp_bed_value = 0;
|
||||||
|
|
||||||
for(int e = 0; e < EXTRUDERS; e++) {
|
for(unsigned char e = 0; e < EXTRUDERS; e++) {
|
||||||
if(current_raw[e] >= maxttemp[e]) {
|
if(current_raw[e] >= maxttemp[e]) {
|
||||||
target_raw[e] = 0;
|
target_raw[e] = 0;
|
||||||
digitalWrite(heater_pin_map[e], 0);
|
max_temp_error(e);
|
||||||
SERIAL_ERROR_START;
|
kill();;
|
||||||
SERIAL_ERRORLN((int)e);
|
|
||||||
SERIAL_ERRORLNPGM(": Extruder switched off. MAXTEMP triggered !");
|
|
||||||
kill();
|
|
||||||
}
|
}
|
||||||
if(current_raw[e] <= minttemp[e]) {
|
if(current_raw[e] <= minttemp[e]) {
|
||||||
target_raw[e] = 0;
|
target_raw[e] = 0;
|
||||||
digitalWrite(heater_pin_map[e], 0);
|
min_temp_error(e);
|
||||||
SERIAL_ERROR_START;
|
|
||||||
SERIAL_ERRORLN(e);
|
|
||||||
SERIAL_ERRORLNPGM(": Extruder switched off. MINTEMP triggered !");
|
|
||||||
kill();
|
kill();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -693,9 +738,7 @@ ISR(TIMER0_COMPB_vect)
|
||||||
#if defined(BED_MAXTEMP) && (HEATER_BED_PIN > -1)
|
#if defined(BED_MAXTEMP) && (HEATER_BED_PIN > -1)
|
||||||
if(current_raw_bed >= bed_maxttemp) {
|
if(current_raw_bed >= bed_maxttemp) {
|
||||||
target_raw_bed = 0;
|
target_raw_bed = 0;
|
||||||
digitalWrite(HEATER_BED_PIN, 0);
|
bed_max_temp_error();
|
||||||
SERIAL_ERROR_START;
|
|
||||||
SERIAL_ERRORLNPGM("Temperature heated bed switched off. MAXTEMP triggered !!");
|
|
||||||
kill();
|
kill();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,143 +1,144 @@
|
||||||
/*
|
/*
|
||||||
temperature.h - temperature controller
|
temperature.h - temperature controller
|
||||||
Part of Marlin
|
Part of Marlin
|
||||||
|
|
||||||
Copyright (c) 2011 Erik van der Zalm
|
Copyright (c) 2011 Erik van der Zalm
|
||||||
|
|
||||||
Grbl is free software: you can redistribute it and/or modify
|
Grbl is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
(at your option) any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Grbl is distributed in the hope that it will be useful,
|
Grbl is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with Grbl. If not, see <http://www.gnu.org/licenses/>.
|
along with Grbl. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef temperature_h
|
#ifndef temperature_h
|
||||||
#define temperature_h
|
#define temperature_h
|
||||||
|
|
||||||
#include "Marlin.h"
|
#include "Marlin.h"
|
||||||
#include "fastio.h"
|
#include "fastio.h"
|
||||||
#ifdef PID_ADD_EXTRUSION_RATE
|
#ifdef PID_ADD_EXTRUSION_RATE
|
||||||
#include "stepper.h"
|
#include "stepper.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// public functions
|
// public functions
|
||||||
void tp_init(); //initialise the heating
|
void tp_init(); //initialise the heating
|
||||||
void manage_heater(); //it is critical that this is called periodically.
|
void manage_heater(); //it is critical that this is called periodically.
|
||||||
|
|
||||||
//low leven conversion routines
|
//low leven conversion routines
|
||||||
// do not use this routines and variables outsie of temperature.cpp
|
// do not use this routines and variables outsie of temperature.cpp
|
||||||
int temp2analog(int celsius, uint8_t e);
|
int temp2analog(int celsius, uint8_t e);
|
||||||
int temp2analogBed(int celsius);
|
int temp2analogBed(int celsius);
|
||||||
float analog2temp(int raw, uint8_t e);
|
float analog2temp(int raw, uint8_t e);
|
||||||
float analog2tempBed(int raw);
|
float analog2tempBed(int raw);
|
||||||
extern int target_raw[EXTRUDERS];
|
extern int target_raw[EXTRUDERS];
|
||||||
extern int heatingtarget_raw[EXTRUDERS];
|
extern int heatingtarget_raw[EXTRUDERS];
|
||||||
extern int current_raw[EXTRUDERS];
|
extern int current_raw[EXTRUDERS];
|
||||||
extern int target_raw_bed;
|
extern int target_raw_bed;
|
||||||
extern int current_raw_bed;
|
extern int current_raw_bed;
|
||||||
extern float Kp,Ki,Kd,Kc;
|
extern float Kp,Ki,Kd,Kc;
|
||||||
|
|
||||||
#ifdef PIDTEMP
|
#ifdef PIDTEMP
|
||||||
extern float pid_setpoint[EXTRUDERS];
|
extern float pid_setpoint[EXTRUDERS];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef WATCHPERIOD
|
#ifdef WATCHPERIOD
|
||||||
extern int watch_raw[EXTRUDERS] ;
|
extern int watch_raw[EXTRUDERS] ;
|
||||||
extern unsigned long watchmillis;
|
extern unsigned long watchmillis;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
//high level conversion routines, for use outside of temperature.cpp
|
//high level conversion routines, for use outside of temperature.cpp
|
||||||
//inline so that there is no performance decrease.
|
//inline so that there is no performance decrease.
|
||||||
//deg=degreeCelsius
|
//deg=degreeCelsius
|
||||||
|
|
||||||
FORCE_INLINE float degHotend(uint8_t extruder) {
|
FORCE_INLINE float degHotend(uint8_t extruder) {
|
||||||
return analog2temp(current_raw[extruder], extruder);
|
return analog2temp(current_raw[extruder], extruder);
|
||||||
};
|
};
|
||||||
|
|
||||||
FORCE_INLINE float degBed() {
|
FORCE_INLINE float degBed() {
|
||||||
return analog2tempBed(current_raw_bed);
|
return analog2tempBed(current_raw_bed);
|
||||||
};
|
};
|
||||||
|
|
||||||
FORCE_INLINE float degTargetHotend(uint8_t extruder) {
|
FORCE_INLINE float degTargetHotend(uint8_t extruder) {
|
||||||
return analog2temp(target_raw[extruder], extruder);
|
return analog2temp(target_raw[extruder], extruder);
|
||||||
};
|
};
|
||||||
|
|
||||||
FORCE_INLINE float degTargetBed() {
|
FORCE_INLINE float degTargetBed() {
|
||||||
return analog2tempBed(target_raw_bed);
|
return analog2tempBed(target_raw_bed);
|
||||||
};
|
};
|
||||||
|
|
||||||
FORCE_INLINE void setTargetHotend(const float &celsius, uint8_t extruder) {
|
FORCE_INLINE void setTargetHotend(const float &celsius, uint8_t extruder) {
|
||||||
target_raw[extruder] = temp2analog(celsius, extruder);
|
target_raw[extruder] = temp2analog(celsius, extruder);
|
||||||
#ifdef PIDTEMP
|
#ifdef PIDTEMP
|
||||||
pid_setpoint[extruder] = celsius;
|
pid_setpoint[extruder] = celsius;
|
||||||
#endif //PIDTEMP
|
#endif //PIDTEMP
|
||||||
};
|
};
|
||||||
|
|
||||||
FORCE_INLINE void setTargetBed(const float &celsius) {
|
FORCE_INLINE void setTargetBed(const float &celsius) {
|
||||||
target_raw_bed = temp2analogBed(celsius);
|
target_raw_bed = temp2analogBed(celsius);
|
||||||
};
|
};
|
||||||
|
|
||||||
FORCE_INLINE bool isHeatingHotend(uint8_t extruder){
|
FORCE_INLINE bool isHeatingHotend(uint8_t extruder){
|
||||||
return target_raw[extruder] > current_raw[extruder];
|
return target_raw[extruder] > current_raw[extruder];
|
||||||
};
|
};
|
||||||
|
|
||||||
FORCE_INLINE bool isHeatingBed() {
|
FORCE_INLINE bool isHeatingBed() {
|
||||||
return target_raw_bed > current_raw_bed;
|
return target_raw_bed > current_raw_bed;
|
||||||
};
|
};
|
||||||
|
|
||||||
FORCE_INLINE bool isCoolingHotend(uint8_t extruder) {
|
FORCE_INLINE bool isCoolingHotend(uint8_t extruder) {
|
||||||
return target_raw[extruder] < current_raw[extruder];
|
return target_raw[extruder] < current_raw[extruder];
|
||||||
};
|
};
|
||||||
|
|
||||||
FORCE_INLINE bool isCoolingBed() {
|
FORCE_INLINE bool isCoolingBed() {
|
||||||
return target_raw_bed < current_raw_bed;
|
return target_raw_bed < current_raw_bed;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define degHotend0() degHotend(0)
|
#define degHotend0() degHotend(0)
|
||||||
#define degTargetHotend0() degTargetHotend(0)
|
#define degTargetHotend0() degTargetHotend(0)
|
||||||
#define setTargetHotend0(_celsius) setTargetHotend((_celsius), 0)
|
#define setTargetHotend0(_celsius) setTargetHotend((_celsius), 0)
|
||||||
#define isHeatingHotend0() isHeatingHotend(0)
|
#define isHeatingHotend0() isHeatingHotend(0)
|
||||||
#define isCoolingHotend0() isCoolingHotend(0)
|
#define isCoolingHotend0() isCoolingHotend(0)
|
||||||
#if EXTRUDERS > 1
|
#if EXTRUDERS > 1
|
||||||
#define degHotend1() degHotend(1)
|
#define degHotend1() degHotend(1)
|
||||||
#define degTargetHotend1() degTargetHotend(1)
|
#define degTargetHotend1() degTargetHotend(1)
|
||||||
#define setTargetHotend1(_celsius) setTargetHotend((_celsius), 1)
|
#define setTargetHotend1(_celsius) setTargetHotend((_celsius), 1)
|
||||||
#define isHeatingHotend1() isHeatingHotend(1)
|
#define isHeatingHotend1() isHeatingHotend(1)
|
||||||
#define isCoolingHotend1() isCoolingHotend(1)
|
#define isCoolingHotend1() isCoolingHotend(1)
|
||||||
#endif
|
#endif
|
||||||
#if EXTRUDERS > 2
|
#if EXTRUDERS > 2
|
||||||
#define degHotend2() degHotend(2)
|
#define degHotend2() degHotend(2)
|
||||||
#define degTargetHotend2() degTargetHotend(2)
|
#define degTargetHotend2() degTargetHotend(2)
|
||||||
#define setTargetHotend2(_celsius) setTargetHotend((_celsius), 2)
|
#define setTargetHotend2(_celsius) setTargetHotend((_celsius), 2)
|
||||||
#define isHeatingHotend2() isHeatingHotend(2)
|
#define isHeatingHotend2() isHeatingHotend(2)
|
||||||
#define isCoolingHotend2() isCoolingHotend(2)
|
#define isCoolingHotend2() isCoolingHotend(2)
|
||||||
#endif
|
#endif
|
||||||
#if EXTRUDERS > 3
|
#if EXTRUDERS > 3
|
||||||
#error Invalid number of extruders
|
#error Invalid number of extruders
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
FORCE_INLINE void autotempShutdown(){
|
FORCE_INLINE void autotempShutdown(){
|
||||||
#ifdef AUTOTEMP
|
#ifdef AUTOTEMP
|
||||||
if(autotemp_enabled)
|
if(autotemp_enabled)
|
||||||
{
|
{
|
||||||
autotemp_enabled=false;
|
autotemp_enabled=false;
|
||||||
if(degTargetHotend(ACTIVE_EXTRUDER)>autotemp_min)
|
if(degTargetHotend(ACTIVE_EXTRUDER)>autotemp_min)
|
||||||
setTargetHotend(0,ACTIVE_EXTRUDER);
|
setTargetHotend(0,ACTIVE_EXTRUDER);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void disable_heater();
|
int getHeaterPower(int heater);
|
||||||
void setWatch();
|
void disable_heater();
|
||||||
void updatePID();
|
void setWatch();
|
||||||
|
void updatePID();
|
||||||
#endif
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
3680
Marlin/ultralcd.pde
3680
Marlin/ultralcd.pde
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue