User | Revision | Line number | New contents of line |
5hel2l2y |
0:46630122dec9
|
1
|
#include "LSM6DS3.h"
|
5hel2l2y |
0:46630122dec9
|
2
|
|
5hel2l2y |
0:46630122dec9
|
3
|
LSM6DS3::LSM6DS3(PinName sda, PinName scl, uint8_t xgAddr) : i2c(sda, scl)
|
5hel2l2y |
0:46630122dec9
|
4
|
{
|
5hel2l2y |
0:46630122dec9
|
5
|
// xgAddress will store the 7-bit I2C address, if using I2C.
|
5hel2l2y |
0:46630122dec9
|
6
|
xgAddress = xgAddr;
|
5hel2l2y |
0:46630122dec9
|
7
|
}
|
5hel2l2y |
0:46630122dec9
|
8
|
|
5hel2l2y |
0:46630122dec9
|
9
|
uint16_t LSM6DS3::begin(gyro_scale gScl, accel_scale aScl,
|
5hel2l2y |
0:46630122dec9
|
10
|
gyro_odr gODR, accel_odr aODR)
|
5hel2l2y |
0:46630122dec9
|
11
|
{
|
5hel2l2y |
0:46630122dec9
|
12
|
// Store the given scales in class variables. These scale variables
|
5hel2l2y |
0:46630122dec9
|
13
|
// are used throughout to calculate the actual g's, DPS,and Gs's.
|
5hel2l2y |
0:46630122dec9
|
14
|
gScale = gScl;
|
5hel2l2y |
0:46630122dec9
|
15
|
aScale = aScl;
|
5hel2l2y |
0:46630122dec9
|
16
|
|
5hel2l2y |
0:46630122dec9
|
17
|
// Once we have the scale values, we can calculate the resolution
|
5hel2l2y |
0:46630122dec9
|
18
|
// of each sensor. That's what these functions are for. One for each sensor
|
5hel2l2y |
0:46630122dec9
|
19
|
calcgRes(); // Calculate DPS / ADC tick, stored in gRes variable
|
5hel2l2y |
0:46630122dec9
|
20
|
calcaRes(); // Calculate g / ADC tick, stored in aRes variable
|
5hel2l2y |
0:46630122dec9
|
21
|
|
5hel2l2y |
0:46630122dec9
|
22
|
|
5hel2l2y |
0:46630122dec9
|
23
|
// To verify communication, we can read from the WHO_AM_I register of
|
5hel2l2y |
0:46630122dec9
|
24
|
// each device. Store those in a variable so we can return them.
|
5hel2l2y |
0:46630122dec9
|
25
|
// The start of the addresses we want to read from
|
5hel2l2y |
0:46630122dec9
|
26
|
char cmd[2] = {
|
5hel2l2y |
0:46630122dec9
|
27
|
WHO_AM_I_REG,
|
5hel2l2y |
0:46630122dec9
|
28
|
0
|
5hel2l2y |
0:46630122dec9
|
29
|
};
|
5hel2l2y |
0:46630122dec9
|
30
|
|
5hel2l2y |
0:46630122dec9
|
31
|
// Write the address we are going to read from and don't end the transaction
|
5hel2l2y |
0:46630122dec9
|
32
|
i2c.write(xgAddress, cmd, 1, true);
|
5hel2l2y |
0:46630122dec9
|
33
|
// Read in all the 8 bits of data
|
5hel2l2y |
0:46630122dec9
|
34
|
i2c.read(xgAddress, cmd+1, 1);
|
5hel2l2y |
0:46630122dec9
|
35
|
uint8_t xgTest = cmd[1]; // Read the accel/gyro WHO_AM_I
|
5hel2l2y |
0:46630122dec9
|
36
|
|
5hel2l2y |
0:46630122dec9
|
37
|
// Gyro initialization stuff:
|
5hel2l2y |
0:46630122dec9
|
38
|
initGyro(); // This will "turn on" the gyro. Setting up interrupts, etc.
|
5hel2l2y |
0:46630122dec9
|
39
|
setGyroODR(gODR); // Set the gyro output data rate and bandwidth.
|
5hel2l2y |
0:46630122dec9
|
40
|
setGyroScale(gScale); // Set the gyro range
|
5hel2l2y |
0:46630122dec9
|
41
|
|
5hel2l2y |
0:46630122dec9
|
42
|
// Accelerometer initialization stuff:
|
5hel2l2y |
0:46630122dec9
|
43
|
initAccel(); // "Turn on" all axes of the accel. Set up interrupts, etc.
|
5hel2l2y |
0:46630122dec9
|
44
|
setAccelODR(aODR); // Set the accel data rate.
|
5hel2l2y |
0:46630122dec9
|
45
|
setAccelScale(aScale); // Set the accel range.
|
5hel2l2y |
0:46630122dec9
|
46
|
|
5hel2l2y |
0:46630122dec9
|
47
|
// Once everything is initialized, return the WHO_AM_I registers we read:
|
5hel2l2y |
0:46630122dec9
|
48
|
return xgTest;
|
5hel2l2y |
0:46630122dec9
|
49
|
}
|
5hel2l2y |
0:46630122dec9
|
50
|
|
5hel2l2y |
0:46630122dec9
|
51
|
void LSM6DS3::initGyro()
|
5hel2l2y |
0:46630122dec9
|
52
|
{
|
5hel2l2y |
0:46630122dec9
|
53
|
char cmd[4] = {
|
5hel2l2y |
0:46630122dec9
|
54
|
CTRL2_G,
|
5hel2l2y |
1:924c7dea286e
|
55
|
gScale | G_ODR_104,
|
5hel2l2y |
0:46630122dec9
|
56
|
0, // Default data out and int out
|
5hel2l2y |
0:46630122dec9
|
57
|
0 // Default power mode and high pass settings
|
5hel2l2y |
0:46630122dec9
|
58
|
};
|
5hel2l2y |
0:46630122dec9
|
59
|
|
5hel2l2y |
0:46630122dec9
|
60
|
// Write the data to the gyro control registers
|
5hel2l2y |
0:46630122dec9
|
61
|
i2c.write(xgAddress, cmd, 4);
|
5hel2l2y |
0:46630122dec9
|
62
|
}
|
5hel2l2y |
0:46630122dec9
|
63
|
|
5hel2l2y |
0:46630122dec9
|
64
|
void LSM6DS3::initAccel()
|
5hel2l2y |
0:46630122dec9
|
65
|
{
|
5hel2l2y |
0:46630122dec9
|
66
|
char cmd[4] = {
|
5hel2l2y |
0:46630122dec9
|
67
|
CTRL1_XL,
|
5hel2l2y |
0:46630122dec9
|
68
|
0x38, // Enable all axis and don't decimate data in out Registers
|
5hel2l2y |
1:924c7dea286e
|
69
|
(A_ODR_104 << 5) | (aScale << 3) | (A_BW_AUTO_SCALE), // 119 Hz ODR, set scale, and auto BW
|
5hel2l2y |
0:46630122dec9
|
70
|
0 // Default resolution mode and filtering settings
|
5hel2l2y |
0:46630122dec9
|
71
|
};
|
5hel2l2y |
0:46630122dec9
|
72
|
|
5hel2l2y |
0:46630122dec9
|
73
|
// Write the data to the accel control registers
|
5hel2l2y |
0:46630122dec9
|
74
|
i2c.write(xgAddress, cmd, 4);
|
5hel2l2y |
0:46630122dec9
|
75
|
}
|
5hel2l2y |
0:46630122dec9
|
76
|
|
5hel2l2y |
0:46630122dec9
|
77
|
void LSM6DS3::readAccel()
|
5hel2l2y |
0:46630122dec9
|
78
|
{
|
5hel2l2y |
0:46630122dec9
|
79
|
// The data we are going to read from the accel
|
5hel2l2y |
0:46630122dec9
|
80
|
char data[6];
|
5hel2l2y |
0:46630122dec9
|
81
|
|
5hel2l2y |
0:46630122dec9
|
82
|
// Set addresses
|
5hel2l2y |
0:46630122dec9
|
83
|
char subAddressXL = OUTX_L_XL;
|
5hel2l2y |
0:46630122dec9
|
84
|
char subAddressXH = OUTX_H_XL;
|
5hel2l2y |
0:46630122dec9
|
85
|
char subAddressYL = OUTY_L_XL;
|
5hel2l2y |
0:46630122dec9
|
86
|
char subAddressYH = OUTY_H_XL;
|
5hel2l2y |
0:46630122dec9
|
87
|
char subAddressZL = OUTZ_L_XL;
|
5hel2l2y |
0:46630122dec9
|
88
|
char subAddressZH = OUTZ_H_XL;
|
5hel2l2y |
0:46630122dec9
|
89
|
|
5hel2l2y |
0:46630122dec9
|
90
|
// Write the address we are going to read from and don't end the transaction
|
5hel2l2y |
0:46630122dec9
|
91
|
i2c.write(xgAddress, &subAddressXL, 1, true);
|
5hel2l2y |
0:46630122dec9
|
92
|
// Read in register containing the axes data and alocated to the correct index
|
5hel2l2y |
0:46630122dec9
|
93
|
i2c.read(xgAddress, data, 1);
|
5hel2l2y |
0:46630122dec9
|
94
|
|
5hel2l2y |
0:46630122dec9
|
95
|
i2c.write(xgAddress, &subAddressXH, 1, true);
|
5hel2l2y |
0:46630122dec9
|
96
|
i2c.read(xgAddress, (data + 1), 1);
|
5hel2l2y |
0:46630122dec9
|
97
|
i2c.write(xgAddress, &subAddressYL, 1, true);
|
5hel2l2y |
0:46630122dec9
|
98
|
i2c.read(xgAddress, (data + 2), 1);
|
5hel2l2y |
0:46630122dec9
|
99
|
i2c.write(xgAddress, &subAddressYH, 1, true);
|
5hel2l2y |
0:46630122dec9
|
100
|
i2c.read(xgAddress, (data + 3), 1);
|
5hel2l2y |
0:46630122dec9
|
101
|
i2c.write(xgAddress, &subAddressZL, 1, true);
|
5hel2l2y |
0:46630122dec9
|
102
|
i2c.read(xgAddress, (data + 4), 1);
|
5hel2l2y |
0:46630122dec9
|
103
|
i2c.write(xgAddress, &subAddressZH, 1, true);
|
5hel2l2y |
0:46630122dec9
|
104
|
i2c.read(xgAddress, (data + 5), 1);
|
5hel2l2y |
0:46630122dec9
|
105
|
|
5hel2l2y |
0:46630122dec9
|
106
|
// Reassemble the data and convert to g
|
5hel2l2y |
0:46630122dec9
|
107
|
ax_raw = data[0] | (data[1] << 8);
|
5hel2l2y |
0:46630122dec9
|
108
|
ay_raw = data[2] | (data[3] << 8);
|
5hel2l2y |
0:46630122dec9
|
109
|
az_raw = data[4] | (data[5] << 8);
|
5hel2l2y |
0:46630122dec9
|
110
|
ax = ax_raw * aRes;
|
5hel2l2y |
0:46630122dec9
|
111
|
ay = ay_raw * aRes;
|
5hel2l2y |
0:46630122dec9
|
112
|
az = az_raw * aRes;
|
5hel2l2y |
0:46630122dec9
|
113
|
}
|
5hel2l2y |
0:46630122dec9
|
114
|
|
5hel2l2y |
0:46630122dec9
|
115
|
void LSM6DS3::readTemp()
|
5hel2l2y |
0:46630122dec9
|
116
|
{
|
5hel2l2y |
0:46630122dec9
|
117
|
// The data we are going to read from the temp
|
5hel2l2y |
0:46630122dec9
|
118
|
char data[2];
|
5hel2l2y |
0:46630122dec9
|
119
|
|
5hel2l2y |
0:46630122dec9
|
120
|
// Set addresses
|
5hel2l2y |
0:46630122dec9
|
121
|
char subAddressL = OUT_TEMP_L;
|
5hel2l2y |
0:46630122dec9
|
122
|
char subAddressH = OUT_TEMP_H;
|
5hel2l2y |
0:46630122dec9
|
123
|
|
5hel2l2y |
0:46630122dec9
|
124
|
// Write the address we are going to read from and don't end the transaction
|
5hel2l2y |
0:46630122dec9
|
125
|
i2c.write(xgAddress, &subAddressL, 1, true);
|
5hel2l2y |
0:46630122dec9
|
126
|
// Read in register containing the temperature data and alocated to the correct index
|
5hel2l2y |
0:46630122dec9
|
127
|
i2c.read(xgAddress, data, 1);
|
5hel2l2y |
0:46630122dec9
|
128
|
|
5hel2l2y |
0:46630122dec9
|
129
|
i2c.write(xgAddress, &subAddressH, 1, true);
|
5hel2l2y |
0:46630122dec9
|
130
|
i2c.read(xgAddress, (data + 1), 1);
|
5hel2l2y |
0:46630122dec9
|
131
|
|
5hel2l2y |
0:46630122dec9
|
132
|
// Temperature is a 12-bit signed integer
|
5hel2l2y |
0:46630122dec9
|
133
|
temperature_raw = data[0] | (data[1] << 8);
|
5hel2l2y |
0:46630122dec9
|
134
|
|
5hel2l2y |
0:46630122dec9
|
135
|
temperature_c = (float)temperature_raw / 16.0 + 25.0;
|
5hel2l2y |
0:46630122dec9
|
136
|
temperature_f = temperature_c * 1.8 + 32.0;
|
5hel2l2y |
0:46630122dec9
|
137
|
}
|
5hel2l2y |
0:46630122dec9
|
138
|
|
5hel2l2y |
0:46630122dec9
|
139
|
|
5hel2l2y |
0:46630122dec9
|
140
|
void LSM6DS3::readGyro()
|
5hel2l2y |
0:46630122dec9
|
141
|
{
|
5hel2l2y |
0:46630122dec9
|
142
|
// The data we are going to read from the gyro
|
5hel2l2y |
0:46630122dec9
|
143
|
char data[6];
|
5hel2l2y |
0:46630122dec9
|
144
|
|
5hel2l2y |
0:46630122dec9
|
145
|
// Set addresses
|
5hel2l2y |
0:46630122dec9
|
146
|
char subAddressXL = OUTX_L_G;
|
5hel2l2y |
0:46630122dec9
|
147
|
char subAddressXH = OUTX_H_G;
|
5hel2l2y |
0:46630122dec9
|
148
|
char subAddressYL = OUTY_L_G;
|
5hel2l2y |
0:46630122dec9
|
149
|
char subAddressYH = OUTY_H_G;
|
5hel2l2y |
0:46630122dec9
|
150
|
char subAddressZL = OUTZ_L_G;
|
5hel2l2y |
0:46630122dec9
|
151
|
char subAddressZH = OUTZ_H_G;
|
5hel2l2y |
0:46630122dec9
|
152
|
|
5hel2l2y |
0:46630122dec9
|
153
|
// Write the address we are going to read from and don't end the transaction
|
5hel2l2y |
0:46630122dec9
|
154
|
i2c.write(xgAddress, &subAddressXL, 1, true);
|
5hel2l2y |
0:46630122dec9
|
155
|
// Read in register containing the axes data and alocated to the correct index
|
5hel2l2y |
0:46630122dec9
|
156
|
i2c.read(xgAddress, data, 1);
|
5hel2l2y |
0:46630122dec9
|
157
|
|
5hel2l2y |
0:46630122dec9
|
158
|
i2c.write(xgAddress, &subAddressXH, 1, true);
|
5hel2l2y |
0:46630122dec9
|
159
|
i2c.read(xgAddress, (data + 1), 1);
|
5hel2l2y |
0:46630122dec9
|
160
|
i2c.write(xgAddress, &subAddressYL, 1, true);
|
5hel2l2y |
0:46630122dec9
|
161
|
i2c.read(xgAddress, (data + 2), 1);
|
5hel2l2y |
0:46630122dec9
|
162
|
i2c.write(xgAddress, &subAddressYH, 1, true);
|
5hel2l2y |
0:46630122dec9
|
163
|
i2c.read(xgAddress, (data + 3), 1);
|
5hel2l2y |
0:46630122dec9
|
164
|
i2c.write(xgAddress, &subAddressZL, 1, true);
|
5hel2l2y |
0:46630122dec9
|
165
|
i2c.read(xgAddress, (data + 4), 1);
|
5hel2l2y |
0:46630122dec9
|
166
|
i2c.write(xgAddress, &subAddressZH, 1, true);
|
5hel2l2y |
0:46630122dec9
|
167
|
i2c.read(xgAddress, (data + 5), 1);
|
5hel2l2y |
0:46630122dec9
|
168
|
|
5hel2l2y |
0:46630122dec9
|
169
|
// Reassemble the data and convert to degrees/sec
|
5hel2l2y |
0:46630122dec9
|
170
|
gx_raw = data[0] | (data[1] << 8);
|
5hel2l2y |
0:46630122dec9
|
171
|
gy_raw = data[2] | (data[3] << 8);
|
5hel2l2y |
0:46630122dec9
|
172
|
gz_raw = data[4] | (data[5] << 8);
|
5hel2l2y |
0:46630122dec9
|
173
|
gx = gx_raw * gRes;
|
5hel2l2y |
0:46630122dec9
|
174
|
gy = gy_raw * gRes;
|
5hel2l2y |
0:46630122dec9
|
175
|
gz = gz_raw * gRes;
|
5hel2l2y |
0:46630122dec9
|
176
|
}
|
5hel2l2y |
0:46630122dec9
|
177
|
|
5hel2l2y |
0:46630122dec9
|
178
|
void LSM6DS3::setGyroScale(gyro_scale gScl)
|
5hel2l2y |
0:46630122dec9
|
179
|
{
|
5hel2l2y |
0:46630122dec9
|
180
|
// The start of the addresses we want to read from
|
5hel2l2y |
0:46630122dec9
|
181
|
char cmd[2] = {
|
5hel2l2y |
0:46630122dec9
|
182
|
CTRL2_G,
|
5hel2l2y |
0:46630122dec9
|
183
|
0
|
5hel2l2y |
0:46630122dec9
|
184
|
};
|
5hel2l2y |
0:46630122dec9
|
185
|
|
5hel2l2y |
0:46630122dec9
|
186
|
// Write the address we are going to read from and don't end the transaction
|
5hel2l2y |
0:46630122dec9
|
187
|
i2c.write(xgAddress, cmd, 1, true);
|
5hel2l2y |
0:46630122dec9
|
188
|
// Read in all the 8 bits of data
|
5hel2l2y |
0:46630122dec9
|
189
|
i2c.read(xgAddress, cmd+1, 1);
|
5hel2l2y |
0:46630122dec9
|
190
|
|
5hel2l2y |
0:46630122dec9
|
191
|
// Then mask out the gyro scale bits:
|
5hel2l2y |
0:46630122dec9
|
192
|
cmd[1] &= 0xFF^(0x3 << 3);
|
5hel2l2y |
0:46630122dec9
|
193
|
// Then shift in our new scale bits:
|
5hel2l2y |
0:46630122dec9
|
194
|
cmd[1] |= gScl << 3;
|
5hel2l2y |
0:46630122dec9
|
195
|
|
5hel2l2y |
0:46630122dec9
|
196
|
// Write the gyroscale out to the gyro
|
5hel2l2y |
0:46630122dec9
|
197
|
i2c.write(xgAddress, cmd, 2);
|
5hel2l2y |
0:46630122dec9
|
198
|
|
5hel2l2y |
0:46630122dec9
|
199
|
// We've updated the sensor, but we also need to update our class variables
|
5hel2l2y |
0:46630122dec9
|
200
|
// First update gScale:
|
5hel2l2y |
0:46630122dec9
|
201
|
gScale = gScl;
|
5hel2l2y |
0:46630122dec9
|
202
|
// Then calculate a new gRes, which relies on gScale being set correctly:
|
5hel2l2y |
0:46630122dec9
|
203
|
calcgRes();
|
5hel2l2y |
0:46630122dec9
|
204
|
}
|
5hel2l2y |
0:46630122dec9
|
205
|
|
5hel2l2y |
0:46630122dec9
|
206
|
void LSM6DS3::setAccelScale(accel_scale aScl)
|
5hel2l2y |
0:46630122dec9
|
207
|
{
|
5hel2l2y |
0:46630122dec9
|
208
|
// The start of the addresses we want to read from
|
5hel2l2y |
0:46630122dec9
|
209
|
char cmd[2] = {
|
5hel2l2y |
0:46630122dec9
|
210
|
CTRL1_XL,
|
5hel2l2y |
0:46630122dec9
|
211
|
0
|
5hel2l2y |
0:46630122dec9
|
212
|
};
|
5hel2l2y |
0:46630122dec9
|
213
|
|
5hel2l2y |
0:46630122dec9
|
214
|
// Write the address we are going to read from and don't end the transaction
|
5hel2l2y |
0:46630122dec9
|
215
|
i2c.write(xgAddress, cmd, 1, true);
|
5hel2l2y |
0:46630122dec9
|
216
|
// Read in all the 8 bits of data
|
5hel2l2y |
0:46630122dec9
|
217
|
i2c.read(xgAddress, cmd+1, 1);
|
5hel2l2y |
0:46630122dec9
|
218
|
|
5hel2l2y |
0:46630122dec9
|
219
|
// Then mask out the accel scale bits:
|
5hel2l2y |
0:46630122dec9
|
220
|
cmd[1] &= 0xFF^(0x3 << 3);
|
5hel2l2y |
0:46630122dec9
|
221
|
// Then shift in our new scale bits:
|
5hel2l2y |
0:46630122dec9
|
222
|
cmd[1] |= aScl << 3;
|
5hel2l2y |
0:46630122dec9
|
223
|
|
5hel2l2y |
0:46630122dec9
|
224
|
// Write the accelscale out to the accel
|
5hel2l2y |
0:46630122dec9
|
225
|
i2c.write(xgAddress, cmd, 2);
|
5hel2l2y |
0:46630122dec9
|
226
|
|
5hel2l2y |
0:46630122dec9
|
227
|
// We've updated the sensor, but we also need to update our class variables
|
5hel2l2y |
0:46630122dec9
|
228
|
// First update aScale:
|
5hel2l2y |
0:46630122dec9
|
229
|
aScale = aScl;
|
5hel2l2y |
0:46630122dec9
|
230
|
// Then calculate a new aRes, which relies on aScale being set correctly:
|
5hel2l2y |
0:46630122dec9
|
231
|
calcaRes();
|
5hel2l2y |
0:46630122dec9
|
232
|
}
|
5hel2l2y |
0:46630122dec9
|
233
|
|
5hel2l2y |
0:46630122dec9
|
234
|
void LSM6DS3::setGyroODR(gyro_odr gRate)
|
5hel2l2y |
0:46630122dec9
|
235
|
{
|
5hel2l2y |
0:46630122dec9
|
236
|
// The start of the addresses we want to read from
|
5hel2l2y |
0:46630122dec9
|
237
|
char cmd[2] = {
|
5hel2l2y |
0:46630122dec9
|
238
|
CTRL2_G,
|
5hel2l2y |
0:46630122dec9
|
239
|
0
|
5hel2l2y |
0:46630122dec9
|
240
|
};
|
5hel2l2y |
1:924c7dea286e
|
241
|
|
5hel2l2y |
1:924c7dea286e
|
242
|
// Set low power based on ODR, else keep sensor on high performance
|
5hel2l2y |
1:924c7dea286e
|
243
|
if(gRate == G_ODR_13_BW_0 | gRate == G_ODR_26_BW_2 | gRate == G_ODR_52_BW_16) {
|
5hel2l2y |
1:924c7dea286e
|
244
|
char cmdLow[2] ={
|
5hel2l2y |
1:924c7dea286e
|
245
|
CTRL7_G,
|
5hel2l2y |
1:924c7dea286e
|
246
|
1
|
5hel2l2y |
1:924c7dea286e
|
247
|
};
|
5hel2l2y |
1:924c7dea286e
|
248
|
|
5hel2l2y |
1:924c7dea286e
|
249
|
i2c.write(xgAddress, cmdLow, 2);
|
5hel2l2y |
1:924c7dea286e
|
250
|
}
|
5hel2l2y |
1:924c7dea286e
|
251
|
else {
|
5hel2l2y |
1:924c7dea286e
|
252
|
char cmdLow[2] ={
|
5hel2l2y |
1:924c7dea286e
|
253
|
CTRL7_G,
|
5hel2l2y |
1:924c7dea286e
|
254
|
0
|
5hel2l2y |
1:924c7dea286e
|
255
|
};
|
5hel2l2y |
1:924c7dea286e
|
256
|
|
5hel2l2y |
1:924c7dea286e
|
257
|
i2c.write(xgAddress, cmdLow, 2);
|
5hel2l2y |
1:924c7dea286e
|
258
|
}
|
5hel2l2y |
0:46630122dec9
|
259
|
|
5hel2l2y |
0:46630122dec9
|
260
|
// Write the address we are going to read from and don't end the transaction
|
5hel2l2y |
0:46630122dec9
|
261
|
i2c.write(xgAddress, cmd, 1, true);
|
5hel2l2y |
0:46630122dec9
|
262
|
// Read in all the 8 bits of data
|
5hel2l2y |
0:46630122dec9
|
263
|
i2c.read(xgAddress, cmd+1, 1);
|
5hel2l2y |
0:46630122dec9
|
264
|
|
5hel2l2y |
0:46630122dec9
|
265
|
// Then mask out the gyro odr bits:
|
5hel2l2y |
0:46630122dec9
|
266
|
cmd[1] &= (0x3 << 3);
|
5hel2l2y |
0:46630122dec9
|
267
|
// Then shift in our new odr bits:
|
5hel2l2y |
0:46630122dec9
|
268
|
cmd[1] |= gRate;
|
5hel2l2y |
0:46630122dec9
|
269
|
|
5hel2l2y |
0:46630122dec9
|
270
|
// Write the gyroodr out to the gyro
|
5hel2l2y |
0:46630122dec9
|
271
|
i2c.write(xgAddress, cmd, 2);
|
5hel2l2y |
0:46630122dec9
|
272
|
}
|
5hel2l2y |
0:46630122dec9
|
273
|
|
5hel2l2y |
0:46630122dec9
|
274
|
void LSM6DS3::setAccelODR(accel_odr aRate)
|
5hel2l2y |
0:46630122dec9
|
275
|
{
|
5hel2l2y |
0:46630122dec9
|
276
|
// The start of the addresses we want to read from
|
5hel2l2y |
0:46630122dec9
|
277
|
char cmd[2] = {
|
5hel2l2y |
0:46630122dec9
|
278
|
CTRL1_XL,
|
5hel2l2y |
0:46630122dec9
|
279
|
0
|
5hel2l2y |
0:46630122dec9
|
280
|
};
|
5hel2l2y |
1:924c7dea286e
|
281
|
|
5hel2l2y |
1:924c7dea286e
|
282
|
// Set low power based on ODR, else keep sensor on high performance
|
5hel2l2y |
1:924c7dea286e
|
283
|
if(aRate == A_ODR_13 | aRate == A_ODR_26 | aRate == A_ODR_52) {
|
5hel2l2y |
1:924c7dea286e
|
284
|
char cmdLow[2] ={
|
5hel2l2y |
1:924c7dea286e
|
285
|
CTRL6_C,
|
5hel2l2y |
1:924c7dea286e
|
286
|
1
|
5hel2l2y |
1:924c7dea286e
|
287
|
};
|
5hel2l2y |
1:924c7dea286e
|
288
|
|
5hel2l2y |
1:924c7dea286e
|
289
|
i2c.write(xgAddress, cmdLow, 2);
|
5hel2l2y |
1:924c7dea286e
|
290
|
}
|
5hel2l2y |
1:924c7dea286e
|
291
|
else {
|
5hel2l2y |
1:924c7dea286e
|
292
|
char cmdLow[2] ={
|
5hel2l2y |
1:924c7dea286e
|
293
|
CTRL6_C,
|
5hel2l2y |
1:924c7dea286e
|
294
|
0
|
5hel2l2y |
1:924c7dea286e
|
295
|
};
|
5hel2l2y |
1:924c7dea286e
|
296
|
|
5hel2l2y |
1:924c7dea286e
|
297
|
i2c.write(xgAddress, cmdLow, 2);
|
5hel2l2y |
1:924c7dea286e
|
298
|
}
|
5hel2l2y |
0:46630122dec9
|
299
|
|
5hel2l2y |
0:46630122dec9
|
300
|
// Write the address we are going to read from and don't end the transaction
|
5hel2l2y |
0:46630122dec9
|
301
|
i2c.write(xgAddress, cmd, 1, true);
|
5hel2l2y |
0:46630122dec9
|
302
|
// Read in all the 8 bits of data
|
5hel2l2y |
0:46630122dec9
|
303
|
i2c.read(xgAddress, cmd+1, 1);
|
5hel2l2y |
0:46630122dec9
|
304
|
|
5hel2l2y |
0:46630122dec9
|
305
|
// Then mask out the accel odr bits:
|
5hel2l2y |
0:46630122dec9
|
306
|
cmd[1] &= 0xFF^(0x7 << 5);
|
5hel2l2y |
0:46630122dec9
|
307
|
// Then shift in our new odr bits:
|
5hel2l2y |
0:46630122dec9
|
308
|
cmd[1] |= aRate << 5;
|
5hel2l2y |
0:46630122dec9
|
309
|
|
5hel2l2y |
0:46630122dec9
|
310
|
// Write the accelodr out to the accel
|
5hel2l2y |
0:46630122dec9
|
311
|
i2c.write(xgAddress, cmd, 2);
|
5hel2l2y |
0:46630122dec9
|
312
|
}
|
5hel2l2y |
0:46630122dec9
|
313
|
|
5hel2l2y |
0:46630122dec9
|
314
|
void LSM6DS3::calcgRes()
|
5hel2l2y |
0:46630122dec9
|
315
|
{
|
5hel2l2y |
0:46630122dec9
|
316
|
// Possible gyro scales (and their register bit settings) are:
|
5hel2l2y |
0:46630122dec9
|
317
|
// 245 DPS (00), 500 DPS (01), 2000 DPS (10).
|
5hel2l2y |
0:46630122dec9
|
318
|
switch (gScale)
|
5hel2l2y |
0:46630122dec9
|
319
|
{
|
5hel2l2y |
0:46630122dec9
|
320
|
case G_SCALE_245DPS:
|
5hel2l2y |
0:46630122dec9
|
321
|
gRes = 245.0 / 32768.0;
|
5hel2l2y |
0:46630122dec9
|
322
|
break;
|
5hel2l2y |
0:46630122dec9
|
323
|
case G_SCALE_500DPS:
|
5hel2l2y |
0:46630122dec9
|
324
|
gRes = 500.0 / 32768.0;
|
5hel2l2y |
0:46630122dec9
|
325
|
break;
|
5hel2l2y |
0:46630122dec9
|
326
|
case G_SCALE_2000DPS:
|
5hel2l2y |
0:46630122dec9
|
327
|
gRes = 2000.0 / 32768.0;
|
5hel2l2y |
0:46630122dec9
|
328
|
break;
|
5hel2l2y |
0:46630122dec9
|
329
|
}
|
5hel2l2y |
0:46630122dec9
|
330
|
}
|
5hel2l2y |
0:46630122dec9
|
331
|
|
5hel2l2y |
0:46630122dec9
|
332
|
void LSM6DS3::calcaRes()
|
5hel2l2y |
0:46630122dec9
|
333
|
{
|
5hel2l2y |
0:46630122dec9
|
334
|
// Possible accelerometer scales (and their register bit settings) are:
|
5hel2l2y |
0:46630122dec9
|
335
|
// 2 g (000), 4g (001), 6g (010) 8g (011), 16g (100).
|
5hel2l2y |
0:46630122dec9
|
336
|
switch (aScale)
|
5hel2l2y |
0:46630122dec9
|
337
|
{
|
5hel2l2y |
0:46630122dec9
|
338
|
case A_SCALE_2G:
|
5hel2l2y |
0:46630122dec9
|
339
|
aRes = 2.0 / 32768.0;
|
5hel2l2y |
0:46630122dec9
|
340
|
break;
|
5hel2l2y |
0:46630122dec9
|
341
|
case A_SCALE_4G:
|
5hel2l2y |
0:46630122dec9
|
342
|
aRes = 4.0 / 32768.0;
|
5hel2l2y |
0:46630122dec9
|
343
|
break;
|
5hel2l2y |
0:46630122dec9
|
344
|
case A_SCALE_8G:
|
5hel2l2y |
0:46630122dec9
|
345
|
aRes = 8.0 / 32768.0;
|
5hel2l2y |
0:46630122dec9
|
346
|
break;
|
5hel2l2y |
0:46630122dec9
|
347
|
case A_SCALE_16G:
|
5hel2l2y |
0:46630122dec9
|
348
|
aRes = 16.0 / 32768.0;
|
5hel2l2y |
0:46630122dec9
|
349
|
break;
|
5hel2l2y |
0:46630122dec9
|
350
|
}
|
5hel2l2y |
0:46630122dec9
|
351
|
} |