From 215284c7bc41705e9543f1819f28f48ae8faeb9a Mon Sep 17 00:00:00 2001 From: rusefillc Date: Mon, 9 Oct 2023 10:51:21 -0400 Subject: [PATCH] DAC with Lua #5601 --- .../config/boards/f407-discovery/board.mk | 2 + firmware/config/stm32f4ems/efifeatures.h | 4 ++ firmware/hw_layer/drivers/dac.cpp | 41 +++++++++++++++++++ firmware/hw_layer/drivers/dac.h | 25 +++++++++++ firmware/hw_layer/drivers/drivers.mk | 1 + firmware/hw_layer/hardware.cpp | 5 +++ .../ports/stm32/mcuconf_common_f4_f7.h | 4 ++ firmware/integration/rusefi_config.txt | 4 +- firmware/tunerstudio/rusefi.input | 5 +++ 9 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 firmware/hw_layer/drivers/dac.cpp create mode 100644 firmware/hw_layer/drivers/dac.h diff --git a/firmware/config/boards/f407-discovery/board.mk b/firmware/config/boards/f407-discovery/board.mk index 10b396b63f..4307237716 100644 --- a/firmware/config/boards/f407-discovery/board.mk +++ b/firmware/config/boards/f407-discovery/board.mk @@ -25,6 +25,8 @@ DDEFS += -DEFI_KLINE=TRUE DDEFS += -DKLINE_SERIAL_DEVICE_RX=Gpio::C11 -DKLINE_SERIAL_DEVICE_TX=Gpio::C10 DDEFS += -DKLINE_SERIAL_DEVICE=SD3 +DDEFS += -DEFI_DAC=TRUE -DHAL_USE_DAC=TRUE -DSTM32_DAC_USE_DAC1_CH1=TRUE + DDEFS += -DBOARD_TLE9104_COUNT=2 # We are running on Frankenso hardware! diff --git a/firmware/config/stm32f4ems/efifeatures.h b/firmware/config/stm32f4ems/efifeatures.h index 27dcb42158..d5a5bf8ca5 100644 --- a/firmware/config/stm32f4ems/efifeatures.h +++ b/firmware/config/stm32f4ems/efifeatures.h @@ -19,6 +19,10 @@ #define EFI_BOOST_CONTROL TRUE #endif +#ifndef EFI_DAC +#define EFI_DAC FALSE +#endif + #ifndef EFI_LAUNCH_CONTROL #define EFI_LAUNCH_CONTROL TRUE #endif diff --git a/firmware/hw_layer/drivers/dac.cpp b/firmware/hw_layer/drivers/dac.cpp new file mode 100644 index 0000000000..93b0dc5f28 --- /dev/null +++ b/firmware/hw_layer/drivers/dac.cpp @@ -0,0 +1,41 @@ +#include "dac.h" + +#include + +#if EFI_DAC + +static DACConfig dacConfig = { + .init = 4095U, /* full VCC */ + .datamode = DAC_DHRM_12BIT_RIGHT, + .cr = 0 +}; + +Dac::Dac(DACDriver& driver) + : m_driver(&driver) +{ +} + +void Dac::Start(DACConfig& config) +{ + dacStart(m_driver, &config); +} + +void Dac::SetVoltage(int channel, float voltage) { + voltage = clampF(0, voltage, engineConfiguration->adcVcc); + m_voltageFloat[channel] = voltage; + + dacPutChannelX(m_driver, channel, voltage / engineConfiguration->adcVcc * ((1 << 12) - 1)); +} + +float Dac::GetLastVoltage(int channel) +{ + return m_voltageFloat[channel]; +} + +static Dac dac(DACD1); + +void initDac() { + dac.Start(dacConfig); +} + +#endif // EFI_DAC diff --git a/firmware/hw_layer/drivers/dac.h b/firmware/hw_layer/drivers/dac.h new file mode 100644 index 0000000000..1bed393f6c --- /dev/null +++ b/firmware/hw_layer/drivers/dac.h @@ -0,0 +1,25 @@ +#pragma once + +#include + +#include "pch.h" + +#if EFI_DAC + +class Dac +{ +public: + Dac(DACDriver& driver); + + void Start(DACConfig& config); + void SetVoltage(int channel, float volage); + float GetLastVoltage(int channel); + +private: + DACDriver* const m_driver; + float m_voltageFloat[2]; +}; + +void initDac(); + +#endif diff --git a/firmware/hw_layer/drivers/drivers.mk b/firmware/hw_layer/drivers/drivers.mk index 77c0d70c6e..8af5e2dfd6 100644 --- a/firmware/hw_layer/drivers/drivers.mk +++ b/firmware/hw_layer/drivers/drivers.mk @@ -12,6 +12,7 @@ HW_LAYER_DRIVERS_INC = \ HW_LAYER_DRIVERS_CORE = \ HW_LAYER_DRIVERS_CORE_CPP = \ + $(DRIVERS_DIR)/dac.cpp \ $(DRIVERS_DIR)/gpio/core.cpp \ $(DRIVERS_DIR)/sent/sent.cpp \ $(DRIVERS_DIR)/i2c/i2c_bb.cpp \ diff --git a/firmware/hw_layer/hardware.cpp b/firmware/hw_layer/hardware.cpp index b45b73a3ee..9dbe709e6e 100644 --- a/firmware/hw_layer/hardware.cpp +++ b/firmware/hw_layer/hardware.cpp @@ -27,6 +27,7 @@ #include "idle_thread.h" #include "odometer.h" #include "kline.h" +#include "dac.h" #if EFI_PROD_CODE #include "mpu_util.h" @@ -579,6 +580,10 @@ void initHardware() { initKLine(); +#if EFI_DAC + initDac(); +#endif + calcFastAdcIndexes(); startHardware(); diff --git a/firmware/hw_layer/ports/stm32/mcuconf_common_f4_f7.h b/firmware/hw_layer/ports/stm32/mcuconf_common_f4_f7.h index b0b7111f7d..dba7c03337 100644 --- a/firmware/hw_layer/ports/stm32/mcuconf_common_f4_f7.h +++ b/firmware/hw_layer/ports/stm32/mcuconf_common_f4_f7.h @@ -77,8 +77,12 @@ * DAC driver system settings. */ #define STM32_DAC_DUAL_MODE FALSE +#ifndef STM32_DAC_USE_DAC1_CH1 #define STM32_DAC_USE_DAC1_CH1 FALSE +#endif +#ifndef STM32_DAC_USE_DAC1_CH2 #define STM32_DAC_USE_DAC1_CH2 FALSE +#endif #define STM32_DAC_DAC1_CH1_IRQ_PRIORITY PRECISE_SCHEDULING_TIMER_PRIORITY + 6 #define STM32_DAC_DAC1_CH2_IRQ_PRIORITY PRECISE_SCHEDULING_TIMER_PRIORITY + 6 #define STM32_DAC_DAC1_CH1_DMA_PRIORITY 2 diff --git a/firmware/integration/rusefi_config.txt b/firmware/integration/rusefi_config.txt index 4de039360a..4dd2d62486 100644 --- a/firmware/integration/rusefi_config.txt +++ b/firmware/integration/rusefi_config.txt @@ -1558,7 +1558,9 @@ pin_input_mode_e[LUA_DIGITAL_INPUT_COUNT iterate] luaDigitalInputPinModes; adc_channel_e throttleInletPressureChannel;Place the sensor before the throttle, but after any turbocharger/supercharger and intercoolers if fitted. Uses the same calibration as the MAP sensor. adc_channel_e compressorDischargePressureChannel;Place the sensor after the turbocharger/supercharger, but before any intercoolers if fitted. Uses the same calibration as the MAP sensor. -uint8_t[254] mainUnusedEnd;;"units", 1, 0, 0, 1, 0 + Gpio[2 iterate] dacOutputPins; + +uint8_t[250] mainUnusedEnd;;"units", 1, 0, 0, 1, 0 ! end of engine_configuration_s end_struct diff --git a/firmware/tunerstudio/rusefi.input b/firmware/tunerstudio/rusefi.input index bcb23720e6..fcdc2cd4c3 100644 --- a/firmware/tunerstudio/rusefi.input +++ b/firmware/tunerstudio/rusefi.input @@ -2024,6 +2024,7 @@ menuDialog = main subMenu = std_separator subMenu = parkingLot, "Experimental/Broken" + subMenu = parkingLot2, "Experimental 2" subMenu = antiLagDialog, "Anti-Lag ALS" subMenu = rotaryDialog, "Rotary" subMenu = throttleEffectiveArea, "Throttle effective area" @@ -4576,6 +4577,10 @@ dialog = tcuControls, "Transmission Settings" field = "etbDutyThreshold", etbDutyThreshold field = "etbDutyShutdownThreshold", etbDutyShutdownThreshold + dialog = parkingLot2, "Experimental 2" + field = dacOutputPins1, dacOutputPins1 + field = dacOutputPins2, dacOutputPins2 + dialog = parkingLot, "Experimental/Broken" ; field = uiMode, uiMode field = kLineBaudRate, kLineBaudRate