From 208088847bfc931dede3f94e9afe2538c96e922c Mon Sep 17 00:00:00 2001 From: Matthew Kennedy Date: Wed, 10 Mar 2021 14:30:13 -0800 Subject: [PATCH] accurate bench test (#2441) * accurate bench test * allow shorter pulses --- firmware/controllers/bench_test.cpp | 34 +++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/firmware/controllers/bench_test.cpp b/firmware/controllers/bench_test.cpp index 3ab087e66b..26f28d3f0a 100644 --- a/firmware/controllers/bench_test.cpp +++ b/firmware/controllers/bench_test.cpp @@ -65,11 +65,22 @@ bool isRunningBenchTest(void) { return isRunningBench; } +static scheduling_s benchSchedStart; +static scheduling_s benchSchedEnd; + +void benchOn(OutputPin* output) { + output->setValue(true); +} + +void benchOff(OutputPin* output) { + output->setValue(false); +} + static void runBench(brain_pin_e brainPin, OutputPin *output, float delayMs, float onTimeMs, float offTimeMs, int count) { - int delayUs = MS2US(maxF(1, delayMs)); - int onTimeUs = MS2US(maxF(1, onTimeMs)); - int offTimeUs = MS2US(maxF(1, offTimeMs)); + int delayUs = MS2US(maxF(0.1, delayMs)); + int onTimeUs = MS2US(maxF(0.1, onTimeMs)); + int offTimeUs = MS2US(maxF(0.1, offTimeMs)); scheduleMsg(logger, "Running bench: ON_TIME=%.2f us OFF_TIME=%.2f us Counter=%d", onTimeUs, offTimeUs, count); scheduleMsg(logger, "output on %s", hwPortname(brainPin)); @@ -77,12 +88,21 @@ static void runBench(brain_pin_e brainPin, OutputPin *output, float delayMs, flo chThdSleepMicroseconds(delayUs); isRunningBench = true; + for (int i = 0; i < count; i++) { - output->setValue(true); - chThdSleepMicroseconds(onTimeUs); - output->setValue(false); - chThdSleepMicroseconds(offTimeUs); + efitick_t nowNt = getTimeNowNt(); + // start in a short time so the scheduler can precisely schedule the start event + efitick_t startTime = nowNt + US2NT(50); + efitick_t endTime = startTime + US2NT(onTimeUs); + + // Schedule both events + engine->executor.scheduleByTimestampNt(&benchSchedStart, startTime, {benchOn, output}); + engine->executor.scheduleByTimestampNt(&benchSchedEnd, endTime, {benchOff, output}); + + // Wait one full cycle time for the event + delay to happen + chThdSleepMicroseconds(onTimeUs + offTimeUs); } + scheduleMsg(logger, "Done!"); isRunningBench = false; }