summaryrefslogtreecommitdiffstats
path: root/stm32/app/pressure.c
blob: 6b90d93f4eb6f37d4807dde9c51566e96c7d44bb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include "project.h"

#define PRESSURE      GPIO0
#define PRESSURE_PORT     GPIOA
#define PRESSURE_CHANNEL  ADC_CHANNEL0
#define VREF_CHANNEL ADC_CHANNEL17

static unsigned poke;

static int pressure;

uint16_t pressure_ch (void)
{
  return pressure;
}




void pressure_tick (void)
{
  static unsigned ticker;

  ticker++;

  if (ticker < MS_TO_TICKS (2500))
    return;

  ticker = 0;
  poke = 1;

}




void pressure_dispatch (void)
{
  int v, r;

  if (!poke) return;

  poke = 0;

  if (adc_calibrate()) {
    pressure = 0;
    return;
  }

  v = adc_convert (PRESSURE_CHANNEL);
  r = adc_convert (VREF_CHANNEL);


  /* 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;
  }

  pressure = ((v * 552) / r) - 221;

  if (pressure < 0) pressure = 0;

  printf ("QP: %d %d %d\r\n", v, r, (pressure * 100) / 256);

}



void pressure_init (void)
{
  MAP_ANALOG (PRESSURE);
}