Option to disable all volumetric extrusion

This commit is contained in:
Scott Lahteine 2017-12-19 19:44:11 -06:00
parent 31e33d2acd
commit 933f76fda3
8 changed files with 194 additions and 136 deletions

View file

@ -1365,13 +1365,20 @@
#define EXTENDED_CAPABILITIES_REPORT #define EXTENDED_CAPABILITIES_REPORT
/** /**
* Volumetric extrusion default state * Disable all Volumetric extrusion options
* Activate to make volumetric extrusion the default method,
* with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter.
*
* M200 D0 to disable, M200 Dn to set a new diameter.
*/ */
//#define VOLUMETRIC_DEFAULT_ON //#define NO_VOLUMETRICS
#if DISABLED(NO_VOLUMETRICS)
/**
* Volumetric extrusion default state
* Activate to make volumetric extrusion the default method,
* with DEFAULT_NOMINAL_FILAMENT_DIA as the default diameter.
*
* M200 D0 to disable, M200 Dn to set a new diameter.
*/
//#define VOLUMETRIC_DEFAULT_ON
#endif
/** /**
* Enable this option for a leaner build of Marlin that removes all * Enable this option for a leaner build of Marlin that removes all

View file

@ -24,25 +24,29 @@
#include "../../Marlin.h" #include "../../Marlin.h"
#include "../../module/planner.h" #include "../../module/planner.h"
/** #if DISABLED(NO_VOLUMETRICS)
* M200: Set filament diameter and set E axis units to cubic units
*
* T<extruder> - Optional extruder number. Current extruder if omitted.
* D<linear> - Diameter of the filament. Use "D0" to switch back to linear units on the E axis.
*/
void GcodeSuite::M200() {
if (get_target_extruder_from_command()) return; /**
* M200: Set filament diameter and set E axis units to cubic units
*
* T<extruder> - Optional extruder number. Current extruder if omitted.
* D<linear> - Diameter of the filament. Use "D0" to switch back to linear units on the E axis.
*/
void GcodeSuite::M200() {
if (parser.seen('D')) { if (get_target_extruder_from_command()) return;
// setting any extruder filament size disables volumetric on the assumption that
// slicers either generate in extruder values as cubic mm or as as filament feeds if (parser.seen('D')) {
// for all extruders // setting any extruder filament size disables volumetric on the assumption that
if ( (parser.volumetric_enabled = (parser.value_linear_units() != 0.0)) ) // slicers either generate in extruder values as cubic mm or as as filament feeds
planner.set_filament_size(target_extruder, parser.value_linear_units()); // for all extruders
if ( (parser.volumetric_enabled = (parser.value_linear_units() != 0.0)) )
planner.set_filament_size(target_extruder, parser.value_linear_units());
}
planner.calculate_volumetric_multipliers();
} }
planner.calculate_volumetric_multipliers();
} #endif // !NO_VOLUMETRICS
/** /**
* M201: Set max acceleration in units/s^2 for print moves (M201 X1000 Y1000) * M201: Set max acceleration in units/s^2 for print moves (M201 X1000 Y1000)

View file

@ -465,9 +465,9 @@ void GcodeSuite::process_parsed_command() {
#endif #endif
#endif #endif
case 200: // M200: Set filament diameter, E to cubic units #if DISABLED(NO_VOLUMETRICS)
M200(); case 200: M200(); break; // M200: Set filament diameter, E to cubic units
break; #endif
case 201: M201(); break; // M201: Set max acceleration for print moves (units/s^2) case 201: M201(); break; // M201: Set max acceleration for print moves (units/s^2)

View file

@ -894,15 +894,19 @@ static_assert(1 >= 0
*/ */
#if ENABLED(DISABLE_X) || ENABLED(DISABLE_Y) || ENABLED(DISABLE_Z) #if ENABLED(DISABLE_X) || ENABLED(DISABLE_Y) || ENABLED(DISABLE_Z)
#if ENABLED(HOME_AFTER_DEACTIVATE) || ENABLED(Z_SAFE_HOMING) #if ENABLED(HOME_AFTER_DEACTIVATE) || ENABLED(Z_SAFE_HOMING)
#error "DISABLE_[XYZ] not compatible with HOME_AFTER_DEACTIVATE or Z_SAFE_HOMING." #error "DISABLE_[XYZ] is not compatible with HOME_AFTER_DEACTIVATE or Z_SAFE_HOMING."
#endif #endif
#endif // DISABLE_[XYZ] #endif // DISABLE_[XYZ]
/** /**
* Filament Width Sensor * Filament Width Sensor
*/ */
#if ENABLED(FILAMENT_WIDTH_SENSOR) && !HAS_FILAMENT_WIDTH_SENSOR #if ENABLED(FILAMENT_WIDTH_SENSOR)
#error "FILAMENT_WIDTH_SENSOR requires a FILWIDTH_PIN to be defined." #if !HAS_FILAMENT_WIDTH_SENSOR
#error "FILAMENT_WIDTH_SENSOR requires a FILWIDTH_PIN to be defined."
#elif ENABLED(NO_VOLUMETRICS)
#error "FILAMENT_WIDTH_SENSOR requires NO_VOLUMETRICS to be disabled."
#endif
#endif #endif
/** /**

View file

@ -3636,26 +3636,30 @@ void kill_screen(const char* lcd_msg) {
MENU_ITEM_EDIT(float3, MSG_ADVANCE_K, &planner.extruder_advance_k, 0, 999); MENU_ITEM_EDIT(float3, MSG_ADVANCE_K, &planner.extruder_advance_k, 0, 999);
#endif #endif
MENU_ITEM_EDIT_CALLBACK(bool, MSG_VOLUMETRIC_ENABLED, &parser.volumetric_enabled, planner.calculate_volumetric_multipliers); #if DISABLED(NO_VOLUMETRICS)
if (parser.volumetric_enabled) { MENU_ITEM_EDIT_CALLBACK(bool, MSG_VOLUMETRIC_ENABLED, &parser.volumetric_enabled, planner.calculate_volumetric_multipliers);
#if EXTRUDERS == 1
MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM, &planner.filament_size[0], 1.5, 3.25, planner.calculate_volumetric_multipliers); if (parser.volumetric_enabled) {
#else // EXTRUDERS > 1 #if EXTRUDERS == 1
MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM, &planner.filament_size[active_extruder], 1.5, 3.25, planner.calculate_volumetric_multipliers); MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM, &planner.filament_size[0], 1.5, 3.25, planner.calculate_volumetric_multipliers);
MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E1, &planner.filament_size[0], 1.5, 3.25, planner.calculate_volumetric_multipliers); #else // EXTRUDERS > 1
MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E2, &planner.filament_size[1], 1.5, 3.25, planner.calculate_volumetric_multipliers); MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM, &planner.filament_size[active_extruder], 1.5, 3.25, planner.calculate_volumetric_multipliers);
#if EXTRUDERS > 2 MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E1, &planner.filament_size[0], 1.5, 3.25, planner.calculate_volumetric_multipliers);
MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E3, &planner.filament_size[2], 1.5, 3.25, planner.calculate_volumetric_multipliers); MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E2, &planner.filament_size[1], 1.5, 3.25, planner.calculate_volumetric_multipliers);
#if EXTRUDERS > 3 #if EXTRUDERS > 2
MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E4, &planner.filament_size[3], 1.5, 3.25, planner.calculate_volumetric_multipliers); MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E3, &planner.filament_size[2], 1.5, 3.25, planner.calculate_volumetric_multipliers);
#if EXTRUDERS > 4 #if EXTRUDERS > 3
MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E5, &planner.filament_size[4], 1.5, 3.25, planner.calculate_volumetric_multipliers); MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E4, &planner.filament_size[3], 1.5, 3.25, planner.calculate_volumetric_multipliers);
#endif // EXTRUDERS > 4 #if EXTRUDERS > 4
#endif // EXTRUDERS > 3 MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float43, MSG_FILAMENT_DIAM MSG_DIAM_E5, &planner.filament_size[4], 1.5, 3.25, planner.calculate_volumetric_multipliers);
#endif // EXTRUDERS > 2 #endif // EXTRUDERS > 4
#endif // EXTRUDERS > 1 #endif // EXTRUDERS > 3
} #endif // EXTRUDERS > 2
#endif // EXTRUDERS > 1
}
#endif // !NO_VOLUMETRICS
END_MENU(); END_MENU();
} }

View file

@ -239,7 +239,9 @@ void MarlinSettings::postprocess() {
thermalManager.updatePID(); thermalManager.updatePID();
#endif #endif
planner.calculate_volumetric_multipliers(); #if DISABLED(NO_VOLUMETRICS)
planner.calculate_volumetric_multipliers();
#endif
#if HAS_HOME_OFFSET || ENABLED(DUAL_X_CARRIAGE) #if HAS_HOME_OFFSET || ENABLED(DUAL_X_CARRIAGE)
// Software endstops depend on home_offset // Software endstops depend on home_offset
@ -538,13 +540,20 @@ void MarlinSettings::postprocess() {
EEPROM_WRITE(fwretract.swap_retract_recover_feedrate_mm_s); EEPROM_WRITE(fwretract.swap_retract_recover_feedrate_mm_s);
#endif #endif
EEPROM_WRITE(parser.volumetric_enabled); //
// Volumetric & Filament Size
//
#if DISABLED(NO_VOLUMETRICS)
// Save filament sizes EEPROM_WRITE(parser.volumetric_enabled);
for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
if (q < COUNT(planner.filament_size)) dummy = planner.filament_size[q]; // Save filament sizes
EEPROM_WRITE(dummy); for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
} if (q < COUNT(planner.filament_size)) dummy = planner.filament_size[q];
EEPROM_WRITE(dummy);
}
#endif
// Save TMC2130 or TMC2208 Configuration, and placeholder values // Save TMC2130 or TMC2208 Configuration, and placeholder values
uint16_t val; uint16_t val;
@ -1028,12 +1037,16 @@ void MarlinSettings::postprocess() {
// //
// Volumetric & Filament Size // Volumetric & Filament Size
// //
#if DISABLED(NO_VOLUMETRICS)
EEPROM_READ(parser.volumetric_enabled); EEPROM_READ(parser.volumetric_enabled);
for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
EEPROM_READ(dummy); for (uint8_t q = 0; q < MAX_EXTRUDERS; q++) {
if (q < COUNT(planner.filament_size)) planner.filament_size[q] = dummy; EEPROM_READ(dummy);
} if (q < COUNT(planner.filament_size)) planner.filament_size[q] = dummy;
}
#endif
// //
// TMC2130 Stepper Current // TMC2130 Stepper Current
@ -1484,15 +1497,19 @@ void MarlinSettings::reset() {
fwretract.reset(); fwretract.reset();
#endif #endif
parser.volumetric_enabled = #if DISABLED(NO_VOLUMETRICS)
#if ENABLED(VOLUMETRIC_DEFAULT_ON)
true parser.volumetric_enabled =
#else #if ENABLED(VOLUMETRIC_DEFAULT_ON)
false true
#endif #else
; false
for (uint8_t q = 0; q < COUNT(planner.filament_size); q++) #endif
planner.filament_size[q] = DEFAULT_NOMINAL_FILAMENT_DIA; ;
for (uint8_t q = 0; q < COUNT(planner.filament_size); q++)
planner.filament_size[q] = DEFAULT_NOMINAL_FILAMENT_DIA;
#endif
endstops.enable_globally( endstops.enable_globally(
#if ENABLED(ENDSTOPS_ALWAYS_ON_DEFAULT) #if ENABLED(ENDSTOPS_ALWAYS_ON_DEFAULT)
@ -1630,46 +1647,50 @@ void MarlinSettings::reset() {
SERIAL_EOL(); SERIAL_EOL();
/** #if DISABLED(NO_VOLUMETRICS)
* Volumetric extrusion M200
*/
if (!forReplay) {
CONFIG_ECHO_START;
SERIAL_ECHOPGM("Filament settings:");
if (parser.volumetric_enabled)
SERIAL_EOL();
else
SERIAL_ECHOLNPGM(" Disabled");
}
CONFIG_ECHO_START; /**
SERIAL_ECHOPAIR(" M200 D", LINEAR_UNIT(planner.filament_size[0])); * Volumetric extrusion M200
SERIAL_EOL(); */
#if EXTRUDERS > 1 if (!forReplay) {
CONFIG_ECHO_START;
SERIAL_ECHOPAIR(" M200 T1 D", LINEAR_UNIT(planner.filament_size[1]));
SERIAL_EOL();
#if EXTRUDERS > 2
CONFIG_ECHO_START; CONFIG_ECHO_START;
SERIAL_ECHOPAIR(" M200 T2 D", LINEAR_UNIT(planner.filament_size[2])); SERIAL_ECHOPGM("Filament settings:");
SERIAL_EOL(); if (parser.volumetric_enabled)
#if EXTRUDERS > 3
CONFIG_ECHO_START;
SERIAL_ECHOPAIR(" M200 T3 D", LINEAR_UNIT(planner.filament_size[3]));
SERIAL_EOL(); SERIAL_EOL();
#if EXTRUDERS > 4 else
CONFIG_ECHO_START; SERIAL_ECHOLNPGM(" Disabled");
SERIAL_ECHOPAIR(" M200 T4 D", LINEAR_UNIT(planner.filament_size[4])); }
SERIAL_EOL();
#endif // EXTRUDERS > 4
#endif // EXTRUDERS > 3
#endif // EXTRUDERS > 2
#endif // EXTRUDERS > 1
if (!parser.volumetric_enabled) {
CONFIG_ECHO_START; CONFIG_ECHO_START;
SERIAL_ECHOLNPGM(" M200 D0"); SERIAL_ECHOPAIR(" M200 D", LINEAR_UNIT(planner.filament_size[0]));
} SERIAL_EOL();
#if EXTRUDERS > 1
CONFIG_ECHO_START;
SERIAL_ECHOPAIR(" M200 T1 D", LINEAR_UNIT(planner.filament_size[1]));
SERIAL_EOL();
#if EXTRUDERS > 2
CONFIG_ECHO_START;
SERIAL_ECHOPAIR(" M200 T2 D", LINEAR_UNIT(planner.filament_size[2]));
SERIAL_EOL();
#if EXTRUDERS > 3
CONFIG_ECHO_START;
SERIAL_ECHOPAIR(" M200 T3 D", LINEAR_UNIT(planner.filament_size[3]));
SERIAL_EOL();
#if EXTRUDERS > 4
CONFIG_ECHO_START;
SERIAL_ECHOPAIR(" M200 T4 D", LINEAR_UNIT(planner.filament_size[4]));
SERIAL_EOL();
#endif // EXTRUDERS > 4
#endif // EXTRUDERS > 3
#endif // EXTRUDERS > 2
#endif // EXTRUDERS > 1
if (!parser.volumetric_enabled) {
CONFIG_ECHO_START;
SERIAL_ECHOLNPGM(" M200 D0");
}
#endif // !NO_VOLUMETRICS
if (!forReplay) { if (!forReplay) {
CONFIG_ECHO_START; CONFIG_ECHO_START;

View file

@ -105,10 +105,13 @@ float Planner::max_feedrate_mm_s[XYZE_N], // Max speeds in mm per second
int16_t Planner::flow_percentage[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(100); // Extrusion factor for each extruder int16_t Planner::flow_percentage[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(100); // Extrusion factor for each extruder
float Planner::e_factor[EXTRUDERS], // The flow percentage and volumetric multiplier combine to scale E movement float Planner::e_factor[EXTRUDERS]; // The flow percentage and volumetric multiplier combine to scale E movement
Planner::filament_size[EXTRUDERS], // diameter of filament (in millimeters), typically around 1.75 or 2.85, 0 disables the volumetric calculations for the extruder
Planner::volumetric_area_nominal = CIRCLE_AREA((DEFAULT_NOMINAL_FILAMENT_DIA) * 0.5), // Nominal cross-sectional area #if DISABLED(NO_VOLUMETRICS)
Planner::volumetric_multiplier[EXTRUDERS]; // Reciprocal of cross-sectional area of filament (in mm^2). Pre-calculated to reduce computation in the planner float Planner::filament_size[EXTRUDERS], // diameter of filament (in millimeters), typically around 1.75 or 2.85, 0 disables the volumetric calculations for the extruder
Planner::volumetric_area_nominal = CIRCLE_AREA((DEFAULT_NOMINAL_FILAMENT_DIA) * 0.5), // Nominal cross-sectional area
Planner::volumetric_multiplier[EXTRUDERS]; // Reciprocal of cross-sectional area of filament (in mm^2). Pre-calculated to reduce computation in the planner
#endif
uint32_t Planner::max_acceleration_steps_per_s2[XYZE_N], uint32_t Planner::max_acceleration_steps_per_s2[XYZE_N],
Planner::max_acceleration_mm_per_s2[XYZE_N]; // Use M201 to override by software Planner::max_acceleration_mm_per_s2[XYZE_N]; // Use M201 to override by software
@ -561,25 +564,29 @@ void Planner::check_axes_activity() {
#endif #endif
} }
/** #if DISABLED(NO_VOLUMETRICS)
* Get a volumetric multiplier from a filament diameter.
* This is the reciprocal of the circular cross-section area.
* Return 1.0 with volumetric off or a diameter of 0.0.
*/
inline float calculate_volumetric_multiplier(const float &diameter) {
return (parser.volumetric_enabled && diameter) ? 1.0 / CIRCLE_AREA(diameter * 0.5) : 1.0;
}
/** /**
* Convert the filament sizes into volumetric multipliers. * Get a volumetric multiplier from a filament diameter.
* The multiplier converts a given E value into a length. * This is the reciprocal of the circular cross-section area.
*/ * Return 1.0 with volumetric off or a diameter of 0.0.
void Planner::calculate_volumetric_multipliers() { */
for (uint8_t i = 0; i < COUNT(filament_size); i++) { inline float calculate_volumetric_multiplier(const float &diameter) {
volumetric_multiplier[i] = calculate_volumetric_multiplier(filament_size[i]); return (parser.volumetric_enabled && diameter) ? 1.0 / CIRCLE_AREA(diameter * 0.5) : 1.0;
refresh_e_factor(i);
} }
}
/**
* Convert the filament sizes into volumetric multipliers.
* The multiplier converts a given E value into a length.
*/
void Planner::calculate_volumetric_multipliers() {
for (uint8_t i = 0; i < COUNT(filament_size); i++) {
volumetric_multiplier[i] = calculate_volumetric_multiplier(filament_size[i]);
refresh_e_factor(i);
}
}
#endif // !NO_VOLUMETRICS
#if ENABLED(FILAMENT_WIDTH_SENSOR) #if ENABLED(FILAMENT_WIDTH_SENSOR)
/** /**

View file

@ -159,11 +159,14 @@ class Planner {
static int16_t flow_percentage[EXTRUDERS]; // Extrusion factor for each extruder static int16_t flow_percentage[EXTRUDERS]; // Extrusion factor for each extruder
static float e_factor[EXTRUDERS], // The flow percentage and volumetric multiplier combine to scale E movement static float e_factor[EXTRUDERS]; // The flow percentage and volumetric multiplier combine to scale E movement
filament_size[EXTRUDERS], // diameter of filament (in millimeters), typically around 1.75 or 2.85, 0 disables the volumetric calculations for the extruder
volumetric_area_nominal, // Nominal cross-sectional area #if DISABLED(NO_VOLUMETRICS)
volumetric_multiplier[EXTRUDERS]; // Reciprocal of cross-sectional area of filament (in mm^2). Pre-calculated to reduce computation in the planner static float filament_size[EXTRUDERS], // diameter of filament (in millimeters), typically around 1.75 or 2.85, 0 disables the volumetric calculations for the extruder
// May be auto-adjusted by a filament width sensor volumetric_area_nominal, // Nominal cross-sectional area
volumetric_multiplier[EXTRUDERS]; // Reciprocal of cross-sectional area of filament (in mm^2). Pre-calculated to reduce computation in the planner
// May be auto-adjusted by a filament width sensor
#endif
static float max_feedrate_mm_s[XYZE_N], // Max speeds in mm per second static float max_feedrate_mm_s[XYZE_N], // Max speeds in mm per second
axis_steps_per_mm[XYZE_N], axis_steps_per_mm[XYZE_N],
@ -277,7 +280,11 @@ class Planner {
static void refresh_positioning(); static void refresh_positioning();
FORCE_INLINE static void refresh_e_factor(const uint8_t e) { FORCE_INLINE static void refresh_e_factor(const uint8_t e) {
e_factor[e] = volumetric_multiplier[e] * flow_percentage[e] * 0.01; e_factor[e] = (flow_percentage[e] * 0.01
#if DISABLED(NO_VOLUMETRICS)
* volumetric_multiplier[e]
#endif
);
} }
// Manage fans, paste pressure, etc. // Manage fans, paste pressure, etc.
@ -297,12 +304,16 @@ class Planner {
void calculate_volumetric_for_width_sensor(const int8_t encoded_ratio); void calculate_volumetric_for_width_sensor(const int8_t encoded_ratio);
#endif #endif
FORCE_INLINE static void set_filament_size(const uint8_t e, const float &v) { #if DISABLED(NO_VOLUMETRICS)
filament_size[e] = v;
// make sure all extruders have some sane value for the filament size FORCE_INLINE static void set_filament_size(const uint8_t e, const float &v) {
for (uint8_t i = 0; i < COUNT(filament_size); i++) filament_size[e] = v;
if (!filament_size[i]) filament_size[i] = DEFAULT_NOMINAL_FILAMENT_DIA; // make sure all extruders have some sane value for the filament size
} for (uint8_t i = 0; i < COUNT(filament_size); i++)
if (!filament_size[i]) filament_size[i] = DEFAULT_NOMINAL_FILAMENT_DIA;
}
#endif
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)