diff --git a/firmware/hw_layer/hardware.cpp b/firmware/hw_layer/hardware.cpp index 17bccd821e..3ac6d96144 100644 --- a/firmware/hw_layer/hardware.cpp +++ b/firmware/hw_layer/hardware.cpp @@ -189,7 +189,7 @@ void onFastAdcComplete(adcsample_t*) { #endif /* EFI_MAP_AVERAGING */ #if EFI_HIP_9011 if (engineConfiguration->isHip9011Enabled) { - hipAdcCallback(getFastAdc(hipSampleIndex)); + hipAdcCallback(adcToVoltsDivided(getFastAdc(hipSampleIndex))); } #endif /* EFI_HIP_9011 */ } diff --git a/firmware/hw_layer/sensors/hip9011.cpp b/firmware/hw_layer/sensors/hip9011.cpp index ac1d2b5c83..b732d1e5e8 100644 --- a/firmware/hw_layer/sensors/hip9011.cpp +++ b/firmware/hw_layer/sensors/hip9011.cpp @@ -311,7 +311,7 @@ void hip9011_onFireEvent(uint8_t cylinderNumber, efitick_t nowNt) { } } -void hipAdcCallback(adcsample_t adcValue) { +void hipAdcCallback(float volts) { /* we read in digital mode */ if (instance.adv_mode) return; @@ -320,7 +320,9 @@ void hipAdcCallback(adcsample_t adcValue) { } else if (instance.state == WAITING_FOR_RESULT_ADC) { /* offload calculations to driver thread */ if (instance.channelIdx < HIP_INPUT_CHANNELS) { - instance.rawValue[instance.channelIdx] = adcValue; + /* normalize to 0..HIP9011_DIGITAL_OUTPUT_MAX */ + instance.rawValue[instance.channelIdx] = + volts * HIP9011_DIGITAL_OUTPUT_MAX / HIP9011_ANALOG_OUTPUT_MAX; } instance.state = NOT_READY; hip_wake_driver(); @@ -483,19 +485,16 @@ static msg_t hipThread(void *arg) { /* calculations */ if (instance.adv_mode) { - /* store for debug */ instance.rawValue[idx] = rawValue; - /* convert 10 bit integer value to 0.0 .. 1.0 float */ - knockNormalized = ((float)rawValue) / HIP9011_DIGITAL_OUTPUT_MAX; - /* convert to magic volts */ - knockVolts = knockNormalized * HIP9011_DESIRED_OUTPUT_VALUE; } else { + /* get value stored by callback */ rawValue = instance.rawValue[idx]; - /* first calculate ouput volts */ - knockVolts = adcToVolts(rawValue) * engineConfiguration->analogInputDividerCoefficient; - /* and then normalize */ - knockNormalized = knockVolts / HIP9011_DESIRED_OUTPUT_VALUE; } + /* convert 10 bit integer value to 0.0 .. 1.0 float */ + knockNormalized = ((float)rawValue) / HIP9011_DIGITAL_OUTPUT_MAX; + /* convert to magic volts + * TODO: remove conversion to volts */ + knockVolts = knockNormalized * HIP9011_ANALOG_OUTPUT_MAX; /* Check for correct cylinder/input */ if (correctCylinder) { diff --git a/firmware/hw_layer/sensors/hip9011.h b/firmware/hw_layer/sensors/hip9011.h index dd93755093..0a306f1541 100644 --- a/firmware/hw_layer/sensors/hip9011.h +++ b/firmware/hw_layer/sensors/hip9011.h @@ -14,7 +14,7 @@ void initHip9011(); void startHip9001_pins(); void stopHip9001_pins(); #if HAL_USE_ADC -void hipAdcCallback(adcsample_t value); +void hipAdcCallback(float volts); #endif /* HAL_USE_ADC */ void hip9011_onFireEvent(uint8_t cylinderNumber, efitick_t nowNt); diff --git a/firmware/hw_layer/sensors/hip9011_logic.cpp b/firmware/hw_layer/sensors/hip9011_logic.cpp index 5d65161abe..f554168342 100644 --- a/firmware/hw_layer/sensors/hip9011_logic.cpp +++ b/firmware/hw_layer/sensors/hip9011_logic.cpp @@ -110,7 +110,7 @@ float HIP9011::getRpmByAngleWindowAndTimeUs(int timeUs, float angleWindowWidth) /** * TINT = TC * 2 * PI * VOUT */ - float integrationTimeUs = timeUs * 2 * CONST_PI * HIP9011_DESIRED_OUTPUT_VALUE; + float integrationTimeUs = timeUs * 2 * CONST_PI * HIP9011_ANALOG_OUTPUT_MAX; /** * rpm = 60 seconds / time * '60000000' because revolutions per MINUTE in uS conversion diff --git a/firmware/hw_layer/sensors/hip9011_logic.h b/firmware/hw_layer/sensors/hip9011_logic.h index 445d454cd1..ee0a368339 100644 --- a/firmware/hw_layer/sensors/hip9011_logic.h +++ b/firmware/hw_layer/sensors/hip9011_logic.h @@ -16,7 +16,7 @@ #endif #define HIP9011_BAND(bore) (900 / (CONST_PI * (bore) / 2)) -#define HIP9011_DESIRED_OUTPUT_VALUE 5.0f +#define HIP9011_ANALOG_OUTPUT_MAX 5.0f #define HIP9011_DIGITAL_OUTPUT_MAX 0x03ff /* 10 bit max value */ #define HIP_INPUT_CHANNELS 2