From 9d87c925a9eaa4fc256be3173c14a20d1469472d Mon Sep 17 00:00:00 2001 From: fishsoupisgood Date: Wed, 9 Sep 2020 11:53:37 +0100 Subject: everything, mostly, working --- boiler-monster/stm32/app/pressure.c | 164 ++++++++++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 boiler-monster/stm32/app/pressure.c (limited to 'boiler-monster/stm32/app/pressure.c') diff --git a/boiler-monster/stm32/app/pressure.c b/boiler-monster/stm32/app/pressure.c new file mode 100644 index 0000000..f719e4d --- /dev/null +++ b/boiler-monster/stm32/app/pressure.c @@ -0,0 +1,164 @@ +#include "project.h" + +#define PRESSURE GPIO0 +#define PRESSURE_PORT GPIOA +#define PRESSURE_CHANNEL ADC_CHANNEL0 +#define VREF_CHANNEL ADC_CHANNEL17 + +#define N_SAMPLES 1000 + +#define T do { printf("%s:%d\r\n",__FILE__,__LINE__); } while (0) + +static int pressure; + +struct avg { + int acc; + unsigned n; +}; + +static void avg_reset(struct avg *a) +{ +a->acc=0; +a->n=0; +return; +} +static void avg_add(struct avg *a, int v) +{ +a->acc+=v; +a->n++; +} +inline static unsigned avg_n(struct avg *a) +{ +return a->n; +} + +static int avg_get(struct avg *a) +{ +if (!a->n) return 0; +return (a->acc) / (a->n); +} + + +uint16_t pressure_ch (void) +{ + return pressure; +} + + +static void pressure_calculate (int v,int r) +{ + /* r is 1.25 volts, transducer is 0.5V -> 0 psi 4.5V -> 100psi */ + /* 100psi is 6.8947573 bar, and we want 256ths of bar */ + + + if (!r) { + pressure = 0; + // return; + } else { + pressure = ((v * 552) / r) - 221; + + if (pressure < 0) pressure = 0; + } + + printf ("QP: %d %d %d\r\n", v, r, (pressure * 100) / 256); +} + + + +void pressure_tick(void) +{ +static unsigned state; +static unsigned backoff=MS_TO_TICKS(1000); +static unsigned timeout; + +static struct avg vref_avg; +static struct avg pressure_avg; + + +timeout++; + +if (backoff) { + backoff--; + return; +} + + +switch (state) { +case 0: + adc_off (ADC1); + adc_power_on (ADC1); + backoff=MS_TO_TICKS(5); + state++; + break; +case 1: + ADC_CR2 (ADC1) |= ADC_CR2_RSTCAL; + backoff=MS_TO_TICKS(2); + state++; + break; +case 2: + if (ADC_CR2(ADC1) & ADC_CR2_CAL) + state=0; + ADC_CR2 (ADC1) |= ADC_CR2_CAL; + backoff=MS_TO_TICKS(2); + state++; + break; +case 3: + if (ADC_CR2(ADC1) & ADC_CR2_CAL) + state=0; + state++; + + avg_reset(&vref_avg); + avg_reset(&pressure_avg); + break; +case 4: + if (adc_convert_start(VREF_CHANNEL)) + state=0; + else { + timeout=0; + state++; + } + break; +case 5: + if (adc_convert_done()) { + avg_add(&vref_avg,adc_convert_get()); + state++; + } else if (timeout > MS_TO_TICKS(5)) + state=0; + break; +case 6: + if (adc_convert_start(PRESSURE_CHANNEL)) + state=0; + else { + timeout=0; + state++; + } + break; +case 7: + if (adc_convert_done()) { + avg_add(&pressure_avg,adc_convert_get()); + + if (avg_n(&pressure_avg) MS_TO_TICKS(5)) + state=0; + break; +case 8: + pressure_calculate(avg_get(&pressure_avg),avg_get(&vref_avg)); + state=0; + break; +} + +} + + + +void pressure_init (void) +{ + MAP_ANALOG (PRESSURE); +} + + + + -- cgit v1.2.3