Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Duet3D/RepRapFirmware.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Configuration.h12
-rw-r--r--src/GCodes/GCodes2.cpp19
-rw-r--r--src/Movement/DDA.cpp21
-rw-r--r--src/Platform/Platform.cpp22
-rw-r--r--src/Platform/Platform.h17
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