#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); }