diff --git a/firmware/Makefile b/firmware/Makefile index 500a153..9a34b65 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -129,6 +129,7 @@ CPPSRC = $(ALLCPPSRC) \ sampling.cpp \ heater_control.cpp \ pid.cpp \ + pump_control.cpp \ main.cpp # List ASM source files here. diff --git a/firmware/main.cpp b/firmware/main.cpp index 866bff1..65597de 100644 --- a/firmware/main.cpp +++ b/firmware/main.cpp @@ -4,6 +4,7 @@ #include "can.h" #include "heater_control.h" +#include "pump_control.h" #include "pump_dac.h" #include "sampling.h" @@ -32,15 +33,16 @@ int main() { halInit(); chSysInit(); + // Fire up all of our threads StartSampling(); - InitPumpDac(); - - InitCan(); + StartHeaterControl(); + StartPumpControl(); uartStart(&UARTD1, &uartCfg); - StartHeaterControl(); + + InitCan(); /*for (int i = 0; i < 500; i++) { SetPumpCurrentTarget(current); diff --git a/firmware/pump_control.cpp b/firmware/pump_control.cpp new file mode 100644 index 0000000..513dab8 --- /dev/null +++ b/firmware/pump_control.cpp @@ -0,0 +1,36 @@ +#include "pump_control.h" +#include "wideband_config.h" +#include "heater_control.h" +#include "sampling.h" +#include "pump_dac.h" +#include "pid.h" + +#include "ch.h" + +static Pid pumpPid(0, 0.01f, 2); + +static THD_WORKING_AREA(waPumpThread, 256); +static void PumpThread(void*) +{ + while(true) + { + // Only actuate pump when running closed loop! + if (IsRunningClosedLoop()) + { + float nernstVoltage = GetNernstDc(); + + float result = pumpPid.GetOutput(NERNST_TARGET, nernstVoltage); + + // result is in mA + SetPumpCurrentTarget(result / 1000.0f); + + // Run at 500hz + chThdSleepMilliseconds(2); + } + } +} + +void StartPumpControl() +{ + chThdCreateStatic(waPumpThread, sizeof(waPumpThread), NORMALPRIO + 4, PumpThread, nullptr); +} diff --git a/firmware/pump_control.h b/firmware/pump_control.h new file mode 100644 index 0000000..91670fc --- /dev/null +++ b/firmware/pump_control.h @@ -0,0 +1,3 @@ +#pragma once + +void StartPumpControl(); diff --git a/firmware/wideband_config.h b/firmware/wideband_config.h index 434b673..1750602 100644 --- a/firmware/wideband_config.h +++ b/firmware/wideband_config.h @@ -24,11 +24,9 @@ #define LSU_SENSE_R (61.9f) // ******************************* -// Pump driver +// Pump controller // ******************************* - -// todo - +#define NERNST_TARGET (0.45f) // ******************************* // Heater controller config