@@ -22,6 +22,16 @@ namespace {
22
22
void user_delay (uint32_t period_us, void * /* intf_ptr*/ ) {
23
23
nrf_delay_us (period_us);
24
24
}
25
+
26
+ // Scale factors to convert accelerometer counts to milli-g
27
+ // from datasheet: https://files.pine64.org/doc/datasheet/pinetime/BST-BMA421-FL000.pdf
28
+ // The array index to use is stored in accel_conf.range
29
+ constexpr int16_t accelScaleFactors[] = {
30
+ [BMA4_ACCEL_RANGE_2G] = 1024 , // LSB/g +/- 2g range
31
+ [BMA4_ACCEL_RANGE_4G] = 512 , // LSB/g +/- 4g range
32
+ [BMA4_ACCEL_RANGE_8G] = 256 , // LSB/g +/- 8g range
33
+ [BMA4_ACCEL_RANGE_16G] = 128 // LSB/g +/- 16g range
34
+ };
25
35
}
26
36
27
37
Bma421::Bma421 (TwiMaster& twiMaster, uint8_t twiAddress) : twiMaster {twiMaster}, deviceAddress {twiAddress} {
@@ -74,7 +84,6 @@ void Bma421::Init() {
74
84
if (ret != BMA4_OK)
75
85
return ;
76
86
77
- struct bma4_accel_config accel_conf;
78
87
accel_conf.odr = BMA4_OUTPUT_DATA_RATE_100HZ;
79
88
accel_conf.range = BMA4_ACCEL_RANGE_2G;
80
89
accel_conf.bandwidth = BMA4_ACCEL_NORMAL_AVG4;
@@ -102,8 +111,17 @@ void Bma421::Write(uint8_t registerAddress, const uint8_t* data, size_t size) {
102
111
Bma421::Values Bma421::Process () {
103
112
if (not isOk)
104
113
return {};
114
+ struct bma4_accel rawData;
105
115
struct bma4_accel data;
106
- bma4_read_accel_xyz (&data, &bma);
116
+ bma4_read_accel_xyz (&rawData, &bma);
117
+
118
+ // Scale the measured ADC counts to units of 'binary milli-g'
119
+ // where 1g = 1024 'binary milli-g' units.
120
+ // See https://github.com/InfiniTimeOrg/InfiniTime/pull/1950 for
121
+ // discussion of why we opted for scaling to 1024 rather than 1000.
122
+ data.x = 1024 * rawData.x / accelScaleFactors[accel_conf.range ];
123
+ data.y = 1024 * rawData.y / accelScaleFactors[accel_conf.range ];
124
+ data.z = 1024 * rawData.z / accelScaleFactors[accel_conf.range ];
107
125
108
126
uint32_t steps = 0 ;
109
127
bma423_step_counter_output (&steps, &bma);
0 commit comments