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:
authorDavid Crocker <dcrocker@eschertech.com>2022-07-05 02:36:32 +0300
committerDavid Crocker <dcrocker@eschertech.com>2022-07-05 02:36:32 +0300
commit878226960fb45a5dabfb27309fadf088f096065b (patch)
tree778092f826900bf9de88aa1957e7f78c6dd96cb0
parent88b925276f2b81b9daf2c0c95b08fe47634bc7fa (diff)
Support longer step pulses on MB6XD when in test mode
-rw-r--r--src/CAN/CanInterface.cpp3
-rw-r--r--src/Platform/Platform.cpp47
-rw-r--r--src/Platform/Platform.h4
3 files changed, 34 insertions, 20 deletions
diff --git a/src/CAN/CanInterface.cpp b/src/CAN/CanInterface.cpp
index b7827e4d..94aabd0c 100644
--- a/src/CAN/CanInterface.cpp
+++ b/src/CAN/CanInterface.cpp
@@ -332,6 +332,9 @@ void CanInterface::SwitchToExpansionMode(CanAddress addr, bool useTestMode) noex
inExpansionMode = true;
inTestMode = useTestMode;
reprap.GetGCodes().SwitchToExpansionMode();
+#ifdef DUET3_MB6XD
+ reprap.GetPlatform().InitStepGateTimer(); // change the step gate timer to allow longer pulses for ATE
+#endif
ReInit(); // reset the CAN filters to account for our new CAN address
}
diff --git a/src/Platform/Platform.cpp b/src/Platform/Platform.cpp
index e9dfb10f..82bb839c 100644
--- a/src/Platform/Platform.cpp
+++ b/src/Platform/Platform.cpp
@@ -647,19 +647,7 @@ void Platform::Init() noexcept
#ifdef DUET3_MB6XD
driverErrPinsActiveLow = (numErrorHighDrivers >= NumDirectDrivers/2); // determine the error signal polarity by assuming most drivers are not in the error state
-
- // Set up the step gate timer
- pmc_enable_periph_clk(STEP_GATE_TC_ID);
- STEP_GATE_TC->TC_CHANNEL[STEP_GATE_TC_CHAN].TC_CCR = TC_CCR_CLKDIS;
- STEP_GATE_TC->TC_CHANNEL[STEP_GATE_TC_CHAN].TC_CMR = TC_CMR_BSWTRG_SET // software trigger sets TIOB
- | TC_CMR_BCPC_CLEAR // RC compare clears TIOB
- | TC_CMR_WAVE // waveform mode
- | TC_CMR_WAVSEL_UP // count up
- | TC_CMR_CPCSTOP // counter clock is stopped when counter reaches RC
- | TC_CMR_EEVT_XC0 // set external events from XC0 (this allows TIOB to be an output)
- | TC_CMR_TCCLKS_TIMER_CLOCK2; // divide MCLK (150MHz) by 8 = 18.75MHz
- SetPinFunction(StepGatePin, StepGatePinFunction);
- STEP_GATE_TC->TC_CHANNEL[STEP_GATE_TC_CHAN].TC_CCR = TC_CCR_CLKEN;
+ InitStepGateTimer();
#endif
// Set up the axis+extruder arrays
@@ -705,9 +693,7 @@ void Platform::Init() noexcept
#endif
}
-#ifdef DUET3_MB6XD
- UpdateDriverTimings();
-#else
+#ifndef DUET3_MB6XD
for (uint32_t& entry : slowDriverStepTimingClocks)
{
entry = 0; // reset all to zero as we have no known slow drivers yet
@@ -2763,6 +2749,27 @@ GCodeResult Platform::SetMotorCurrent(size_t axisOrExtruder, float currentOrPerc
#ifdef DUET3_MB6XD
+// Set up the step gate timer. We reduce the speed to allow longer pulses when in test mode.
+void Platform::InitStepGateTimer() noexcept
+{
+ pmc_enable_periph_clk(STEP_GATE_TC_ID);
+ STEP_GATE_TC->TC_CHANNEL[STEP_GATE_TC_CHAN].TC_CCR = TC_CCR_CLKDIS;
+ const uint32_t clockDiv = (CanInterface::InTestMode())
+ ? TC_CMR_TCCLKS_TIMER_CLOCK3 // divide MCLK (150MHz) by 32 = 4.6875MHz
+ : TC_CMR_TCCLKS_TIMER_CLOCK2; // divide MCLK (150MHz) by 8 = 18.75MHz
+ STEP_GATE_TC->TC_CHANNEL[STEP_GATE_TC_CHAN].TC_CMR = TC_CMR_BSWTRG_SET // software trigger sets TIOB
+ | TC_CMR_BCPC_CLEAR // RC compare clears TIOB
+ | TC_CMR_WAVE // waveform mode
+ | TC_CMR_WAVSEL_UP // count up
+ | TC_CMR_CPCSTOP // counter clock is stopped when counter reaches RC
+ | TC_CMR_EEVT_XC0 // set external events from XC0 (this allows TIOB to be an output)
+ | clockDiv; // divide MCLK (150MHz) by 8 or 32
+ SetPinFunction(StepGatePin, StepGatePinFunction);
+ STEP_GATE_TC->TC_CHANNEL[STEP_GATE_TC_CHAN].TC_CCR = TC_CCR_CLKEN;
+
+ UpdateDriverTimings();
+}
+
// Fetch the worst (longest) timings of any driver, set up the step pulse width timer, and convert the other timings from microseconds to step clocks
void Platform::UpdateDriverTimings() noexcept
{
@@ -2779,8 +2786,8 @@ void Platform::UpdateDriverTimings() noexcept
}
// Convert the step pulse width to clocks of the step pulse gate timer. First define some constants.
- constexpr uint32_t StepGateTcClockFrequency = (SystemCoreClockFreq/2)/8;
- constexpr float StepGateClocksPerMicrosecond = (float)StepGateTcClockFrequency/1.0e6;
+ const uint32_t StepGateTcClockFrequency = (CanInterface::InTestMode()) ? (SystemCoreClockFreq/2)/32 : (SystemCoreClockFreq/2)/8;
+ const float StepGateClocksPerMicrosecond = (float)StepGateTcClockFrequency/1.0e6;
const float fclocks = min<float>(ceilf(worstTimings[0] * StepGateClocksPerMicrosecond), 65535.0); // the TC is only 16 bits wide
STEP_GATE_TC->TC_CHANNEL[STEP_GATE_TC_CHAN].TC_RC = (uint32_t)fclocks;
@@ -2797,8 +2804,8 @@ void Platform::UpdateDriverTimings() noexcept
void Platform::GetActualDriverTimings(float timings[4]) noexcept
{
- constexpr uint32_t StepGateTcClockFrequency = (SystemCoreClockFreq/2)/8;
- constexpr float MicrosecondsPerStepGateClock = 1.0e6/(float)StepGateTcClockFrequency;
+ const uint32_t StepGateTcClockFrequency = (CanInterface::InTestMode()) ? (SystemCoreClockFreq/2)/32 : (SystemCoreClockFreq/2)/8;
+ const float MicrosecondsPerStepGateClock = 1.0e6/(float)StepGateTcClockFrequency;
constexpr float StepClocksToMicroseconds = 1.0e6/(float)StepClockRate;
timings[0] = (float)STEP_GATE_TC->TC_CHANNEL[STEP_GATE_TC_CHAN].TC_RC * MicrosecondsPerStepGateClock;
timings[1] = stepPulseMinimumPeriodClocks * StepClocksToMicroseconds - timings[0];
diff --git a/src/Platform/Platform.h b/src/Platform/Platform.h
index a8ae2c27..518a26ee 100644
--- a/src/Platform/Platform.h
+++ b/src/Platform/Platform.h
@@ -680,6 +680,10 @@ public:
void OnProcessingCanMessage() noexcept; // called when we start processing any CAN message except for regular messages e.g. time sync
#endif
+#ifdef DUET3_MB6XD
+ void InitStepGateTimer() noexcept;
+#endif
+
protected:
DECLARE_OBJECT_MODEL
OBJECT_MODEL_ARRAY(axisDrivers)