diff options
author | David Crocker <dcrocker@eschertech.com> | 2022-07-05 02:36:32 +0300 |
---|---|---|
committer | David Crocker <dcrocker@eschertech.com> | 2022-07-05 02:36:32 +0300 |
commit | 878226960fb45a5dabfb27309fadf088f096065b (patch) | |
tree | 778092f826900bf9de88aa1957e7f78c6dd96cb0 | |
parent | 88b925276f2b81b9daf2c0c95b08fe47634bc7fa (diff) |
Support longer step pulses on MB6XD when in test mode
-rw-r--r-- | src/CAN/CanInterface.cpp | 3 | ||||
-rw-r--r-- | src/Platform/Platform.cpp | 47 | ||||
-rw-r--r-- | src/Platform/Platform.h | 4 |
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) |