STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
adc_mappings.h
Go to the documentation of this file.
1#pragma once
2#include "STAR_ADS126X.h"
3
4// Compile-time check of the datasheet's filter/rate pairing rules:
5// SINC1-4 : rates <= 7200 SPS
6// SINC5 : rates 14400 / 19200 / 38400 SPS only
7// FIR : rates 2.5 / 5 / 10 / 20 SPS only (it is a fixed 50/60 Hz
8// rejection filter and is not defined at any other rate)
9//
10// The previous version classified filters as "SINC1-4 or not", which put FIR
11// in the high-rate bucket: it rejected the only rates FIR actually supports
12// and accepted FIR at 38400 SPS, where the part does not offer it.
13constexpr bool ads126x_filter_rate_valid(uint8_t filter, uint8_t data_rate) {
14 const bool high_rate =
15 (data_rate == ADS126X_RATE_14400 || data_rate == ADS126X_RATE_19200 ||
16 data_rate == ADS126X_RATE_38400);
17 const bool fir_rate =
18 (data_rate == ADS126X_RATE_2_5 || data_rate == ADS126X_RATE_5 ||
19 data_rate == ADS126X_RATE_10 || data_rate == ADS126X_RATE_20);
20 const bool is_sinc1to4 =
21 (filter == ADS126X_SINC1 || filter == ADS126X_SINC2 ||
22 filter == ADS126X_SINC3 || filter == ADS126X_SINC4);
23 if (filter == ADS126X_FIR)
24 return fir_rate;
25 if (filter == ADS126X_SINC5)
26 return high_rate;
27 return is_sinc1to4 && !high_rate;
28}
29
30#define ADS126X_ASSERT_FILTER_RATE(filter, rate) \
31 static_assert( \
32 ads126x_filter_rate_valid((uint8_t)(filter), (uint8_t)(rate)), \
33 "Invalid FILTER/DATA_RATE combination: " \
34 "rates <= 7200 SPS require SINC1-4; " \
35 "rates 14400/19200/38400 SPS require SINC5")
36
37// From page 64 of ADS126X datasheet
38constexpr uint8_t baseSettlePulses(uint8_t f) {
39 switch (f) {
40 case ADS126X_FIR:
41 return 1;
42 case ADS126X_SINC1:
43 return 1;
44 case ADS126X_SINC2:
45 return 2;
46 case ADS126X_SINC3:
47 return 3;
48 case ADS126X_SINC4:
49 return 4;
50 case ADS126X_SINC5:
51 return 5;
52 default:
53 return 1; // safe fallback
54 }
55}
56
57constexpr uint8_t settlePulses(uint8_t filter, uint8_t data_rate,
58 bool chop_enabled = false,
59 bool idac_rotation_enabled = false) {
60 if (data_rate == ADS126X_RATE_38400)
61 return 5;
62
63 uint8_t n = baseSettlePulses(filter);
64
65 if (chop_enabled)
66 n *= 2;
67 if (idac_rotation_enabled)
68 n *= 2;
69
70 return n;
71}
#define ADS126X_RATE_38400
#define ADS126X_RATE_20
#define ADS126X_RATE_19200
#define ADS126X_SINC5
#define ADS126X_RATE_5
#define ADS126X_SINC2
#define ADS126X_FIR
#define ADS126X_RATE_14400
#define ADS126X_RATE_2_5
#define ADS126X_SINC1
#define ADS126X_RATE_10
#define ADS126X_SINC4
#define ADS126X_SINC3
constexpr uint8_t baseSettlePulses(uint8_t f)
constexpr bool ads126x_filter_rate_valid(uint8_t filter, uint8_t data_rate)
constexpr uint8_t settlePulses(uint8_t filter, uint8_t data_rate, bool chop_enabled=false, bool idac_rotation_enabled=false)
*brief user defined string literal for JSON values *sa std::size_t n
Definition json.hpp:24474