diff --git a/Firmware/include/StepGen.h b/Firmware/include/StepGen.h index b94fbe2..55ad513 100755 --- a/Firmware/include/StepGen.h +++ b/Firmware/include/StepGen.h @@ -26,7 +26,7 @@ private: public: static uint32_t sync0CycleTime; - static uint32_t pwmCycleTime; + volatile uint32_t pwmCycleTime; StepGen(TIM_TypeDef *Timer, uint32_t timerChannel, PinName stepPin, uint8_t dirPin, void irq(void)); void reqPos(double_t pos); diff --git a/Firmware/src/StepGen.cpp b/Firmware/src/StepGen.cpp index c0f37d2..9f9bcef 100755 --- a/Firmware/src/StepGen.cpp +++ b/Firmware/src/StepGen.cpp @@ -47,12 +47,18 @@ void StepGen::handleStepper(void) { if (!enabled) return; + pwmCycleTime = StepGen::sync0CycleTime; actPos(timerStepPosition / double(stepsPerMM)); double diffPosition = reqPos() - actPos(); + // Wild "tone" kludge + if (abs(diffPosition) > 0.0005) // 60 mm/min = 0.001 mm/ms + { + pwmCycleTime = 10 * StepGen::sync0CycleTime; + } uint64_t fre = abs(diffPosition) * stepsPerMM * 1000000 / double(pwmCycleTime); // Frequency needed - if (fre > maxFreq) // Only do maxFre + if (fre > maxFreq) // Only do maxFre { double maxDist = maxFreq / stepsPerMM * pwmCycleTime / 1000000.0 * (diffPosition > 0 ? 1 : -1); reqPos(actualPosition + maxDist); @@ -72,7 +78,7 @@ void StepGen::handleStepper(void) digitalWrite(dirPin, sgn); timerStepDirection = steps > 0 ? 1 : -1; timerStepPositionAtEnd = pulsesAtEndOfCycle; // Current Position - double_t freqf = abs(steps) * (1e6 / double(pwmCycleTime)); + float_t freqf = abs(steps) * (1e6 / float(pwmCycleTime)); uint32_t freq = uint32_t(freqf); MyTim->setMode(timerChan, TIMER_OUTPUT_COMPARE_PWM2, stepPin); MyTim->setOverflow(freq, HERTZ_FORMAT); @@ -96,7 +102,7 @@ void StepGen::timerCB() { uint8_t sgn = steps > 0 ? HIGH : LOW; digitalWrite(dirPin, sgn); - double_t freqf = abs(steps) * (1e6 / double(pwmCycleTime)); + float_t freqf = abs(steps) * (1e6 / float(pwmCycleTime)); uint32_t freq = uint32_t(freqf); timerStepDirection = steps > 0 ? 1 : -1; timerStepPositionAtEnd = timerNewEndStepPosition; @@ -121,4 +127,3 @@ void StepGen::setScale(int16_t spm) } uint32_t StepGen::sync0CycleTime = 0; -uint32_t StepGen::pwmCycleTime = 0; diff --git a/Firmware/src/main.cpp b/Firmware/src/main.cpp index 5d15905..ba59b84 100755 --- a/Firmware/src/main.cpp +++ b/Firmware/src/main.cpp @@ -177,6 +177,5 @@ uint16_t dc_checker(void) // Indicate we run DC ESCvar.dcsync = 1; StepGen::sync0CycleTime = ESC_SYNC0cycletime() / 1000; // usecs - StepGen::pwmCycleTime = 10 * StepGen::sync0CycleTime; return 0; }