rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
dc_motors.cpp
Go to the documentation of this file.
1/**
2 * @file dc_motors.cpp
3 *
4 * @date March 3, 2020
5 * @author Matthew Kennedy (c) 2020
6 */
7
8#include "pch.h"
9
10#include "dc_motors.h"
11
12 void DcHardware::start(bool useTwoWires,
13 brain_pin_e pinEnable,
14 brain_pin_e pinDir1,
15 brain_pin_e pinDir2,
16 const char *disPinMsg,
17 brain_pin_e pinDisable,
18 bool isInverted,
19 Scheduler* executor,
20 int frequency) {
21
22 if (isStarted) {
23 // actually implement stop()
24 return;
25 }
26 isStarted = true;
27
29
30 // Configure the disable pin first - ensure things are in a safe state
31 m_disablePin.initPin(disPinMsg, pinDisable);
33
34 // Clamp to >100hz
35 int clampedFrequency = maxI(100, frequency);
36
37 if (clampedFrequency > ETB_HW_MAX_FREQUENCY) {
38 criticalError("Electronic throttle frequency too high, maximum %d hz", ETB_HW_MAX_FREQUENCY);
39 return;
40 }
41
42 if (useTwoWires) {
43 m_pinEnable.initPin("ETB Enable", pinEnable);
44
45// no need to complicate event queue with ETB PWM in unit tests
46#if ! EFI_UNIT_TEST
47 startSimplePwmHard(&m_pwm1, "ETB Dir 1",
48 executor,
49 pinDir1,
50 &m_pinDir1,
51 clampedFrequency,
52 /*dutyCycle*/0
53 );
54
55 startSimplePwmHard(&m_pwm2, "ETB Dir 2",
56 executor,
57 pinDir2,
58 &m_pinDir2,
59 clampedFrequency,
60 /*dutyCycle*/0
61 );
62#endif // EFI_UNIT_TEST
63
65 } else {
66 m_pinDir1.initPin("ETB Dir 1", pinDir1);
67 m_pinDir2.initPin("ETB Dir 2", pinDir2);
68
69// no need to complicate event queue with ETB PWM in unit tests
70#if ! EFI_UNIT_TEST
71 startSimplePwmHard(&m_pwm1, "ETB Enable",
72 executor,
73 pinEnable,
75 clampedFrequency,
76 /*dutyCycle*/0
77 );
78#endif // EFI_UNIT_TEST
79
81 }
82 }
83
84static DcHardware dcHardware[ETB_COUNT + DC_PER_STEPPER];
85
89
90DcMotor* initDcMotor(const char *disPinMsg,const dc_io& io, size_t index, bool useTwoWires) {
91 auto& hw = dcHardware[index];
92
93 hw.start(
94 useTwoWires,
95 io.controlPin,
98 disPinMsg,
99 io.disablePin,
100 // todo You would not believe how you invert TLE9201 #4579
104 );
105
106 return &hw.dcMotor;
107}
108
109DcMotor* initDcMotor(brain_pin_e coil_p, brain_pin_e coil_m, size_t index) {
110 auto& hw = dcHardware[index];
111
112 hw.start(
113 true, /* useTwoWires */
114 Gpio::Unassigned, /* pinEnable */
115 coil_p,
116 coil_m,
117 nullptr,
118 Gpio::Unassigned, /* pinDisable */
121 engineConfiguration->etbFreq /* same in case of stepper? */
122 );
123
124 return &hw.dcMotor;
125}
126
127void setDcMotorFrequency(size_t index, int hz) {
128 dcHardware[index].setFrequency(hz);
129}
130
131void setDcMotorDuty(size_t index, float duty) {
132 dcHardware[index].dcMotor.set(duty);
133}
134
135void showDcMotorInfo(int i) {
136 DcHardware *dc = &dcHardware[i];
137
138 efiPrintf(" motor: dir=%d DC=%f", dc->dcMotor.isOpenDirection(), dc->dcMotor.get());
139 const char *disableMsg = dc->msg();
140 if (disableMsg != nullptr) {
141 efiPrintf("disabled [%s]", disableMsg);
142 }
143}
144
const char * msg()
Definition dc_motors.h:70
void setFrequency(int frequency)
Definition dc_motors.h:65
OutputPin m_pinDir2
Definition dc_motors.h:38
void start(bool useTwoWires, brain_pin_e pinEnable, brain_pin_e pinDir1, brain_pin_e pinDir2, const char *disPinMsg, brain_pin_e pinDisable, bool isInverted, Scheduler *executor, int frequency)
Definition dc_motors.cpp:12
SimplePwm m_pwm2
Definition dc_motors.h:46
SimplePwm m_pwm1
Definition dc_motors.h:45
OutputPin m_pinEnable
Definition dc_motors.h:36
PwmWrapper wrappedDir1
Definition dc_motors.h:42
OutputPin m_disablePin
Definition dc_motors.h:39
OutputPin m_pinDir1
Definition dc_motors.h:37
bool isStarted
Definition dc_motors.h:48
PwmWrapper wrappedDir2
Definition dc_motors.h:43
PwmWrapper wrappedEnable
Definition dc_motors.h:41
TwoPinDcMotor dcMotor
Definition dc_motors.h:63
Brushed or brushless DC motor interface.
Definition dc_motor.h:20
SingleTimerExecutor scheduler
Definition engine.h:271
void initPin(const char *msg, brain_pin_e brainPin, pin_output_mode_e outputMode, bool forceInitWithFatalError=false)
Definition efi_gpio.cpp:711
void setValue(const char *msg, int logicValue, bool isForce=false)
Definition efi_gpio.cpp:604
float get() const override
Get the current motor duty cycle.
Definition dc_motor.cpp:48
void setType(ControlType type)
Definition dc_motor.h:106
void configure(IPwm &enable, IPwm &dir1, IPwm &dir2, bool isInverted)
Definition dc_motor.cpp:19
virtual bool set(float duty) override
Definition dc_motor.cpp:55
bool isOpenDirection() const override
Definition dc_motor.cpp:44
@ Unassigned
DcMotor * initDcMotor(const char *disPinMsg, const dc_io &io, size_t index, bool useTwoWires)
Definition dc_motors.cpp:90
static DcHardware dcHardware[ETB_COUNT+DC_PER_STEPPER]
Definition dc_motors.cpp:84
void setDcMotorFrequency(size_t index, int hz)
void showDcMotorInfo(int i)
void setDcMotorDuty(size_t index, float duty)
DcHardware * getPrimaryDCHardwareForLogging()
Definition dc_motors.cpp:86
static EngineAccessor engine
Definition engine.h:413
static constexpr engine_configuration_s * engineConfiguration
static float frequency
Definition init_flex.cpp:21
void startSimplePwmHard(SimplePwm *state, const char *msg, Scheduler *executor, brain_pin_e brainPin, OutputPin *output, float frequency, float dutyCycle)
static float duty