diff --git a/firmware/console/binary/output_channels.txt b/firmware/console/binary/output_channels.txt index 05a99a651e..fce34b311e 100644 --- a/firmware/console/binary/output_channels.txt +++ b/firmware/console/binary/output_channels.txt @@ -366,5 +366,7 @@ uint16_t rpmAcceleration;dRPM;"RPM/s",1, 0, 0, 5, 0 uint16_t auxSpeed1;"aux speed 1";"s",1, 0, 0, 0, 0 uint16_t auxSpeed2;"aux speed 2";"s",1, 0, 0, 0, 0 - uint8_t[80 iterate] unusedAtTheEnd;;"",1, 0, 0, 0, 0 + uint16_t autoscale ISSValue;@@GAUGE_NAME_ISS@@;"RPM",1, 0, 0, 8000, 0 + + uint8_t[78 iterate] unusedAtTheEnd;;"",1, 0, 0, 0, 0 end_struct diff --git a/firmware/console/status_loop.cpp b/firmware/console/status_loop.cpp index b7464624a4..9420bcd245 100644 --- a/firmware/console/status_loop.cpp +++ b/firmware/console/status_loop.cpp @@ -590,6 +590,8 @@ static void updateMiscSensors() { engine->outputChannels.wastegatePositionSensor = Sensor::getOrZero(SensorType::WastegatePosition); + engine->outputChannels.ISSValue = Sensor::getOrZero(SensorType::InputShaftSpeed); + #if HAL_USE_ADC engine->outputChannels.internalMcuTemperature = getMCUInternalTemperature(); #endif /* HAL_USE_ADC */ diff --git a/firmware/controllers/sensors/converters/input_shaft_speed_converter.h b/firmware/controllers/sensors/converters/input_shaft_speed_converter.h new file mode 100644 index 0000000000..04ef1cfc20 --- /dev/null +++ b/firmware/controllers/sensors/converters/input_shaft_speed_converter.h @@ -0,0 +1,9 @@ +#include "pch.h" +#include "sensor_converter_func.h" + +class InputShaftSpeedConverter : public SensorConverter { +public: + SensorResult convert(float frequency) const override { + return frequency * 60 / engineConfiguration->vssToothCount; + } +}; diff --git a/firmware/controllers/sensors/sensor_type.h b/firmware/controllers/sensors/sensor_type.h index c1bbf334f9..24346d6a7c 100644 --- a/firmware/controllers/sensors/sensor_type.h +++ b/firmware/controllers/sensors/sensor_type.h @@ -94,6 +94,9 @@ enum class SensorType : unsigned char { AuxSpeed1, AuxSpeed2, + + InputShaftSpeed, + // Leave me at the end! PlaceholderLast, }; diff --git a/firmware/init/init.h b/firmware/init/init.h index f5e572db1f..79c70bb473 100644 --- a/firmware/init/init.h +++ b/firmware/init/init.h @@ -33,6 +33,7 @@ void initAuxSensors(); void initVehicleSpeedSensor(); void initTurbochargerSpeedSensor(); void initAuxSpeedSensors(); +void initInputShaftSpeedSensor(); // Sensor reconfiguration void deinitVbatt(); @@ -44,3 +45,4 @@ void deInitVehicleSpeedSensor(); void deinitTurbochargerSpeedSensor(); void deinitMap(); void deinitAuxSpeedSensors(); +void deinitInputShaftSpeedSensor(); diff --git a/firmware/init/init.mk b/firmware/init/init.mk index 4d3c578536..0134212160 100644 --- a/firmware/init/init.mk +++ b/firmware/init/init.mk @@ -15,3 +15,4 @@ INIT_SRC_CPP = $(PROJECT_DIR)/init/sensor/init_sensors.cpp \ $(PROJECT_DIR)/init/sensor/init_vehicle_speed_sensor.cpp \ $(PROJECT_DIR)/init/sensor/init_aux_speed_sensor.cpp \ $(PROJECT_DIR)/init/sensor/init_turbocharger_speed_sensor.cpp \ + $(PROJECT_DIR)/init/sensor/init_input_shaft_speed_sensor.cpp \ diff --git a/firmware/init/sensor/init_input_shaft_speed_sensor.cpp b/firmware/init/sensor/init_input_shaft_speed_sensor.cpp new file mode 100644 index 0000000000..4136d02367 --- /dev/null +++ b/firmware/init/sensor/init_input_shaft_speed_sensor.cpp @@ -0,0 +1,23 @@ +#include "pch.h" + +#include "init.h" +#include "frequency_sensor.h" +#include "input_shaft_speed_converter.h" + +static FrequencySensor inputShaftSpeedSensor(SensorType::InputShaftSpeed, MS2NT(500)); +static InputShaftSpeedConverter inputSpeedConverter; + +void initInputShaftSpeedSensor() { + int parameter = engineConfiguration->issFilterReciprocal; + + if (parameter <= 0 || parameter > 200) { + parameter = 2; + } + + float filterParameter = 1.0f / parameter; + inputShaftSpeedSensor.initIfValid(engineConfiguration->tcuInputSpeedSensorPin, inputSpeedConverter, filterParameter); +} + +void deinitInputShaftSpeedSensor() { + inputShaftSpeedSensor.deInit(); +} diff --git a/firmware/init/sensor/init_sensors.cpp b/firmware/init/sensor/init_sensors.cpp index f22818d2ba..2ab97314b9 100644 --- a/firmware/init/sensor/init_sensors.cpp +++ b/firmware/init/sensor/init_sensors.cpp @@ -62,6 +62,7 @@ void initNewSensors() { initVehicleSpeedSensor(); initTurbochargerSpeedSensor(); initAuxSpeedSensors(); + initInputShaftSpeedSensor(); #if !EFI_UNIT_TEST initFuelLevel(); @@ -86,6 +87,7 @@ void stopSensors() { deinitTurbochargerSpeedSensor(); deinitAuxSpeedSensors(); deinitMap(); + deinitInputShaftSpeedSensor(); } void reconfigureSensors() { @@ -97,6 +99,7 @@ void reconfigureSensors() { initFlexSensor(); initVehicleSpeedSensor(); initTurbochargerSpeedSensor(); + initInputShaftSpeedSensor(); initOldAnalogInputs(); } diff --git a/firmware/integration/rusefi_config.txt b/firmware/integration/rusefi_config.txt index 75c8487317..e37d86f9a2 100644 --- a/firmware/integration/rusefi_config.txt +++ b/firmware/integration/rusefi_config.txt @@ -749,7 +749,10 @@ pin_input_mode_e throttlePedalUpPinMode; uint8_t acIdleExtraOffset;+Additional idle % while A/C is active;"%", 1, 0, 0, 100, 0 uint16_t autoscale finalGearRatio;Ratio between the wheels and your transmission output. ;"ratio", 0.01, 0, 0, 10, 2 - uint16_t autoscale unused722;;"", 1, 0, 0, 0, 0 + + brain_input_pin_e tcuInputSpeedSensorPin + uint8_t tcuInputSpeedSensorTeeth + uint16_t wastegatePositionMin;+Voltage when the wastegate is closed.\nYou probably don't have one of these!;"mv", 1, 0, 0, 5000, 0 uint16_t wastegatePositionMax;+Voltage when the wastegate is fully open.\nYou probably don't have one of these!\n1 volt = 1000 units;"mv", 1, 0, 0, 5000, 0 uint16_t idlePositionMin;+Voltage when the idle valve is closed.\nYou probably don't have one of these!;"mv", 1, 0, 0, 5000, 0 @@ -1506,7 +1509,7 @@ int8_t[MAX_CYLINDER_COUNT iterate] fuelTrim;;"Percent", @@PERCENT_TRIM_BYTE_PACK uint8_t hpfpMinAngle;+If the requested activation time is below this angle, don't bother running the pump;"deg", 1, 0, 0, 255, 0 uint16_t autoscale hpfpPumpVolume;+Size of the pump chamber in cc. Typical Bosch HDP5 has a 9.0mm diameter, typical BMW N* stroke is 4.4mm.;"cc", 0.001, 0, 0, 65, 3 uint8_t hpfpActivationAngle;+How long to keep the valve activated (in order to allow the pump to build pressure and keep the valve open on its own);"deg", 1, 0, 0, 255, 0 - uint8_t unusedFiller_4703;;"", 1, 0, 0, 255, 0 + uint8_t issFilterReciprocal uint16_t autoscale hpfpPidP;;"%/kPa", 0.001, 0, 0, 65, 3 uint16_t autoscale hpfpPidI;;"%/kPa/lobe", 0.00001, 0, 0, 0.65, 5 uint16_t hpfpTargetDecay;+The fastest rate the target pressure can be reduced by. This is because HPFP have no way to bleed off pressure other than injecting fuel.;"kPa/s", 1, 0, 0, 65000, 0 @@ -1748,6 +1751,7 @@ end_struct #define GAUGE_NAME_DESIRED_GEAR "Desired Gear" #define GAUGE_NAME_CURRENT_GEAR "Current Gear" +#define GAUGE_NAME_ISS "Input Shaft Speed" #define GAUGE_NAME_TIMING_ADVANCE "timing" #define GAUGE_NAME_VVS "Vehicle Speed" diff --git a/firmware/tunerstudio/rusefi.input b/firmware/tunerstudio/rusefi.input index 0e9d060bf7..0cef7768ad 100644 --- a/firmware/tunerstudio/rusefi.input +++ b/firmware/tunerstudio/rusefi.input @@ -1214,6 +1214,7 @@ gaugeCategory = Transmission currentGearGauge = tcuCurrentGear, @@GAUGE_NAME_CURRENT_GEAR@@, "gear", -1, 10, -1, -1, 10, 10, 0, 0 detectedGearGauge = detectedGear, @@GAUGE_NAME_DETECTED_GEAR@@, "gear", 0, @@GEARS_COUNT@@, 0, 0, @@GEARS_COUNT@@, @@GEARS_COUNT@@, 0, 0 speedToRpmRatioGauge = speedToRpmRatio, @@GAUGE_NAME_GEAR_RATIO@@, "", 0, 100, 0, 0, 100, 100, 4, 4 + ISSGauge = ISSValue, @@GAUGE_NAME_ISS@@, "RPM", 0, {rpmHardLimit + 2000}, 200, {cranking_rpm}, {rpmHardLimit - 500}, {rpmHardLimit}, 0, 0 gaugeCategory = Knock knock1Gauge = knock1, "Knock Cyl 1", "dBv", -60, 10, -60, -60, 10, 10, 0, 0 @@ -1542,7 +1543,9 @@ menuDialog = main subMenu = std_separator subMenu = tcuControls, "Transmission Settings" - subMenu = tcuSolenoidTableTbl, "TCU Solenoids" + subMenu = gearControls, "Gear Selection Settings" + subMenu = inputSpeedSensor, "Input Speed Sensor" + subMenu = tcuSolenoidTableTbl, "Shift Solenoids" subMenu = tccCurves, "TCC Lock/Unlock Speed" subMenu = pcPerGearDialog, "Line Pressure Per Gear" subMenu = pcPerShiftDialog, "Line Pressure Per Shift" @@ -3451,7 +3454,7 @@ cmd_set_engine_type_default = "@@TS_IO_TEST_COMMAND_char@@\x00\x31\x00\x00" field = "Gear Controller" gearControllerMode, { tcuEnabled } field = "Transmission Controller" transmissionControllerMode, { tcuEnabled } - dialog = solenoidPanel, "Shift Solenoids" + dialog = shiftSolenoidPanel, "Shift Solenoids" field = "Solenoid 1 Pin" tcu_solenoid1, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } field = "Solenoid 1 Pin Mode" tcu_solenoid_mode1, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } field = "Solenoid 2 Pin" tcu_solenoid2, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } @@ -3464,6 +3467,11 @@ cmd_set_engine_type_default = "@@TS_IO_TEST_COMMAND_char@@\x00\x31\x00\x00" field = "Solenoid 5 Pin Mode" tcu_solenoid_mode5, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } field = "Solenoid 6 Pin" tcu_solenoid6, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } field = "Solenoid 6 Pin Mode" tcu_solenoid_mode6, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_SimpleTransmissionController@@ || transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } + field = "3-2 Solenoid Pin" tcu_32_solenoid_pin, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } + field = "3-2 Solenoid Pin mode" tcu_32_solenoid_pin_mode, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } + field = "3-2 Solenoid Frequency" tcu_32_solenoid_freq, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } + + dialog = otherSolenoidPanel, "Other Solenoids" field = "TCC On/Off Solenoid Pin" tcu_tcc_onoff_solenoid, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } field = "TCC On/Off Solenoid Pin Mode" tcu_tcc_onoff_solenoid_mode, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } field = "TCC PWM Solenoid Pin" tcu_tcc_pwm_solenoid, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } @@ -3472,9 +3480,6 @@ cmd_set_engine_type_default = "@@TS_IO_TEST_COMMAND_char@@\x00\x31\x00\x00" field = "Pressure Control Solenoid Pin" tcu_pc_solenoid_pin, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } field = "Pressure Control Solenoid Pin Mode" tcu_pc_solenoid_pin_mode, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } field = "Pressure Control Solenoid Frequency" tcu_pc_solenoid_freq, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } - field = "3-2 Solenoid Pin" tcu_32_solenoid_pin, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } - field = "3-2 Solenoid Pin mode" tcu_32_solenoid_pin_mode, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } - field = "3-2 Solenoid Frequency" tcu_32_solenoid_freq, { tcuEnabled && (transmissionControllerMode == @@TransmissionControllerMode_Gm4l6x@@) } dialog = buttonShiftInputPanel, "Switch/Button Shift" field = "Upshift Pin" tcuUpshiftButtonPin, { tcuEnabled && gearControllerMode == @@GearControllerMode_ButtonShift@@ } @@ -3482,11 +3487,22 @@ cmd_set_engine_type_default = "@@TS_IO_TEST_COMMAND_char@@\x00\x31\x00\x00" field = "Downshift Pin" tcuDownshiftButtonPin, { tcuEnabled && gearControllerMode == @@GearControllerMode_ButtonShift@@ } field = "Downshift Pin Mode" tcuDownshiftButtonPinMode, { tcuEnabled && gearControllerMode == @@GearControllerMode_ButtonShift@@ } - dialog = tcuControls, "Transmission Settings" + dialog = inputSpeedSensorPanel, "Input Speed Sensor" + field = "Input Pin", tcuInputSpeedSensorPin + field = "Filter parameter", issFilterReciprocal, { tcuInputSpeedSensorPin != @@ADC_CHANNEL_NONE@@ } + field = "Tooth Count", tcuInputSpeedSensorTeeth + +dialog = tcuControls, "Transmission Settings" panel = transmissionPanel - panel = solenoidPanel + panel = shiftSolenoidPanel + panel = otherSolenoidPanel + + dialog = gearControls, "Gear Selection Settings" panel = buttonShiftInputPanel + dialog = inputSpeedSensor, "Input Speed Sensor" + panel = inputSpeedSensorPanel + dialog = tccCurves, "TCC Lock/Unlock Speed" panel = tccLockCurve