diff options
-rw-r--r-- | src/Configuration.h | 12 | ||||
-rw-r--r-- | src/GCodes/GCodes2.cpp | 19 | ||||
-rw-r--r-- | src/Movement/DDA.cpp | 21 | ||||
-rw-r--r-- | src/Platform/Platform.cpp | 22 | ||||
-rw-r--r-- | src/Platform/Platform.h | 17 |
5 files changed, 42 insertions, 49 deletions
diff --git a/src/Configuration.h b/src/Configuration.h index 893477f1..b407e7e5 100644 --- a/src/Configuration.h +++ b/src/Configuration.h @@ -23,22 +23,22 @@ Licence: GPL #include <cstring> // for strlen // Axes -constexpr float DefaultXYMaxFeedrate = 100.0; // mm/sec +constexpr float DefaultAxisMaxFeedrate = 100.0; // mm/sec constexpr float DefaultZMaxFeedrate = 5.0; constexpr float DefaultEMaxFeedrate = 20.0; -constexpr float DefaultXYAcceleration = 500.0; // mm/sec^2 +constexpr float DefaultAxisAcceleration = 500.0; // mm/sec^2 constexpr float DefaultZAcceleration = 20.0; constexpr float DefaultEAcceleration = 250.0; -constexpr float XYStallEndstopMaxAcceleration = 1000.0; // Maximum XY acceleration to use at the start of a homing move if stall endstops are being used -constexpr float ZProbeMaxAcceleration = 250.0; // Maximum Z acceleration to use at the start of a probing or stall endstop move +constexpr float DefaultReducedAxisAcceleration = 1000.0; // Maximum XY acceleration to use at the start of a homing move if stall endstops are being used +constexpr float DefaultReducedZAcceleration = 250.0; // Maximum Z acceleration to use at the start of a probing or stall endstop move -constexpr float DefaultXYDriveStepsPerUnit = 80.0; // steps/mm +constexpr float DefaultAxisDriveStepsPerUnit = 80.0; // steps/mm constexpr float DefaultZDriveStepsPerUnit = 4000.0; constexpr float DefaultEDriveStepsPerUnit = 420.0; -constexpr float DefaultXYInstantDv = 15.0; // mm/sec +constexpr float DefaultAxisInstantDv = 15.0; // mm/sec constexpr float DefaultZInstantDv = 0.2; constexpr float DefaultEInstantDv = 2.0; diff --git a/src/GCodes/GCodes2.cpp b/src/GCodes/GCodes2.cpp index 8797c342..4b666fb9 100644 --- a/src/GCodes/GCodes2.cpp +++ b/src/GCodes/GCodes2.cpp @@ -496,7 +496,7 @@ bool GCodes::HandleMcode(GCodeBuffer& gb, const StringRef& reply) THROWS(GCodeEx GCodeResult result; if (gb.GetCommandFraction() > 0 - && code != 569 // these are the only M-codes we implement that can have fractional parts + && code != 569 && code != 201 // these are the only M-codes we implement that can have fractional parts ) { result = TryMacroFile(gb); @@ -2122,12 +2122,19 @@ bool GCodes::HandleMcode(GCodeBuffer& gb, const StringRef& reply) THROWS(GCodeEx case 201: // Set/print axis accelerations { + const int frac = gb.GetCommandFraction(); + if (frac > 1) + { + result = GCodeResult::errorNotSupported; + break; + } + bool seen = false; for (size_t axis = 0; axis < numTotalAxes; axis++) { if (gb.Seen(axisLetters[axis])) { - platform.SetAcceleration(axis, gb.GetAcceleration()); + platform.SetAcceleration(axis, gb.GetAcceleration(), frac == 1); seen = true; } } @@ -2140,7 +2147,7 @@ bool GCodes::HandleMcode(GCodeBuffer& gb, const StringRef& reply) THROWS(GCodeEx gb.GetFloatArray(eVals, eCount, true); for (size_t e = 0; e < eCount; e++) { - platform.SetAcceleration(ExtruderToLogicalDrive(e), ConvertAcceleration(eVals[e])); + platform.SetAcceleration(ExtruderToLogicalDrive(e), ConvertAcceleration(eVals[e]), frac == 1); } } @@ -2150,16 +2157,16 @@ bool GCodes::HandleMcode(GCodeBuffer& gb, const StringRef& reply) THROWS(GCodeEx } else { - reply.copy("Accelerations (mm/sec^2): "); + reply.copy((frac == 1) ? "Reduced accelerations (mm/sec^2): " : "Accelerations (mm/sec^2): "); for (size_t axis = 0; axis < numTotalAxes; ++axis) { - reply.catf("%c: %.1f, ", axisLetters[axis], (double)InverseConvertAcceleration(platform.Acceleration(axis))); + reply.catf("%c: %.1f, ", axisLetters[axis], (double)InverseConvertAcceleration(platform.Accelerations(frac == 1)[axis])); } reply.cat("E:"); char sep = ' '; for (size_t extruder = 0; extruder < numExtruders; extruder++) { - reply.catf("%c%.1f", sep, (double)InverseConvertAcceleration(platform.Acceleration(ExtruderToLogicalDrive(extruder)))); + reply.catf("%c%.1f", sep, (double)InverseConvertAcceleration(platform.Accelerations(frac == 1)[ExtruderToLogicalDrive(extruder)])); sep = ':'; } } diff --git a/src/Movement/DDA.cpp b/src/Movement/DDA.cpp index 4f210de6..7958a71b 100644 --- a/src/Movement/DDA.cpp +++ b/src/Movement/DDA.cpp @@ -325,7 +325,7 @@ bool DDA::InitStandardMove(DDARing& ring, const RawMove &nextMove, bool doMotorM bool extrudersMoving = false; bool forwardExtruding = false; float accelerations[MaxAxesPlusExtruders]; - const float * const normalAccelerations = reprap.GetPlatform().Accelerations(); + const float * const normalAccelerations = reprap.GetPlatform().Accelerations(nextMove.reduceAcceleration); for (size_t drive = 0; drive < MaxAxesPlusExtruders; drive++) { @@ -458,23 +458,6 @@ bool DDA::InitStandardMove(DDARing& ring, const RawMove &nextMove, bool doMotorM } #endif - // If it's a Z probing move, limit the Z acceleration to better handle nozzle-contact probes - if (nextMove.reduceAcceleration) - { - if (accelerations[X_AXIS] > XYStallEndstopMaxAcceleration) - { - accelerations[X_AXIS] = XYStallEndstopMaxAcceleration; - } - if (accelerations[Y_AXIS] > XYStallEndstopMaxAcceleration) - { - accelerations[Y_AXIS] = XYStallEndstopMaxAcceleration; - } - if (accelerations[Z_AXIS] > ZProbeMaxAcceleration) - { - accelerations[Z_AXIS] = ZProbeMaxAcceleration; - } - } - // 4. Normalise the direction vector and compute the amount of motion. // NIST standard section 2.1.2.5 rule A: if any of XYZ is moving then the feed rate specifies the linear XYZ movement // We treat additional linear axes the same as XYZ @@ -609,7 +592,7 @@ bool DDA::InitLeadscrewMove(DDARing& ring, float feedrate, const float adjustmen tool = nullptr; filePos = prev->filePos; flags.endCoordinatesValid = prev->flags.endCoordinatesValid; - acceleration = deceleration = reprap.GetPlatform().Accelerations()[Z_AXIS]; + acceleration = deceleration = reprap.GetPlatform().Acceleration(Z_AXIS); #if SUPPORT_LASER && SUPPORT_IOBITS if (reprap.GetGCodes().GetMachineType() == MachineType::laser) diff --git a/src/Platform/Platform.cpp b/src/Platform/Platform.cpp index 69eb67f5..9d935855 100644 --- a/src/Platform/Platform.cpp +++ b/src/Platform/Platform.cpp @@ -609,25 +609,27 @@ void Platform::Init() noexcept axisMinima[axis] = DefaultAxisMinimum; axisMaxima[axis] = DefaultAxisMaximum; - maxFeedrates[axis] = DefaultXYMaxFeedrate; - accelerations[axis] = DefaultXYAcceleration; - driveStepsPerUnit[axis] = DefaultXYDriveStepsPerUnit; - instantDvs[axis] = DefaultXYInstantDv; + maxFeedrates[axis] = ConvertSpeedFromMmPerSec(DefaultAxisMaxFeedrate); + normalAccelerations[axis] = ConvertAcceleration(DefaultAxisAcceleration); + reducedAccelerations[axis] = ConvertAcceleration(DefaultReducedAxisAcceleration); + driveStepsPerUnit[axis] = DefaultAxisDriveStepsPerUnit; + instantDvs[axis] = ConvertSpeedFromMmPerSec(DefaultAxisInstantDv); } // We use different defaults for the Z axis - maxFeedrates[Z_AXIS] = DefaultZMaxFeedrate; - accelerations[Z_AXIS] = DefaultZAcceleration; + maxFeedrates[Z_AXIS] = ConvertSpeedFromMmPerSec(DefaultZMaxFeedrate); + normalAccelerations[Z_AXIS] = ConvertAcceleration(DefaultZAcceleration); + reducedAccelerations[Z_AXIS] = ConvertAcceleration(DefaultReducedZAcceleration); driveStepsPerUnit[Z_AXIS] = DefaultZDriveStepsPerUnit; - instantDvs[Z_AXIS] = DefaultZInstantDv; + instantDvs[Z_AXIS] = ConvertSpeedFromMmPerSec(DefaultZInstantDv); // Extruders for (size_t drive = MaxAxes; drive < MaxAxesPlusExtruders; ++drive) { - maxFeedrates[drive] = DefaultEMaxFeedrate; - accelerations[drive] = DefaultEAcceleration; + maxFeedrates[drive] = ConvertSpeedFromMmPerSec(DefaultEMaxFeedrate); + normalAccelerations[drive] = reducedAccelerations[drive] = ConvertAcceleration(DefaultEAcceleration); driveStepsPerUnit[drive] = DefaultEDriveStepsPerUnit; - instantDvs[drive] = DefaultEInstantDv; + instantDvs[drive] = ConvertSpeedFromMmPerSec(DefaultEInstantDv); } minimumMovementSpeed = ConvertSpeedFromMmPerSec(DefaultMinFeedrate); diff --git a/src/Platform/Platform.h b/src/Platform/Platform.h index 44473d3e..a3f8b7c3 100644 --- a/src/Platform/Platform.h +++ b/src/Platform/Platform.h @@ -463,8 +463,8 @@ public: { return driveStepsPerUnit; } void SetDriveStepsPerUnit(size_t axisOrExtruder, float value, uint32_t requestedMicrostepping) noexcept; float Acceleration(size_t axisOrExtruder) const noexcept; - const float *_ecv_array Accelerations() const noexcept; - void SetAcceleration(size_t axisOrExtruder, float value) noexcept; + const float *_ecv_array Accelerations(bool useReduced) const noexcept; + void SetAcceleration(size_t axisOrExtruder, float value, bool reduced) noexcept; float MaxFeedrate(size_t axisOrExtruder) const noexcept; const float *_ecv_array MaxFeedrates() const noexcept { return maxFeedrates; } void SetMaxFeedrate(size_t axisOrExtruder, float value) noexcept; @@ -722,7 +722,8 @@ private: volatile DriverStatus driverState[MaxAxesPlusExtruders]; float maxFeedrates[MaxAxesPlusExtruders]; // max feed rates in mm per step clock - float accelerations[MaxAxesPlusExtruders]; // max accelerations in mm per step clock squared + float normalAccelerations[MaxAxesPlusExtruders]; // max accelerations in mm per step clock squared for normal moves + float reducedAccelerations[MaxAxesPlusExtruders]; // max accelerations in mm per step clock squared for probing and stall detection moves float driveStepsPerUnit[MaxAxesPlusExtruders]; float instantDvs[MaxAxesPlusExtruders]; // max jerk in mm per step clock uint32_t driveDriverBits[MaxAxesPlusExtruders + NumDirectDrivers]; @@ -923,17 +924,17 @@ inline float Platform::DriveStepsPerUnit(size_t drive) const noexcept inline float Platform::Acceleration(size_t drive) const noexcept { - return accelerations[drive]; + return normalAccelerations[drive]; } -inline const float *_ecv_array Platform::Accelerations() const noexcept +inline const float *_ecv_array Platform::Accelerations(bool useReduced) const noexcept { - return accelerations; + return (useReduced) ? reducedAccelerations : normalAccelerations; } -inline void Platform::SetAcceleration(size_t drive, float value) noexcept +inline void Platform::SetAcceleration(size_t drive, float value, bool reduced) noexcept { - accelerations[drive] = max<float>(value, ConvertAcceleration(MinimumAcceleration)); // don't allow zero or negative + ((reduced) ? reducedAccelerations : normalAccelerations)[drive] = max<float>(value, ConvertAcceleration(MinimumAcceleration)); // don't allow zero or negative } inline float Platform::MaxFeedrate(size_t drive) const noexcept |