-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpam-test-stand.ino
139 lines (115 loc) · 2.95 KB
/
pam-test-stand.ino
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include "pam-test-stand.hpp"
const uint8_t PIN_ADS_CS = 53;
const uint8_t PIN_ADS_DRDY = 47;
const enum ADS1220_MUX CHAN_LOAD = ADS1220_MUX_3_2;
const enum ADS1220_MUX CHAN_POT = ADS1220_MUX_0_AVSS;
const enum ADS1220_MUX CHAN_PRES = ADS1220_MUX_1_AVSS;
const uint8_t PIN_OUTLET = 5;
const uint8_t PIN_INLET = 4;
// measurements
static float M_POSN_MV;
static float M_PRES_MV;
static float M_LOAD_MV;
static float M_POSN;
static float M_PRES;
static float M_LOAD;
// state variables
static float E_POSN;
static float E_VELO;
static float E_ACCL;
// input variables
static float U_VALVE;
float apply_cal(struct linear_cal* cal, float value) {
if (NULL == cal) {
return value;
} else {
return (value - cal->min) / (cal->max - cal->min) * cal->range;
}
}
/// PERIPHERAL INITIALIZATION
// Serial
void init_serial(void) {
Serial.begin(BAUD);
uprintf(L_COMMENT, "Initialized serial\r\n");
}
// ADS1220
ADS1220_WE ads(PIN_ADS_CS, PIN_ADS_DRDY);
void init_ads(void) {
pinMode(PIN_ADS_DRDY, INPUT);
pinMode(PIN_ADS_CS, OUTPUT);
if (!ads.init()) {
uprintf(L_COMMENT, "Failed to initialize ADS1220\r\n");
return;
} else {
uprintf(L_COMMENT, "Initialized ADS1220\r\n");
}
ads.bypassPGA(true);
ads.setGain(ADS1220_GAIN_1);
ads.setAvddAvssAsVrefAndCalibrate();
ads.setDataRate(ADS1220_DR_LVL_6);
ads.setOperatingMode(ADS1220_TURBO_MODE);
ads.setConversionMode(ADS1220_CONTINUOUS);
ads.setCompareChannels(CHAN_PRES);
}
int read_compare(const char* ref, size_t len) {
int ret;
char buf[LINE_LENGTH];
Serial.flush();
Serial.setTimeout(100 * 1000);
uprintf(L_COMMENT, "Awaiting '%s'\r\n", ref);
uprintf(L_COMMENT, "");
ret = Serial.readBytesUntil('\r', buf, sizeof(buf) - 1);
buf[ret] = 0;
uprintf(L_COMMENT, "Acknowledged '%s'\r\n", buf);
if (0 == ret) {
return -1;
}
if (ret > len) {
return len;
}
ret = strncmp(buf, ref, len);
return ret;
}
ret_t measurement_entry(task_t* tdata) {
ads.setCompareChannels(CHAN_LOAD);
M_LOAD_MV = ads.getVoltage_mV();
ads.setCompareChannels(CHAN_PRES);
M_PRES_MV = ads.getVoltage_mV();
M_PRES = apply_cal(&mv_to_100psi, M_PRES_MV);
ads.setCompareChannels(CHAN_POT);
M_POSN_MV = ads.getVoltage_mV();
M_POSN = apply_cal(&mv_to_mm, M_POSN_MV);
}
task_t measurement_task = {
.entry = measurement_entry,
.timer = millis,
.next = 0,
.period = 2,
.status = S_RUN,
};
ret_t data_output_entry(task_t* tdata) {
uprintf(L_RAW, "%.4f\t%.2f\t%.2f\t%.2f\r\n",
micros() / 1e6, M_POSN, M_PRES, M_LOAD);
return 0;
}
task_t data_output_task = {
.entry = data_output_entry,
.timer = millis,
.next = 0,
.period = 10,
.status = S_RUN,
};
void setup() {
init_serial();
init_ads();
init_sched();
tid_t measurement_id = add_task(measurement_task);
uprintf(L_COMMENT, "Initialized task %d\n", measurement_id);
tid_t data_output_id = add_task(data_output_task);
uprintf(L_COMMENT, "Initialized task %d\n", data_output_id);
uprintf(L_RAW, "Time\tP\r\n");
uprintf(L_COMMENT, "[s]\t[psi]\r\n");
}
void loop() {
run_tasks();
}