From f4a15afa8a0de6b276e551e00221fe668b77f6dd Mon Sep 17 00:00:00 2001 From: Hakan Bastedt Date: Sun, 11 Feb 2024 19:55:40 +0100 Subject: [PATCH] a cycle's pwm train maight have been too long and run into the start of next cycle's pwm train. That's gone now and it seems to work. A more brilliant solution is needed for this. --- Firmware/doc/Stepgen.odp | Bin 31446 -> 32102 bytes Firmware/include/StepGen2.h | 5 +++-- Firmware/src/StepGen2.cpp | 41 ++++++++++++++++++++++++------------ Firmware/src/main.cpp | 27 ++++++++++++++---------- 4 files changed, 46 insertions(+), 27 deletions(-) diff --git a/Firmware/doc/Stepgen.odp b/Firmware/doc/Stepgen.odp index 572e8ba943c2bd0f06aea5802acad357b81310ff..8d0384ae1ae2c9963a9e26340093be35c4faf58a 100755 GIT binary patch literal 32102 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 literal 31446 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 #include #include "StepGen2.h" +extern "C" +{ +#include "esc.h" +} +extern int64_t extendTime(uint32_t); StepGen2::StepGen2(TIM_TypeDef *Timer, uint32_t _timerChannel, PinName _stepPin, uint8_t _dirPin, void irq(void), TIM_TypeDef *Timer2, void irq2(void)) { @@ -21,10 +26,10 @@ StepGen2::StepGen2(TIM_TypeDef *Timer, uint32_t _timerChannel, PinName _stepPin, startTimer = new HardwareTimer(Timer2); startTimer->attachInterrupt(irq2); } -uint32_t cnt = 0; -uint32_t StepGen2::handleStepper(void) +extern volatile uint32_t cnt; +uint32_t StepGen2::handleStepper(uint64_t irqTime) { - + digitalWrite(dirPin, cnt++ % 2); if (!enabled) return updatePos(0); @@ -32,39 +37,44 @@ uint32_t StepGen2::handleStepper(void) commandedStepPosition = floor(commandedPosition * stepsPerMM); // Scale position to steps if (initialStepPosition == commandedStepPosition) // No movement return 1; -// digitalWrite(dirPin, cnt++ % 2); + float approximateFrequency = fabs(initialStepPosition - commandedStepPosition) // We must take at least one step / lcncCycleTime; // from here on - // if (approximateFrequency > maxAllowedFrequency) // Stay on this position - // return 1; + // if (approximateFrequency > maxAllowedFrequency) // Stay on this position + // return 1; float kTRAJ = (commandedPosition - initialPosition) / lcncCycleTime; // Straight line equation float mTRAJ = initialPosition; // position = kTRAJ x time + mTRAJ // Operating on incoming positions (not steps) - if (fabs(kTRAJ * lcncCycleTime * stepsPerMM) < 0.01) // Very flat slope + // if (fabs(kTRAJ * lcncCycleTime * stepsPerMM) < 0.01) // Very flat slope + nSteps = commandedStepPosition - initialStepPosition; // + if (abs(nSteps) <= 8) // Some small number { // - Tstartf = 0.5 * lcncCycleTime; // Just take a step in the middle of the cycle - frequency = 10000; // At some suitable frequency - nSteps = kTRAJ > 0 ? 1 : -1; // Take only one step + Tstartf = 0; // Just take a step in the middle of the cycle + frequency = 1000 * (abs(nSteps) + 1); // At some suitable frequency } else // Regular step train, up or down { if (kTRAJ > 0) - Tstartf = (ceil(initialPosition * stepsPerMM) / stepsPerMM - mTRAJ) / kTRAJ; + Tstartf = (float(initialStepPosition + 1) / float(stepsPerMM) - mTRAJ) / kTRAJ; else - Tstartf = (floor(initialPosition * stepsPerMM) / stepsPerMM - mTRAJ) / kTRAJ; + Tstartf = (float(initialStepPosition) / float(stepsPerMM) - mTRAJ) / kTRAJ; frequency = fabs(kTRAJ * stepsPerMM); nSteps = commandedStepPosition - initialStepPosition; // sign(nSteps) = direction. } updatePos(5); - Tstartu = Tstartf * 1e6; // Was secs, now usecs + uint64_t nowTime = extendTime(micros()); // usecs + dbg = nowTime - irqTime; + Tstartu = Tjitter + Tstartf * 1e6 // Was secs, now usecs + - (nowTime - irqTime); // Have already wasted some time since the irq. - startTimer->setOverflow(Tstartu + Tjitter, MICROSEC_FORMAT); // All handled by irqs + startTimer->setOverflow(Tstartu, MICROSEC_FORMAT); // All handled by irqs startTimer->resume(); return 1; } void StepGen2::startTimerCB() { + digitalWrite(dirPin, cnt++ % 2); startTimer->pause(); // Once is enough. // digitalWrite(dirPin, nSteps > 0 ? 1 : -1); timerPulseSteps = abs(nSteps); @@ -77,7 +87,10 @@ void StepGen2::pulseTimerCB() { --timerPulseSteps; if (timerPulseSteps == 0) + { pulseTimer->pause(); + digitalWrite(dirPin, cnt++ % 2); + } } uint32_t StepGen2::updatePos(uint32_t i) diff --git a/Firmware/src/main.cpp b/Firmware/src/main.cpp index 0ecba70..b9ff56a 100755 --- a/Firmware/src/main.cpp +++ b/Firmware/src/main.cpp @@ -26,6 +26,7 @@ void pulseTimerCallback(void) { Step.pulseTimerCB(); } void startTimerCallback(void) { Step.startTimerCB(); } CircularBuffer Tim; volatile uint64_t irqTime = 0, thenTime = 0; +volatile uint32_t ccnnt = 0; int64_t extendTime(uint32_t in); // Extend from 32-bit to 64-bit precision void cb_set_outputs(void) // Master outputs gets here, slave inputs, first operation @@ -42,7 +43,7 @@ void handleStepper(void) Obj.StepGenOut1.ActualPosition = Step.commandedPosition; Step.stepsPerMM = Obj.StepGenIn1.StepsPerMM; Step.stepsPerMM = 4000; - Step.handleStepper(); + Step.handleStepper(irqTime); Obj.StepGenOut2.ActualPosition = Obj.StepGenIn2.CommandedPosition; } @@ -54,7 +55,7 @@ void cb_get_inputs(void) // Set Master inputs, slave outputs, last operation Obj.EncFrequency = Encoder1.frequency(ESCvar.Time); Obj.IndexByte = Encoder1.getIndexState(); - uint32_t dTim = irqTime - thenTime; // Debug. Getting jitter over the last 200 milliseconds + uint32_t dTim = extendTime(micros()) - irqTime; // thenTime; // Debug. Getting jitter over the last 200 milliseconds Tim.push(dTim); uint32_t max_Tim = 0, min_Tim = UINT32_MAX; for (decltype(Tim)::index_t i = 0; i < Tim.size(); i++) @@ -67,8 +68,8 @@ void cb_get_inputs(void) // Set Master inputs, slave outputs, last operation } thenTime = irqTime; Obj.DiffT = max_Tim - min_Tim; // Debug - Obj.DiffT = ALEventIRQ; - //Obj.DiffT = Step.frequency; + Obj.DiffT = ccnnt--; + // Obj.DiffT = Step.frequency; } void ESC_interrupt_enable(uint32_t mask); @@ -112,7 +113,7 @@ void loop(void) { CC_ATOMIC_SET(ESCvar.ALevent, ESC_ALeventread()); DIG_process(ALEventIRQ, DIG_PROCESS_WD_FLAG | DIG_PROCESS_OUTPUTS_FLAG | - DIG_PROCESS_APP_HOOK_FLAG | DIG_PROCESS_INPUTS_FLAG); + DIG_PROCESS_APP_HOOK_FLAG | DIG_PROCESS_INPUTS_FLAG); serveIRQ = 0; ESCvar.PrevTime = ESCvar.Time; } @@ -120,14 +121,17 @@ void loop(void) if ((dTime > 200 && dTime < 500) || dTime > 1500) // Don't run ecat_slv_poll when expecting to serve interrupt ecat_slv_poll(); } - +volatile uint32_t cnt = 0; void sync0Handler(void) { - irqTime = micros(); - serveIRQ = 1; + ccnnt++; ALEventIRQ = ESC_ALeventread(); + serveIRQ = 1; + irqTime = extendTime(micros()); + digitalWrite(Step.dirPin, cnt++ % 2); } +// Enable SM2 interrupts void ESC_interrupt_enable(uint32_t mask) { // Enable interrupt for SYNC0 or SM2 or SM3 @@ -135,9 +139,8 @@ void ESC_interrupt_enable(uint32_t mask) uint32_t user_int_mask = ESCREG_ALEVENT_SM2; // Only SM2 if (mask & user_int_mask) { - ESC_ALeventmaskwrite(ESC_ALeventmaskread() & ~(ESCREG_ALEVENT_DC_SYNC0 | ESCREG_ALEVENT_SM3)); - ESC_ALeventmaskwrite(ESC_ALeventmaskread() | (mask & user_int_mask)); + ESC_ALeventmaskwrite(ESC_ALeventmaskread() & ~(ESCREG_ALEVENT_DC_SYNC0 | ESCREG_ALEVENT_SM3)); attachInterrupt(digitalPinToInterrupt(PC3), sync0Handler, RISING); // Set LAN9252 interrupt pin driver as push-pull active high @@ -150,6 +153,7 @@ void ESC_interrupt_enable(uint32_t mask) } } +// Disable SM2 interrupts void ESC_interrupt_disable(uint32_t mask) { // Enable interrupt for SYNC0 or SM2 or SM3 @@ -182,7 +186,8 @@ uint16_t dc_checker(void) #define HALF_PERIOD (UINT32_MAX >> 1) static int64_t previousTimeValue = 0; -int64_t extendTime(uint32_t in) // Extend from 32-bit to 64-bit precision +// Extend from 32-bit to 64-bit precision +int64_t extendTime(uint32_t in) { int64_t c64 = (int64_t)in - HALF_PERIOD; // remove half period to determine (+/-) sign of the wrap int64_t dif = (c64 - previousTimeValue); // core concept: prev + (current - prev) = current