diff --git a/firmware/boards/f0_module/port.cpp b/firmware/boards/f0_module/port.cpp index 4e965ea8..1b1c0565 100644 --- a/firmware/boards/f0_module/port.cpp +++ b/firmware/boards/f0_module/port.cpp @@ -47,7 +47,7 @@ AnalogResult AnalogSample() { .NernstVoltage = AverageSamples(adcBuffer, 0) * (1.0 / NERNST_INPUT_GAIN), .PumpCurrentVoltage = AverageSamples(adcBuffer, 1), - .BatteryVoltage = 0, + .HeaterSupplyVoltage = 0, }, }, .VirtualGroundVoltageInt = AverageSamples(adcBuffer, 2), diff --git a/firmware/boards/f1_dual/port.cpp b/firmware/boards/f1_dual/port.cpp index 9b4b45ce..40cff46e 100644 --- a/firmware/boards/f1_dual/port.cpp +++ b/firmware/boards/f1_dual/port.cpp @@ -111,13 +111,13 @@ AnalogResult AnalogSample() /* left */ .NernstVoltage = AverageSamples(adcBuffer, 3) * (1.0 / NERNST_INPUT_GAIN), .PumpCurrentVoltage = AverageSamples(adcBuffer, 2), - .BatteryVoltage = l_heater_voltage, + .HeaterSupplyVoltage = l_heater_voltage, }, { /* right */ .NernstVoltage = AverageSamples(adcBuffer, 1) * (1.0 / NERNST_INPUT_GAIN), .PumpCurrentVoltage = AverageSamples(adcBuffer, 0), - .BatteryVoltage = r_heater_voltage, + .HeaterSupplyVoltage = r_heater_voltage, }, }, /* Dual board has separate internal virtual ground = 3.3V / 2 diff --git a/firmware/boards/f1_dual_rev1/port.cpp b/firmware/boards/f1_dual_rev1/port.cpp index dd3c29bc..5e4c8538 100644 --- a/firmware/boards/f1_dual_rev1/port.cpp +++ b/firmware/boards/f1_dual_rev1/port.cpp @@ -135,10 +135,10 @@ AnalogResult AnalogSample() } /* left */ res.ch[0].PumpCurrentVoltage = AverageSamples(adcBuffer, 2); - res.ch[0].BatteryVoltage = l_heater_voltage; + res.ch[0].HeaterSupplyVoltage = l_heater_voltage; /* right */ res.ch[1].PumpCurrentVoltage = AverageSamples(adcBuffer, 0); - res.ch[1].BatteryVoltage = r_heater_voltage; + res.ch[1].HeaterSupplyVoltage = r_heater_voltage; return res; } diff --git a/firmware/boards/f1_rev2/port.cpp b/firmware/boards/f1_rev2/port.cpp index 294f582c..5836f713 100644 --- a/firmware/boards/f1_rev2/port.cpp +++ b/firmware/boards/f1_rev2/port.cpp @@ -66,8 +66,11 @@ AnalogResult AnalogSample() .PumpCurrentVoltage = AverageSamples(adcBuffer, 1), /* We also can measure output virtual ground voltage for diagnostic purposes */ //.VirtualGroundVoltageExt = AverageSamples(adcBuffer, 0) / VM_INPUT_DIVIDER, - .BatteryVoltage = AverageSamples(adcBuffer, 3) / BATTERY_INPUT_DIVIDER, - /* .HeaterVoltage = AverageSamples(adcBuffer, 4) / HEATER_INPUT_DIVIDER, */ + /* Heater measurement circuit has incorrect RC filter making inposible accurate + * measurement when heater pwm has high duty + * Assume WBO supply voltage == heater supply voltage */ + .HeaterSupplyVoltage = AverageSamples(adcBuffer, 3) / BATTERY_INPUT_DIVIDER, + /* .HeaterSupplyVoltage = AverageSamples(adcBuffer, 4) / HEATER_INPUT_DIVIDER, */ }, }, /* Rev 2 board has separate internal virtual ground = 3.3V / 2 diff --git a/firmware/boards/f1_rev3/port.cpp b/firmware/boards/f1_rev3/port.cpp index 39af3af2..11bdf974 100644 --- a/firmware/boards/f1_rev3/port.cpp +++ b/firmware/boards/f1_rev3/port.cpp @@ -63,8 +63,11 @@ AnalogResult AnalogSample() .PumpCurrentVoltage = AverageSamples(adcBuffer, 1), /* We also can measure output virtual ground voltage for diagnostic purposes */ //.VirtualGroundVoltageExt = AverageSamples(adcBuffer, 0) / VM_INPUT_DIVIDER, - .BatteryVoltage = AverageSamples(adcBuffer, 3) / BATTERY_INPUT_DIVIDER, - /* .HeaterVoltage = AverageSamples(adcBuffer, 4) / HEATER_INPUT_DIVIDER, */ + /* Heater measurement circuit has incorrect RC filter making inposible accurate + * measurement when heater pwm has high duty + * Assume WBO supply voltage == heater supply voltage */ + .HeaterSupplyVoltage = AverageSamples(adcBuffer, 3) / BATTERY_INPUT_DIVIDER, + /* .HeaterSupplyVoltage = AverageSamples(adcBuffer, 4) / HEATER_INPUT_DIVIDER, */ }, }, /* Rev 2 board has separate internal virtual ground = 3.3V / 2 diff --git a/firmware/boards/port.h b/firmware/boards/port.h index c7c063d3..d8a94e08 100644 --- a/firmware/boards/port.h +++ b/firmware/boards/port.h @@ -12,13 +12,14 @@ struct AnalogChannelResult float PumpCurrentVoltage; /* for dual version - this is voltage on Heater-, switches between zero and Vbatt with heater PWM, * used for both Vbatt measurement and Heater diagnostic */ - float BatteryVoltage; + float HeaterSupplyVoltage; }; struct AnalogResult { AnalogChannelResult ch[AFR_CHANNELS]; float VirtualGroundVoltageInt; + /* TODO: add SupplyVoltage - some boards can measure supply voltage */ }; AnalogResult AnalogSample(); diff --git a/firmware/heater_control.cpp b/firmware/heater_control.cpp index 44ba2039..b1f66894 100644 --- a/firmware/heater_control.cpp +++ b/firmware/heater_control.cpp @@ -42,7 +42,7 @@ HeaterState HeaterControllerBase::GetHeaterState() const return heaterState; } -HeaterState HeaterControllerBase::GetNextState(HeaterState currentState, HeaterAllow heaterAllowState, float batteryVoltage, float sensorTemp) +HeaterState HeaterControllerBase::GetNextState(HeaterState currentState, HeaterAllow heaterAllowState, float heaterSupplyVoltage, float sensorTemp) { bool heaterAllowed = heaterAllowState == HeaterAllow::Allowed; @@ -50,14 +50,14 @@ HeaterState HeaterControllerBase::GetNextState(HeaterState currentState, HeaterA if (heaterAllowState == HeaterAllow::Unknown) { // measured voltage too low to auto-start heating - if (batteryVoltage < HEATER_BATTETY_OFF_VOLTAGE) + if (heaterSupplyVoltage < HEATER_BATTETY_OFF_VOLTAGE) { m_batteryStableTimer.reset(); return HeaterState::NoHeaterSupply; } - else if (batteryVoltage > HEATER_BATTERY_ON_VOLTAGE) + else if (heaterSupplyVoltage > HEATER_BATTERY_ON_VOLTAGE) { - // measured voltage is high enougth to auto-start heating, wait some time to stabilize + // measured voltage is high enough to auto-start heating, wait some time to stabilize heaterAllowed = m_batteryStableTimer.hasElapsedSec(HEATER_BATTERY_STAB_TIME); } } @@ -181,12 +181,12 @@ void HeaterControllerBase::Update(const ISampler& sampler, HeaterAllow heaterAll // If we haven't heard from the ECU, use the internally sensed // battery voltage instead of voltage over CAN. - float batteryVoltage = heaterAllowState == HeaterAllow::Unknown - ? sampler.GetInternalBatteryVoltage() + float heaterSupplyVoltage = heaterAllowState == HeaterAllow::Unknown + ? sampler.GetInternalHeaterVoltage() : GetRemoteBatteryVoltage(); // Run the state machine - heaterState = GetNextState(heaterState, heaterAllowState, batteryVoltage, sensorTemperature); + heaterState = GetNextState(heaterState, heaterAllowState, heaterSupplyVoltage, sensorTemperature); float heaterVoltage = GetVoltageForState(heaterState, sensorEsr); // Limit to 12 volts @@ -195,7 +195,7 @@ void HeaterControllerBase::Update(const ISampler& sampler, HeaterAllow heaterAll } // duty = (V_eff / V_batt) ^ 2 - float voltageRatio = (batteryVoltage < 1.0f) ? 0 : heaterVoltage / batteryVoltage; + float voltageRatio = (heaterSupplyVoltage < 1.0f) ? 0 : heaterVoltage / heaterSupplyVoltage; float duty = voltageRatio * voltageRatio; #ifdef HEATER_MAX_DUTY @@ -208,7 +208,7 @@ void HeaterControllerBase::Update(const ISampler& sampler, HeaterAllow heaterAll } #endif - if (batteryVoltage >= 23) + if (heaterSupplyVoltage >= 23) { duty = 0; heaterVoltage = 0; diff --git a/firmware/livedata.cpp b/firmware/livedata.cpp index 7a0c4e7c..d69a37b7 100644 --- a/firmware/livedata.cpp +++ b/firmware/livedata.cpp @@ -36,7 +36,7 @@ void SamplingUpdateLiveData() data->heaterState = (uint8_t)GetHeaterState(ch); } - livedata_common.vbatt = GetSampler(0).GetInternalBatteryVoltage(); + livedata_common.vbatt = GetSampler(0).GetInternalHeaterVoltage(); } template<> diff --git a/firmware/sampling.cpp b/firmware/sampling.cpp index 62f7b76e..415e5ca4 100644 --- a/firmware/sampling.cpp +++ b/firmware/sampling.cpp @@ -38,13 +38,12 @@ float Sampler::GetPumpNominalCurrent() const return pumpCurrentSenseVoltage * ratio; } -float Sampler::GetInternalBatteryVoltage() const +float Sampler::GetInternalHeaterVoltage() const { #ifdef BATTERY_INPUT_DIVIDER // Dual HW can measure heater voltage for each channel // by measuring voltage on Heater- while FET is off - // TODO: rename function? - return internalBatteryVoltage; + return internalHeaterVoltage; #else // After 5 seconds, pretend that we get battery voltage. // This makes the controller usable without CAN control @@ -116,7 +115,7 @@ void Sampler::ApplySample(AnalogChannelResult& result, float virtualGroundVoltag PUMP_FILTER_ALPHA * (result.PumpCurrentVoltage - virtualGroundVoltageInt); #ifdef BATTERY_INPUT_DIVIDER - internalBatteryVoltage = result.BatteryVoltage; + internalHeaterVoltage = result.HeaterSupplyVoltage; #endif // Shift history over by one diff --git a/firmware/sampling.h b/firmware/sampling.h index 0c01f061..3317ea3e 100644 --- a/firmware/sampling.h +++ b/firmware/sampling.h @@ -9,7 +9,7 @@ struct ISampler virtual float GetNernstDc() const = 0; virtual float GetNernstAc() const = 0; virtual float GetPumpNominalCurrent() const = 0; - virtual float GetInternalBatteryVoltage() const = 0; + virtual float GetInternalHeaterVoltage() const = 0; virtual float GetSensorTemperature() const = 0; virtual float GetSensorInternalResistance() const = 0; }; @@ -25,7 +25,7 @@ class Sampler : public ISampler float GetNernstDc() const override; float GetNernstAc() const override; float GetPumpNominalCurrent() const override; - float GetInternalBatteryVoltage() const override; + float GetInternalHeaterVoltage() const override; float GetSensorTemperature() const override; float GetSensorInternalResistance() const override; @@ -38,7 +38,7 @@ class Sampler : public ISampler float pumpCurrentSenseVoltage = 0; #ifdef BATTERY_INPUT_DIVIDER - float internalBatteryVoltage = 0; + float internalHeaterVoltage = 0; #endif Timer m_startupTimer; diff --git a/firmware/uart.cpp b/firmware/uart.cpp index 4e779cd4..127a488e 100644 --- a/firmware/uart.cpp +++ b/firmware/uart.cpp @@ -39,7 +39,7 @@ static void UartThread(void*) float lambda = GetLambda(ch); int lambdaIntPart = lambda; int lambdaThousandths = (lambda - lambdaIntPart) * 1000; - int batteryVoltageMv = GetSampler(ch).GetInternalBatteryVoltage() * 1000; + int batteryVoltageMv = GetSampler(ch).GetInternalHeaterVoltage() * 1000; int duty = GetHeaterDuty(ch) * 100; size_t writeCount = chsnprintf(printBuffer, 200,