rusEFI
The most advanced open source ECU
Loading...
Searching...
No Matches
vvt.cpp
Go to the documentation of this file.
1/*
2 * @file vvt.cpp
3 *
4 * @date Jun 26, 2016
5 * @author Andrey Belomutskiy, (c) 2012-2020
6 */
7
8#include "pch.h"
9
11#include "vvt.h"
12#include "bench_test.h"
13
14#define NO_PIN_PERIOD 500
15
17
18// todo: rename to intakeVvtTable?
19static vvt_map_t vvtTable1{"vvt1"};
20static vvt_map_t vvtTable2{"vvt2"};
21
23 : index(p_index)
24 , m_bank(BANK_BY_INDEX(p_index))
25 , m_cam(CAM_BY_INDEX(p_index))
26{
27}
28
29void VvtController::init(const ValueProvider3D* targetMap, IPwm* pwm) {
30 // Use the same settings for the Nth cam in every bank (ie, all exhaust cams use the same PID)
32
34 m_pwm = pwm;
35}
36
51
53 if (!previousConfig || !m_pid.isSame(&previousConfig->auxPid[m_cam])) {
54 m_pid.reset();
55 }
56}
57
58expected<angle_t> VvtController::observePlant() {
59#if EFI_SHAFT_POSITION_INPUT
61#else
62 return unexpected;
63#endif // EFI_SHAFT_POSITION_INPUT
64}
65
66expected<angle_t> VvtController::getSetpoint() {
68 bool enabled = m_engineRunningLongEnough &&
69#if EFI_PROD_CODE || EFI_UNIT_TEST
70// simulator functional test does not have CLT or flag?
72#endif
74 if (!enabled) {
75 return unexpected;
76 }
77
78 float load = getFuelingLoad();
79 float target = m_targetMap->getValue(rpm, load);
80
81#if EFI_TUNER_STUDIO
83#endif
84
85 vvtTarget = target;
86
87 return target;
88}
89
90expected<percent_t> VvtController::getOpenLoop(angle_t target) {
91 // TODO: could we do VVT open loop?
92 UNUSED(target);
93 return 0;
94}
95
96static bool shouldInvertVvt(int camIndex) {
97 // grumble grumble, can't do an array of bits in c++
98 switch (camIndex) {
101 }
102
103 return false;
104}
105
106expected<percent_t> VvtController::getClosedLoop(angle_t target, angle_t observation) {
107 // User labels say "advance" and "retard"
108 // "advance" means that additional solenoid duty makes indicated VVT position more positive
109 // "retard" means that additional solenoid duty makes indicated VVT position more negative
111 m_pid.setErrorAmplification(isInverted ? -1.0f : 1.0f);
112
113 float retVal = m_pid.getOutput(target, observation);
114
115#if EFI_TUNER_STUDIO
117#endif /* EFI_TUNER_STUDIO */
118
119 return retVal;
120}
121
122void VvtController::setOutput(expected<percent_t> outputValue) {
123#if EFI_SHAFT_POSITION_INPUT
124 vvtOutput = outputValue.value_or(0);
125
126 if (outputValue) {
128 } else {
130
131 // we need to avoid accumulating iTerm while engine is not running
132 m_pid.reset();
133 }
134#endif // EFI_SHAFT_POSITION_INPUT
135}
136
137#if EFI_VVT_PID
138
139static const char *vvtOutputNames[CAM_INPUTS_COUNT] = {
140"Vvt Output#1",
141#if CAM_INPUTS_COUNT > 1
142"Vvt Output#2",
143#endif
144#if CAM_INPUTS_COUNT > 2
145"Vvt Output#3",
146#endif
147#if CAM_INPUTS_COUNT > 3
148"Vvt Output#4",
149#endif
150 };
151
152static OutputPin vvtPins[CAM_INPUTS_COUNT];
153static SimplePwm vvtPwms[CAM_INPUTS_COUNT] = { "VVT1", "VVT2", "VVT3", "VVT4" };
154
156 return &vvtPins[index];
157}
158
159static void applyVvtPinState(int stateIndex, PwmConfig *state) /* pwm_gen_callback */ {
160 OutputPin *output = state->outputPins[0];
161 if (output == getOutputOnTheBenchTest()) {
162 return;
163 }
164 state->applyPwmValue(output, stateIndex);
165}
166
167static void turnVvtPidOn(int index) {
169 return;
170 }
171
175 getVvtOutputPin(index),
178}
179
181 for (int i = 0;i <CAM_INPUTS_COUNT;i++) {
182 turnVvtPidOn(i);
183 }
184}
185
187 for (int i = 0;i < CAM_INPUTS_COUNT;i++) {
189 }
190}
191
205
206#endif
const OutputPin * getOutputOnTheBenchTest()
Utility methods related to bench testing.
TriggerCentral triggerCentral
Definition engine.h:318
SingleTimerExecutor scheduler
Definition engine.h:271
RpmCalculator rpmCalculator
Definition engine.h:306
TunerStudioOutputChannels outputChannels
Definition engine.h:109
constexpr auto & module()
Definition engine.h:200
void initTable(TValueInit(&table)[TRowNum][TColNum], const TXColumnInit(&columnBins)[TColNum], const TRowInit(&rowBins)[TRowNum])
Single output pin reference and state.
Definition efi_output.h:49
void deInit()
Definition efi_gpio.cpp:802
bool isSame(const pid_s *parameters) const
Definition efi_pid.cpp:39
void setErrorAmplification(float coef)
Definition efi_pid.cpp:138
void postState(pid_status_s &pidStatus) const
Definition efi_pid.cpp:144
virtual void reset()
Definition efi_pid.cpp:103
void initPidClass(pid_s *parameters)
Definition efi_pid.cpp:24
float getOutput(float target, float input)
Definition efi_pid.cpp:56
Multi-channel software PWM output configuration.
float getSecondsSinceEngineStart(efitick_t nowNt) const
static float getOrZero(SensorType type)
Definition sensor.h:83
angle_t getVVTPosition(uint8_t bankIndex, uint8_t camIndex)
virtual float getValue(float xColumn, float yRow) const =0
IPwm * m_pwm
Definition vvt.h:63
void onFastCallback() override
Definition vvt.cpp:37
bool m_engineRunningLongEnough
Definition vvt.h:58
expected< angle_t > getSetpoint() override
Definition vvt.cpp:66
void onConfigurationChange(engine_configuration_s const *previousConfig) override
Definition vvt.cpp:52
expected< percent_t > getOpenLoop(angle_t target) override
Definition vvt.cpp:90
bool m_isCltWarmEnough
Definition vvt.h:60
expected< percent_t > getClosedLoop(angle_t setpoint, angle_t observation) override
Definition vvt.cpp:106
void setOutput(expected< percent_t > outputValue) override
Definition vvt.cpp:122
VvtController(int index)
Definition vvt.cpp:22
Pid m_pid
Definition vvt.h:55
const ValueProvider3D * m_targetMap
Definition vvt.h:62
const uint8_t m_bank
Definition vvt.h:51
expected< angle_t > observePlant() override
Definition vvt.cpp:58
bool m_isRpmHighEnough
Definition vvt.h:59
void init(const ValueProvider3D *targetMap, IPwm *pwm)
Definition vvt.cpp:29
const int index
Definition vvt.h:49
const uint8_t m_cam
Definition vvt.h:53
efitick_t getTimeNowNt()
Definition efitime.cpp:19
static EngineAccessor engine
Definition engine.h:413
static constexpr persistent_config_s * config
static constexpr engine_configuration_s * engineConfiguration
float getFuelingLoad()
UNUSED(samplingTimeSeconds)
bool isBrainPinValid(brain_pin_e brainPin)
void startSimplePwmExt(SimplePwm *state, const char *msg, Scheduler *executor, brain_pin_e brainPin, OutputPin *output, float frequency, float dutyCycle, pwm_gen_callback *callback)
state("state", SensorCategory.SENSOR_INPUTS, FieldType.INT8, 1871, 1.0, -1.0, -1.0, "")
virtual void setSimplePwmDutyCycle(float dutyCycle)=0
pid_status_s vvtStatus[CAM_INPUTS_COUNT]
scaled_channel< int16_t, 10, 1 > vvtTarget
scaled_channel< uint8_t, 2, 1 > vvtOutput
void stopVvtControlPins()
Definition vvt.cpp:186
static OutputPin vvtPins[CAM_INPUTS_COUNT]
Definition vvt.cpp:152
static const char * vvtOutputNames[CAM_INPUTS_COUNT]
Definition vvt.cpp:139
void initVvtActuators()
Definition vvt.cpp:192
void startVvtControlPins()
Definition vvt.cpp:180
static void applyVvtPinState(int stateIndex, PwmConfig *state)
Definition vvt.cpp:159
static vvt_map_t vvtTable1
Definition vvt.cpp:19
static SimplePwm vvtPwms[CAM_INPUTS_COUNT]
Definition vvt.cpp:153
static void turnVvtPidOn(int index)
Definition vvt.cpp:167
static bool shouldInvertVvt(int camIndex)
Definition vvt.cpp:96
static vvt_map_t vvtTable2
Definition vvt.cpp:20
OutputPin * getVvtOutputPin(int index)
Definition vvt.cpp:155