diff --git a/firmware/heater_control.cpp b/firmware/heater_control.cpp index 1fd045f..d7c1d1e 100644 --- a/firmware/heater_control.cpp +++ b/firmware/heater_control.cpp @@ -15,14 +15,6 @@ using namespace wbo; // 400khz / 1024 = 390hz PWM static Pwm heaterPwm(HEATER_PWM_DEVICE, HEATER_PWM_CHANNEL, 400'000, 1024); -enum class HeaterState -{ - Preheat, - WarmupRamp, - ClosedLoop, - Stopped, -}; - static constexpr int preheatTimeCounter = HEATER_PREHEAT_TIME / HEATER_CONTROL_PERIOD; static constexpr int batteryStabTimeCounter = HEATER_BATTERY_STAB_TIME / HEATER_CONTROL_PERIOD; static int timeCounter = preheatTimeCounter; @@ -217,3 +209,24 @@ float GetHeaterDuty() { return heaterPwm.GetLastDuty(); } + +HeaterState GetHeaterState() +{ + return state; +} + +const char* describeHeaterState(HeaterState state) +{ + switch (state) { + case HeaterState::Preheat: + return "Preheat"; + case HeaterState::WarmupRamp: + return "WarmupRamp"; + case HeaterState::ClosedLoop: + return "ClosedLoop"; + case HeaterState::Stopped: + return "Stopped"; + } + + return "Unknown"; +} diff --git a/firmware/heater_control.h b/firmware/heater_control.h index b150095..72fb4bb 100644 --- a/firmware/heater_control.h +++ b/firmware/heater_control.h @@ -2,6 +2,16 @@ #include +enum class HeaterState +{ + Preheat, + WarmupRamp, + ClosedLoop, + Stopped, +}; + void StartHeaterControl(); bool IsRunningClosedLoop(); float GetHeaterDuty(); +HeaterState GetHeaterState(); +const char* describeHeaterState(HeaterState state); diff --git a/firmware/interpolation.cpp b/firmware/interpolation.cpp index 643803c..90e5625 100644 --- a/firmware/interpolation.cpp +++ b/firmware/interpolation.cpp @@ -1,37 +1,37 @@ #include "interpolation.h" -int interpolateInt(int x1, int y1, int x2, int y2, int x) +float interpolateFloat(float x1, float y1, float x2, float y2, float x) { - if (x1 == x2) - return y1; + if (x1 == x2) + return y1; - return (y1 + (y2 - y1) * (x - x1) / (x2 - x1)); + return (y1 + (y2 - y1) * (x - x1) / (x2 - x1)); } -int interpolateIntClamped(int x1, int y1, int x2, int y2, int x) +float interpolateFloatClamped(float x1, float y1, float x2, float y2, float x) { - if (x <= x1) - return y1; - if (x >= x2) - return y2; + if (x <= x1) + return y1; + if (x >= x2) + return y2; - return interpolateInt(x1, y1, x2, y2, x); + return interpolateFloat(x1, y1, x2, y2, x); } -int interpolate_1d_int(const struct inter_point *p, int size, int x) +float interpolate_1d_float(const struct inter_point *p, int size, float x) { - int i; + int i; - /* no exterpolation */ - if (x < p[0].x) - return p[0].y; + /* no exterpolation */ + if (x < p[0].x) + return p[0].y; - for (i = 0; i < size - 1; i++) { - if ((x >= p[i].x) && (x < p[i + 1].x)) { - return interpolateInt(p[i].x, p[i].y, p[i + 1].x, p[i + 1].y, x); - } - } + for (i = 0; i < size - 1; i++) { + if ((x >= p[i].x) && (x < p[i + 1].x)) { + return interpolateFloat(p[i].x, p[i].y, p[i + 1].x, p[i + 1].y, x); + } + } - /* no exterpolation */ - return p[size - 1].y; + /* no exterpolation */ + return p[size - 1].y; } diff --git a/firmware/interpolation.h b/firmware/interpolation.h index eac1769..13b9804 100644 --- a/firmware/interpolation.h +++ b/firmware/interpolation.h @@ -1,11 +1,10 @@ #pragma once -struct inter_point -{ - int x; - int y; +struct inter_point { + float x; + float y; }; -int interpolateInt(int x1, int y1, int x2, int y2, int x); -int interpolateIntClamped(int x1, int y1, int x2, int y2, int x); -int interpolate_1d_int(const struct inter_point *p, int size, int x); +float interpolateFloat(float x1, float y1, float x2, float y2, float x); +float interpolateFloatClamped(float x1, float y1, float x2, float y2, float x); +float interpolate_1d_float(const struct inter_point *p, int size, float x); diff --git a/firmware/pump_dac.cpp b/firmware/pump_dac.cpp index a702a8d..0fafe67 100644 --- a/firmware/pump_dac.cpp +++ b/firmware/pump_dac.cpp @@ -9,6 +9,8 @@ // 48MHz / 1024 = 46.8khz PWM static Pwm pumpDac(PUMP_DAC_PWM_DEVICE, PUMP_DAC_PWM_CHANNEL, 48'000'000, 1024); +static int32_t curIpump; + void InitPumpDac() { pumpDac.Start(); @@ -26,6 +28,8 @@ void SetPumpCurrentTarget(int32_t microampere) microampere = 0; } + curIpump = microampere; + // 47 ohm resistor // 0.147 gain // effective resistance of 317 ohms @@ -41,3 +45,8 @@ float GetPumpOutputDuty() { return pumpDac.GetLastDuty(); } + +int32_t GetPumpCurrent() +{ + return curIpump; +} diff --git a/firmware/pump_dac.h b/firmware/pump_dac.h index b70582e..3af0e6b 100644 --- a/firmware/pump_dac.h +++ b/firmware/pump_dac.h @@ -5,3 +5,4 @@ void InitPumpDac(); void SetPumpCurrentTarget(int32_t microamperes); float GetPumpOutputDuty(); +int32_t GetPumpCurrent(); diff --git a/firmware/sampling.cpp b/firmware/sampling.cpp index 8ea72e7..b568366 100644 --- a/firmware/sampling.cpp +++ b/firmware/sampling.cpp @@ -110,7 +110,7 @@ float GetSensorInternalResistance() float GetSensorTemperature() { - return interpolate_1d_int(lsu49_r_to_temp, ARRAY_SIZE(lsu49_r_to_temp), GetSensorInternalResistance()); + return interpolate_1d_float(lsu49_r_to_temp, ARRAY_SIZE(lsu49_r_to_temp), GetSensorInternalResistance()); } float GetNernstDc() diff --git a/firmware/uart.cpp b/firmware/uart.cpp index ac08679..9ec2e45 100644 --- a/firmware/uart.cpp +++ b/firmware/uart.cpp @@ -4,6 +4,8 @@ #include "lambda_conversion.h" #include "sampling.h" +#include "heater_control.h" +#include "fault.h" #include "uart.h" static const UARTConfig uartCfg = @@ -27,7 +29,7 @@ static const UARTConfig uartCfg = static char printBuffer[200]; -static THD_WORKING_AREA(waUartThread, 256); +static THD_WORKING_AREA(waUartThread, 512); static void UartThread(void*) { while(true) @@ -35,11 +37,22 @@ static void UartThread(void*) float lambda = GetLambda(); int lambdaIntPart = lambda; int lambdaThousandths = (lambda - lambdaIntPart) * 1000; + int batteryVoltageMv = GetInternalBatteryVoltage() * 1000; + int duty = GetHeaterDuty() * 100; - size_t writeCount = chsnprintf(printBuffer, 200, "%d.%03d\t%d\t%d\r\n", lambdaIntPart, lambdaThousandths, (int)GetSensorInternalResistance(), (int)(GetPumpNominalCurrent() * 1000)); + size_t writeCount = chsnprintf(printBuffer, 200, + "%d.%03d\tAC %d mV\tR: %d\tT: %d\tIpump: %d\tVbat: %d\theater: %s (%d)\tfault: %s\r\n", + lambdaIntPart, lambdaThousandths, + (int)(GetNernstAc() * 1000.0), + (int)GetSensorInternalResistance(), + (int)GetSensorTemperature(), + (int)(GetPumpNominalCurrent() * 1000), + batteryVoltageMv, + describeHeaterState(GetHeaterState()), duty, + describeFault(GetCurrentFault())); uartStartSend(&UARTD1, writeCount, printBuffer); - chThdSleepMilliseconds(20); + chThdSleepMilliseconds(50); } }