mirror of https://github.com/rusefi/wideband.git
kill off helpers to get heater/sampler stuff
This commit is contained in:
parent
a8ac2698c4
commit
d1c878bf13
|
@ -137,6 +137,9 @@ void SendRusefiFormat(uint8_t ch)
|
||||||
{
|
{
|
||||||
auto baseAddress = WB_DATA_BASE_ADDR + 2 * (ch + configuration->CanIndexOffset);
|
auto baseAddress = WB_DATA_BASE_ADDR + 2 * (ch + configuration->CanIndexOffset);
|
||||||
|
|
||||||
|
const auto& sampler = GetSampler(ch);
|
||||||
|
const auto& heater = GetHeaterController(ch);
|
||||||
|
|
||||||
{
|
{
|
||||||
CanTxTyped<wbo::StandardData> frame(baseAddress + 0);
|
CanTxTyped<wbo::StandardData> frame(baseAddress + 0);
|
||||||
|
|
||||||
|
@ -145,17 +148,17 @@ void SendRusefiFormat(uint8_t ch)
|
||||||
|
|
||||||
uint16_t lambda = GetLambda(ch) * 10000;
|
uint16_t lambda = GetLambda(ch) * 10000;
|
||||||
frame.get().Lambda = lambda;
|
frame.get().Lambda = lambda;
|
||||||
frame.get().TemperatureC = GetSensorTemperature(ch);
|
frame.get().TemperatureC = sampler.GetSensorTemperature();
|
||||||
frame.get().Valid = IsRunningClosedLoop(ch) ? 0x01 : 0x00;
|
frame.get().Valid = heater.IsRunningClosedLoop() ? 0x01 : 0x00;
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
auto esr = GetSensorInternalResistance(ch);
|
auto esr = sampler.GetSensorInternalResistance();
|
||||||
|
|
||||||
CanTxTyped<wbo::DiagData> frame(baseAddress + 1);
|
CanTxTyped<wbo::DiagData> frame(baseAddress + 1);
|
||||||
|
|
||||||
frame.get().Esr = esr;
|
frame.get().Esr = esr;
|
||||||
frame.get().NernstDc = GetNernstDc(ch) * 1000;
|
frame.get().NernstDc = sampler.GetNernstDc() * 1000;
|
||||||
frame.get().PumpDuty = GetPumpOutputDuty(ch) * 255;
|
frame.get().PumpDuty = GetPumpOutputDuty(ch) * 255;
|
||||||
frame.get().Status = GetCurrentFault(ch);
|
frame.get().Status = GetCurrentFault(ch);
|
||||||
frame.get().HeaterDuty = GetHeaterDuty(ch) * 255;
|
frame.get().HeaterDuty = GetHeaterDuty(ch) * 255;
|
||||||
|
|
|
@ -68,7 +68,7 @@ static constexpr int preheatTimeCounter = HEATER_PREHEAT_TIME / HEATER_CONTROL_P
|
||||||
static constexpr int batteryStabTimeCounter = HEATER_BATTERY_STAB_TIME / HEATER_CONTROL_PERIOD;
|
static constexpr int batteryStabTimeCounter = HEATER_BATTERY_STAB_TIME / HEATER_CONTROL_PERIOD;
|
||||||
static const struct sensorHeaterParams *heater;
|
static const struct sensorHeaterParams *heater;
|
||||||
|
|
||||||
class HeaterController
|
class HeaterController : public IHeaterController
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
HeaterController(int ch, int pwm_ch)
|
HeaterController(int ch, int pwm_ch)
|
||||||
|
@ -76,14 +76,28 @@ public:
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void Update(const ISampler& sampler, HeaterAllow heaterAllowState);
|
void Update(const ISampler& sampler, HeaterAllow heaterAllowState) override;
|
||||||
|
|
||||||
|
bool IsRunningClosedLoop() const override
|
||||||
|
{
|
||||||
|
return heaterState == HeaterState::ClosedLoop;
|
||||||
|
}
|
||||||
|
|
||||||
|
float GetHeaterEffectiveVoltage() const override
|
||||||
|
{
|
||||||
|
return heaterVoltage;
|
||||||
|
}
|
||||||
|
|
||||||
|
HeaterState GetHeaterState() const override
|
||||||
|
{
|
||||||
|
return heaterState;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
HeaterState GetNextState(HeaterAllow haeterAllowState, float batteryVoltage, float sensorTemp);
|
HeaterState GetNextState(HeaterAllow haeterAllowState, float batteryVoltage, float sensorTemp);
|
||||||
float GetVoltageForState(float heaterEsr);
|
float GetVoltageForState(float heaterEsr);
|
||||||
|
|
||||||
// private:
|
private:
|
||||||
public:
|
|
||||||
Pid heaterPid =
|
Pid heaterPid =
|
||||||
{
|
{
|
||||||
0.3f, // kP
|
0.3f, // kP
|
||||||
|
@ -101,6 +115,9 @@ public:
|
||||||
#ifdef HEATER_MAX_DUTY
|
#ifdef HEATER_MAX_DUTY
|
||||||
int cycle;
|
int cycle;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// TODO: private:
|
||||||
|
public:
|
||||||
const uint8_t ch;
|
const uint8_t ch;
|
||||||
const uint8_t pwm_ch;
|
const uint8_t pwm_ch;
|
||||||
};
|
};
|
||||||
|
@ -114,6 +131,11 @@ HeaterController heaterControllers[AFR_CHANNELS] =
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const IHeaterController& GetHeaterController(int ch)
|
||||||
|
{
|
||||||
|
return heaterControllers[ch];
|
||||||
|
}
|
||||||
|
|
||||||
HeaterState HeaterController::GetNextState(HeaterAllow heaterAllowState, float batteryVoltage, float sensorTemp)
|
HeaterState HeaterController::GetNextState(HeaterAllow heaterAllowState, float batteryVoltage, float sensorTemp)
|
||||||
{
|
{
|
||||||
bool heaterAllowed = heaterAllowState == HeaterAllow::Allowed;
|
bool heaterAllowed = heaterAllowState == HeaterAllow::Allowed;
|
||||||
|
@ -320,24 +342,14 @@ void StartHeaterControl()
|
||||||
chThdCreateStatic(waHeaterThread, sizeof(waHeaterThread), NORMALPRIO + 1, HeaterThread, nullptr);
|
chThdCreateStatic(waHeaterThread, sizeof(waHeaterThread), NORMALPRIO + 1, HeaterThread, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsRunningClosedLoop(int ch)
|
|
||||||
{
|
|
||||||
return heaterControllers[ch].heaterState == HeaterState::ClosedLoop;
|
|
||||||
}
|
|
||||||
|
|
||||||
float GetHeaterDuty(int ch)
|
float GetHeaterDuty(int ch)
|
||||||
{
|
{
|
||||||
return heaterPwm.GetLastDuty(heaterControllers[ch].pwm_ch);
|
return heaterPwm.GetLastDuty(heaterControllers[ch].pwm_ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
float GetHeaterEffVoltage(int ch)
|
|
||||||
{
|
|
||||||
return heaterControllers[ch].heaterVoltage;
|
|
||||||
}
|
|
||||||
|
|
||||||
HeaterState GetHeaterState(int ch)
|
HeaterState GetHeaterState(int ch)
|
||||||
{
|
{
|
||||||
return heaterControllers[ch].heaterState;
|
return heaterControllers[ch].GetHeaterState();
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* describeHeaterState(HeaterState state)
|
const char* describeHeaterState(HeaterState state)
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
|
#include "can.h"
|
||||||
|
|
||||||
enum class HeaterState
|
enum class HeaterState
|
||||||
{
|
{
|
||||||
Preheat,
|
Preheat,
|
||||||
|
@ -11,9 +13,19 @@ enum class HeaterState
|
||||||
NoHeaterSupply,
|
NoHeaterSupply,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ISampler;
|
||||||
|
|
||||||
|
struct IHeaterController
|
||||||
|
{
|
||||||
|
virtual void Update(const ISampler& sampler, HeaterAllow heaterAllowState) = 0;
|
||||||
|
virtual bool IsRunningClosedLoop() const = 0;
|
||||||
|
virtual float GetHeaterEffectiveVoltage() const = 0;
|
||||||
|
virtual HeaterState GetHeaterState() const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
const IHeaterController& GetHeaterController(int ch);
|
||||||
|
|
||||||
void StartHeaterControl();
|
void StartHeaterControl();
|
||||||
bool IsRunningClosedLoop(int ch);
|
|
||||||
float GetHeaterDuty(int ch);
|
float GetHeaterDuty(int ch);
|
||||||
float GetHeaterEffVoltage(int ch);
|
|
||||||
HeaterState GetHeaterState(int ch);
|
HeaterState GetHeaterState(int ch);
|
||||||
const char* describeHeaterState(HeaterState state);
|
const char* describeHeaterState(HeaterState state);
|
||||||
|
|
|
@ -49,7 +49,7 @@ static void IndicationThread(void *ptr)
|
||||||
palToggleLine(data->line);
|
palToggleLine(data->line);
|
||||||
|
|
||||||
// Slow blink if closed loop, fast if not
|
// Slow blink if closed loop, fast if not
|
||||||
chThdSleepMilliseconds(IsRunningClosedLoop(data->idx) ? LED_BLINK_SLOW : LED_BLINK_FAST);
|
chThdSleepMilliseconds(GetHeaterController(data->idx).IsRunningClosedLoop() ? LED_BLINK_SLOW : LED_BLINK_FAST);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -65,7 +65,7 @@ static float GetPhi(float pumpCurrent) {
|
||||||
|
|
||||||
float GetLambda(int ch)
|
float GetLambda(int ch)
|
||||||
{
|
{
|
||||||
float pumpCurrent = GetPumpNominalCurrent(ch);
|
float pumpCurrent = GetSampler(ch).GetPumpNominalCurrent();
|
||||||
|
|
||||||
// Lambda is reciprocal of phi
|
// Lambda is reciprocal of phi
|
||||||
return 1 / GetPhi(pumpCurrent);
|
return 1 / GetPhi(pumpCurrent);
|
||||||
|
|
|
@ -20,15 +20,18 @@ void SamplingUpdateLiveData()
|
||||||
{
|
{
|
||||||
volatile struct livedata_afr_s *data = &livedata_afr[ch];
|
volatile struct livedata_afr_s *data = &livedata_afr[ch];
|
||||||
|
|
||||||
|
const auto& sampler = GetSampler(ch);
|
||||||
|
const auto& heater = GetHeaterController(ch);
|
||||||
|
|
||||||
data->lambda = GetLambda(ch);
|
data->lambda = GetLambda(ch);
|
||||||
data->temperature = GetSensorTemperature(ch) * 10;
|
data->temperature = sampler.GetSensorTemperature() * 10;
|
||||||
data->nernstDc = GetNernstDc(ch) * 1000;
|
data->nernstDc = sampler.GetNernstDc() * 1000;
|
||||||
data->nernstAc = GetNernstAc(ch) * 1000;
|
data->nernstAc = sampler.GetNernstAc() * 1000;
|
||||||
data->pumpCurrentTarget = GetPumpCurrent(ch);
|
data->pumpCurrentTarget = GetPumpCurrent(ch);
|
||||||
data->pumpCurrentMeasured = GetPumpNominalCurrent(ch);
|
data->pumpCurrentMeasured = sampler.GetPumpNominalCurrent();
|
||||||
data->heaterDuty = GetHeaterDuty(ch) * 1000; // 0.1 %
|
data->heaterDuty = GetHeaterDuty(ch) * 1000; // 0.1 %
|
||||||
data->heaterEffectiveVoltage = GetHeaterEffVoltage(ch) * 100;
|
data->heaterEffectiveVoltage = heater.GetHeaterEffectiveVoltage() * 100;
|
||||||
data->esr = GetSensorInternalResistance(ch);
|
data->esr = sampler.GetSensorInternalResistance();
|
||||||
data->fault = (uint8_t)GetCurrentFault(ch);
|
data->fault = (uint8_t)GetCurrentFault(ch);
|
||||||
data->heaterState = (uint8_t)GetHeaterState(ch);
|
data->heaterState = (uint8_t)GetHeaterState(ch);
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,7 +67,7 @@ int main() {
|
||||||
palTogglePad(LED_GREEN_PORT, LED_GREEN_PIN);
|
palTogglePad(LED_GREEN_PORT, LED_GREEN_PIN);
|
||||||
|
|
||||||
// Slow blink if closed loop, fast if not
|
// Slow blink if closed loop, fast if not
|
||||||
chThdSleepMilliseconds(IsRunningClosedLoop(0) ? 700 : 50);
|
chThdSleepMilliseconds(GetHeaterController(0).IsRunningClosedLoop() ? 700 : 50);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -34,10 +34,13 @@ static void PumpThread(void*)
|
||||||
{
|
{
|
||||||
pump_control_state &s = state[ch];
|
pump_control_state &s = state[ch];
|
||||||
|
|
||||||
|
const auto& sampler = GetSampler(ch);
|
||||||
|
const auto& heater = GetHeaterController(ch);
|
||||||
|
|
||||||
// Only actuate pump when running closed loop!
|
// Only actuate pump when running closed loop!
|
||||||
if (IsRunningClosedLoop(ch))
|
if (heater.IsRunningClosedLoop())
|
||||||
{
|
{
|
||||||
float nernstVoltage = GetNernstDc(ch);
|
float nernstVoltage = sampler.GetNernstDc();
|
||||||
|
|
||||||
float result = s.pumpPid.GetOutput(NERNST_TARGET, nernstVoltage);
|
float result = s.pumpPid.GetOutput(NERNST_TARGET, nernstVoltage);
|
||||||
|
|
||||||
|
|
|
@ -91,7 +91,7 @@ void InitPumpDac()
|
||||||
void SetPumpCurrentTarget(int ch, int32_t microampere)
|
void SetPumpCurrentTarget(int ch, int32_t microampere)
|
||||||
{
|
{
|
||||||
// Don't allow pump current when the sensor isn't hot
|
// Don't allow pump current when the sensor isn't hot
|
||||||
if (!IsRunningClosedLoop(ch))
|
if (!GetHeaterController(ch).IsRunningClosedLoop())
|
||||||
{
|
{
|
||||||
microampere = 0;
|
microampere = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,7 +95,7 @@ private:
|
||||||
|
|
||||||
static Sampler samplers[AFR_CHANNELS];
|
static Sampler samplers[AFR_CHANNELS];
|
||||||
|
|
||||||
ISampler& GetSampler(int ch)
|
const ISampler& GetSampler(int ch)
|
||||||
{
|
{
|
||||||
return samplers[ch];
|
return samplers[ch];
|
||||||
}
|
}
|
||||||
|
@ -174,32 +174,7 @@ void StartSampling()
|
||||||
chThdCreateStatic(waSamplingThread, sizeof(waSamplingThread), NORMALPRIO + 5, SamplingThread, nullptr);
|
chThdCreateStatic(waSamplingThread, sizeof(waSamplingThread), NORMALPRIO + 5, SamplingThread, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
float GetNernstAc(int ch)
|
|
||||||
{
|
|
||||||
return samplers[ch].GetNernstAc();
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: remove these helpers
|
// TODO: remove these helpers
|
||||||
float GetSensorInternalResistance(int ch)
|
|
||||||
{
|
|
||||||
return samplers[ch].GetSensorInternalResistance();
|
|
||||||
}
|
|
||||||
|
|
||||||
float GetSensorTemperature(int ch)
|
|
||||||
{
|
|
||||||
return samplers[ch].GetSensorTemperature();
|
|
||||||
}
|
|
||||||
|
|
||||||
float GetNernstDc(int ch)
|
|
||||||
{
|
|
||||||
return samplers[ch].GetNernstDc();
|
|
||||||
}
|
|
||||||
|
|
||||||
float GetPumpNominalCurrent(int ch)
|
|
||||||
{
|
|
||||||
return samplers[ch].GetPumpNominalCurrent();
|
|
||||||
}
|
|
||||||
|
|
||||||
float GetInternalBatteryVoltage(int ch)
|
float GetInternalBatteryVoltage(int ch)
|
||||||
{
|
{
|
||||||
return samplers[ch].GetInternalBatteryVoltage();
|
return samplers[ch].GetInternalBatteryVoltage();
|
||||||
|
|
|
@ -11,13 +11,8 @@ struct ISampler
|
||||||
};
|
};
|
||||||
|
|
||||||
// Get the sampler for a particular channel
|
// Get the sampler for a particular channel
|
||||||
ISampler& GetSampler(int ch);
|
const ISampler& GetSampler(int ch);
|
||||||
|
|
||||||
void StartSampling();
|
void StartSampling();
|
||||||
|
|
||||||
float GetNernstAc(int ch);
|
|
||||||
float GetSensorInternalResistance(int ch);
|
|
||||||
float GetSensorTemperature(int ch);
|
|
||||||
float GetNernstDc(int ch);
|
|
||||||
float GetPumpNominalCurrent(int ch);
|
|
||||||
float GetInternalBatteryVoltage(int ch);
|
float GetInternalBatteryVoltage(int ch);
|
||||||
|
|
|
@ -46,11 +46,11 @@ static void UartThread(void*)
|
||||||
"[AFR%d]: %d.%03d DC: %4d mV AC: %4d mV ESR: %5d T: %4d C Ipump: %6d uA Vheater: %5d heater: %s (%d)\tfault: %s\r\n",
|
"[AFR%d]: %d.%03d DC: %4d mV AC: %4d mV ESR: %5d T: %4d C Ipump: %6d uA Vheater: %5d heater: %s (%d)\tfault: %s\r\n",
|
||||||
ch,
|
ch,
|
||||||
lambdaIntPart, lambdaThousandths,
|
lambdaIntPart, lambdaThousandths,
|
||||||
(int)(GetNernstDc(ch) * 1000.0),
|
(int)(GetSampler(ch).GetNernstDc(ch) * 1000.0),
|
||||||
(int)(GetNernstAc(ch) * 1000.0),
|
(int)(GetSampler(ch).GetNernstAc(ch) * 1000.0),
|
||||||
(int)GetSensorInternalResistance(ch),
|
(int)GetSampler(ch).GetSensorInternalResistance(ch),
|
||||||
(int)GetSensorTemperature(ch),
|
(int)GetSampler(ch).GetSensorTemperature(ch),
|
||||||
(int)(GetPumpNominalCurrent(ch) * 1000),
|
(int)(GetSampler(ch).GetPumpNominalCurrent(ch) * 1000),
|
||||||
batteryVoltageMv,
|
batteryVoltageMv,
|
||||||
describeHeaterState(GetHeaterState(ch)), duty,
|
describeHeaterState(GetHeaterState(ch)), duty,
|
||||||
describeFault(GetCurrentFault(ch)));
|
describeFault(GetCurrentFault(ch)));
|
||||||
|
|
Loading…
Reference in New Issue