rusEFI
The most advanced open source ECU
pwm_tester.cpp
Go to the documentation of this file.
1 /**
2  * @file PwmTester.cpp
3  * This is a tool to measure rusEfi PWM generation quality
4  *
5  * @date Apr 29, 2014
6  * @author Andrey Belomutskiy, (c) 2012-2020
7  */
8 
9 #include "pch.h"
10 
11 #if EFI_PWM_TESTER
12 
13 #include "pwm_tester.h"
14 
15 static SimplePwm pwmTest[5];
16 
18 
19 static void startPwmTest(int freq) {
20  efiPrintf("running pwm test @%d", freq);
21 
22  engine->isRunningPwmTest = true;
23 
24  // PD13 pin is initialized elsewhere already
25  startSimplePwm(&pwmTest[0], "tester", &warningLedPin, 10, 0.5f);
26  /**
27  * See custom_engine.cpp for pinout
28  */
29  // currently this is PB9 by default - see engineConfiguration->injectionPins
30  startSimplePwm(&pwmTest[1], "tester", &enginePins.injectors[0], freq / 1.3333333333, 0.5f);
31  // currently this is PE2 by default
32  startSimplePwm(&pwmTest[2], "tester", &enginePins.injectors[1], freq / 1000, 0.5f);
33  // currently this is PB8 by default
34  startSimplePwm(&pwmTest[3], "tester", &enginePins.injectors[2], freq, 0.5);
35  // currently this is PB7 by default
36  startSimplePwm(&pwmTest[4], "tester", &enginePins.injectors[3], freq / 33.33333333333, 0.5);
37 
38 }
39 
41 
42 static OutputSignal outSignals[8];
43 
44 static void testCallback(void *arg) {
45 
46  /**
47  * 0.1ms from now please squirt for 1.6ms
48  */
49  float delayMs = 0.1;
50  float durationMs = 1.6;
51 
52  efitimeus_t nowUs = getTimeNowUs();
53 
54  scheduleOutput(&outSignals[0], nowUs, delayMs, durationMs);
55  scheduleOutput(&outSignals[1], nowUs, delayMs, durationMs);
56  scheduleOutput(&outSignals[2], nowUs, delayMs, durationMs);
57  scheduleOutput(&outSignals[3], nowUs, delayMs, durationMs);
58 
59  scheduleOutput(&outSignals[4], nowUs, delayMs, durationMs);
60  scheduleOutput(&outSignals[5], nowUs, delayMs, durationMs);
61  scheduleOutput(&outSignals[6], nowUs, delayMs, durationMs);
62  scheduleOutput(&outSignals[7], nowUs, delayMs, durationMs);
63 
64  /**
65  * this would re-schedule another callback in 2ms from now
66  */
67  engine->executor.scheduleForLater("test", &ioTest, MS2US(2), testCallback);
68 }
69 
70 void initPwmTester() {
71  initLogging(&logger, "pwm test");
72  addConsoleActionI("pwmtest", startPwmTest);
73  startPwmTest(1000);
74 
75  /**
76  * injector channels #4-#8 are used for individual squirt test
77  */
78  // todo: yet, it's some horrible code duplication
79  outSignals[0].output = &enginePins.injectors[4];
80  outSignals[1].output = &enginePins.injectors[5];
81  outSignals[2].output = &enginePins.injectors[6];
82  outSignals[3].output = &enginePins.injectors[7];
83  outSignals[4].output = &enginePins.injectors[8];
84  outSignals[5].output = &enginePins.injectors[9];
85  outSignals[6].output = &enginePins.injectors[10];
86  outSignals[7].output = &enginePins.injectors[11];
87 
88  /**
89  * this would schedule a callback in 2ms from now
90  */
91  engine->executor.scheduleForLater("test", &ioTest, MS2US(2), testCallback);
92 }
93 
94 #endif
SingleTimerExecutor executor
Definition: engine.h:240
bool isRunningPwmTest
Definition: engine.h:300
InjectorOutputPin injectors[MAX_CYLINDER_COUNT]
Definition: efi_gpio.h:122
Single output pin reference and state.
Definition: efi_output.h:50
void scheduleForLater(const char *msg, scheduling_s *scheduling, int delayUs, action_s action) override
void addConsoleActionI(const char *token, VoidInt callback)
Register a console command with one Integer parameter.
EnginePins enginePins
Definition: efi_gpio.cpp:24
efitimeus_t getTimeNowUs()
Definition: efitime.cpp:26
Engine * engine
void startSimplePwm(SimplePwm *state, const char *msg, ExecutorInterface *executor, OutputPin *output, float frequency, float dutyCycle, pwm_gen_callback *callback)
static scheduling_s ioTest
Definition: pwm_tester.cpp:40
static OutputSignal outSignals[8]
Definition: pwm_tester.cpp:42
static void testCallback(void *arg)
Definition: pwm_tester.cpp:44
static SimplePwm pwmTest[5]
Definition: pwm_tester.cpp:15
void initPwmTester()
Definition: pwm_tester.cpp:70
OutputPin warningLedPin
static void startPwmTest(int freq)
Definition: pwm_tester.cpp:19