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
15
16// todo: rename to intakeVvtTable?
17static vvt_map_t vvtTable1{"vvt1"};
18static vvt_map_t vvtTable2{"vvt2"};
19
21 : index(p_index)
22 , m_bank(BANK_BY_INDEX(p_index))
23 , m_cam(CAM_BY_INDEX(p_index))
24{
25}
26
27void VvtController::init(const ValueProvider3D* targetMap, IPwm* pwm) {
28 // Use the same settings for the Nth cam in every bank (ie, all exhaust cams use the same PID)
30
32 m_pwm = pwm;
33}
34
49
51 if (!previousConfig || !m_pid.isSame(&previousConfig->auxPid[m_cam])) {
52 m_pid.reset();
53 }
54}
55
56expected<angle_t> VvtController::observePlant() {
57#if EFI_SHAFT_POSITION_INPUT
59#else
60 return unexpected;
61#endif // EFI_SHAFT_POSITION_INPUT
62}
63
64expected<angle_t> VvtController::getSetpoint() {
66 bool enabled = m_engineRunningLongEnough &&
67#if EFI_PROD_CODE || EFI_UNIT_TEST
68// simulator functional test does not have CLT or flag?
70#endif
72 if (!enabled) {
73 return unexpected;
74 }
75
76 float load = getFuelingLoad();
77 float target = m_targetMap->getValue(rpm, load);
78
79#if EFI_TUNER_STUDIO
81#endif
82
83 vvtTarget = target;
84
85 return target;
86}
87
88expected<percent_t> VvtController::getOpenLoop(angle_t target) {
89 // TODO: could we do VVT open loop?
90 UNUSED(target);
91 return 0;
92}
93
94static bool shouldInvertVvt(int camIndex) {
95 // grumble grumble, can't do an array of bits in c++
96 switch (camIndex) {
99 }
100
101 return false;
102}
103
104expected<percent_t> VvtController::getClosedLoop(angle_t target, angle_t observation) {
105 // User labels say "advance" and "retard"
106 // "advance" means that additional solenoid duty makes indicated VVT position more positive
107 // "retard" means that additional solenoid duty makes indicated VVT position more negative
109 m_pid.setErrorAmplification(isInverted ? -1.0f : 1.0f);
110
111 float retVal = m_pid.getOutput(target, observation);
112
113#if EFI_TUNER_STUDIO
115#endif /* EFI_TUNER_STUDIO */
116
117 return retVal;
118}
119
120void VvtController::setOutput(expected<percent_t> outputValue) {
121#if EFI_SHAFT_POSITION_INPUT
122 vvtOutput = outputValue.value_or(0);
123
124 if (outputValue) {
126 } else {
128
129 // we need to avoid accumulating iTerm while engine is not running
130 m_pid.reset();
131 }
132#endif // EFI_SHAFT_POSITION_INPUT
133}
134
135#if EFI_VVT_PID
136
137static const char *vvtOutputNames[CAM_INPUTS_COUNT] = {
138"Vvt Output#1",
139#if CAM_INPUTS_COUNT > 1
140"Vvt Output#2",
141#endif
142#if CAM_INPUTS_COUNT > 2
143"Vvt Output#3",
144#endif
145#if CAM_INPUTS_COUNT > 3
146"Vvt Output#4",
147#endif
148 };
149
150static OutputPin vvtPins[CAM_INPUTS_COUNT];
151static SimplePwm vvtPwms[CAM_INPUTS_COUNT] = { "VVT1", "VVT2", "VVT3", "VVT4" };
152
154 return &vvtPins[index];
155}
156
157static void applyVvtPinState(int stateIndex, PwmConfig *state) /* pwm_gen_callback */ {
158 OutputPin *output = state->outputPins[0];
159 if (output == getOutputOnTheBenchTest()) {
160 return;
161 }
162 state->applyPwmValue(output, stateIndex);
163}
164
165static void turnVvtPidOn(int index) {
167 return;
168 }
169
173 getVvtOutputPin(index),
176}
177
179 for (int i = 0;i <CAM_INPUTS_COUNT;i++) {
180 turnVvtPidOn(i);
181 }
182}
183
185 for (int i = 0;i < CAM_INPUTS_COUNT;i++) {
187 }
188}
189
203
204#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:35
bool m_engineRunningLongEnough
Definition vvt.h:58
expected< angle_t > getSetpoint() override
Definition vvt.cpp:64
void onConfigurationChange(engine_configuration_s const *previousConfig) override
Definition vvt.cpp:50
expected< percent_t > getOpenLoop(angle_t target) override
Definition vvt.cpp:88
bool m_isCltWarmEnough
Definition vvt.h:60
expected< percent_t > getClosedLoop(angle_t setpoint, angle_t observation) override
Definition vvt.cpp:104
void setOutput(expected< percent_t > outputValue) override
Definition vvt.cpp:120
VvtController(int index)
Definition vvt.cpp:20
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:56
bool m_isRpmHighEnough
Definition vvt.h:59
void init(const ValueProvider3D *targetMap, IPwm *pwm)
Definition vvt.cpp:27
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, 1879, 1.0, -1.0, -1.0, "")
virtual void setSimplePwmDutyCycle(float dutyCycle)=0
pid_status_s vvtStatus[CAM_INPUTS_COUNT]
int8_t vvtTable1[VVT_TABLE_SIZE][VVT_TABLE_RPM_SIZE]
int8_t vvtTable2[VVT_TABLE_SIZE][VVT_TABLE_RPM_SIZE]
scaled_channel< int16_t, 10, 1 > vvtTarget
scaled_channel< uint8_t, 2, 1 > vvtOutput
void stopVvtControlPins()
Definition vvt.cpp:184
static OutputPin vvtPins[CAM_INPUTS_COUNT]
Definition vvt.cpp:150
static const char * vvtOutputNames[CAM_INPUTS_COUNT]
Definition vvt.cpp:137
void initVvtActuators()
Definition vvt.cpp:190
void startVvtControlPins()
Definition vvt.cpp:178
static void applyVvtPinState(int stateIndex, PwmConfig *state)
Definition vvt.cpp:157
static vvt_map_t vvtTable1
Definition vvt.cpp:17
static SimplePwm vvtPwms[CAM_INPUTS_COUNT]
Definition vvt.cpp:151
static void turnVvtPidOn(int index)
Definition vvt.cpp:165
static bool shouldInvertVvt(int camIndex)
Definition vvt.cpp:94
static vvt_map_t vvtTable2
Definition vvt.cpp:18
OutputPin * getVvtOutputPin(int index)
Definition vvt.cpp:153