diff --git a/firmware/config/engines/ford_fiesta.cpp b/firmware/config/engines/ford_fiesta.cpp index 05cfce2d23..7db58326ef 100644 --- a/firmware/config/engines/ford_fiesta.cpp +++ b/firmware/config/engines/ford_fiesta.cpp @@ -27,6 +27,7 @@ void setFordFiestaDefaultEngineConfiguration(DECLARE_ENGINE_PARAMETER_F) { engineConfiguration->ignitionMode = IM_WASTED_SPARK; engineConfiguration->specs.firingOrder = FO_1_THEN_3_THEN_4_THEN2; engineConfiguration->hasMafSensor = true; + engineConfiguration->afr.hwChannel = EFI_ADC_NONE; engineConfiguration->mafAdcChannel = EFI_ADC_14; // engineConfiguration->mafAdcChannel = EFI_ADC_NONE; this would kill functional tests @@ -35,6 +36,7 @@ void setFordFiestaDefaultEngineConfiguration(DECLARE_ENGINE_PARAMETER_F) { // boardConfiguration->clutchUpPin boardConfiguration->etbControlPin1 = GPIOD_3; engineConfiguration->pedalPositionChannel = EFI_ADC_1; + boardConfiguration->etbDirectionPin2 = GPIOD_5; engineConfiguration->tpsMin = 337; engineConfiguration->tpsMax = 896; diff --git a/firmware/controllers/electronic_throttle.cpp b/firmware/controllers/electronic_throttle.cpp index f91e5ea72b..7f74096f50 100644 --- a/firmware/controllers/electronic_throttle.cpp +++ b/firmware/controllers/electronic_throttle.cpp @@ -36,6 +36,7 @@ #if EFI_ELECTRONIC_THROTTLE_BODY || defined(__DOXYGEN__) #define ETB_FREQ 400 +extern pin_output_mode_e DEFAULT_OUTPUT; static LoggingWithStorage logger("ETB"); /** @@ -45,10 +46,13 @@ static THD_WORKING_AREA(etbTreadStack, UTILITY_THREAD_STACK_SIZE); /** * @brief Pulse-Width Modulation state */ -static SimplePwm etbPwmUp; -static OutputPin output1; -static SimplePwm etbPwmDown; -static OutputPin output2; +static SimplePwm etbPwmUp CCM_OPTIONAL; +static OutputPin output1 CCM_OPTIONAL; +static SimplePwm etbPwmDown CCM_OPTIONAL; +static OutputPin output2 CCM_OPTIONAL; + +static OutputPin outputDirectionOpen CCM_OPTIONAL; +static OutputPin outputDirectionClose CCM_OPTIONAL; static Pid pid(1, 0, 0, 0, 100); @@ -58,16 +62,25 @@ static float currentEtbDuty; EXTERN_ENGINE; +static bool_t wasEtbBraking = false; + static msg_t etbThread(void *arg) { UNUSED(arg); while (true) { - float pedal = getPedalPosition(PASS_ENGINE_PARAMETER_F); - float tps = getTPS(); + percent_t pedal = getPedalPosition(PASS_ENGINE_PARAMETER_F); + percent_t tps = getTPS(); currentEtbDuty = pid.getValue(pedal, getTPS(), 1); etbPwmUp.setSimplePwmDutyCycle(currentEtbDuty / 100); + bool_t needEtbBraking = absF(pedal - tps) < 3; + if (needEtbBraking != wasEtbBraking) { + scheduleMsg(&logger, "need ETB braking: %d", needEtbBraking); + wasEtbBraking = needEtbBraking; + } + outputDirectionClose.setValue(needEtbBraking); + // if (tps != prevTps) { // prevTps = tps; @@ -96,10 +109,11 @@ static void showEthInfo(void) { scheduleMsg(&logger, "pedal=%f %d/%d @", getPedalPosition(), engineConfiguration->pedalPositionMin, engineConfiguration->pedalPositionMax, getPinNameByAdcChannel(engineConfiguration->pedalPositionChannel, pinNameBuffer)); - scheduleMsg(&logger, "tsp=%f", getTPS()); + scheduleMsg(&logger, "TPS=%f", getTPS()); scheduleMsg(&logger, "etbControlPin1=%s duty=%f", hwPortname(boardConfiguration->etbControlPin1), currentEtbDuty); + scheduleMsg(&logger, "close dir=%s", hwPortname(boardConfiguration->etbDirectionPin2)); scheduleMsg(&logger, "etb P=%f I=%f D=%f dT=%d", boardConfiguration->etbPFactor, boardConfiguration->etbIFactor, 0.0, @@ -152,6 +166,9 @@ void initElectronicThrottle(void) { 0.80, applyPinState); + outputPinRegisterExt2("etb dir open", &outputDirectionOpen, boardConfiguration->etbDirectionPin1, &DEFAULT_OUTPUT); + outputPinRegisterExt2("etb dir close", &outputDirectionClose, boardConfiguration->etbDirectionPin2, &DEFAULT_OUTPUT); + addConsoleActionI("e", setThrottleConsole); addConsoleAction("ethinfo", showEthInfo);