forked from Seeed-Studio/Seeed_ICM20600_AK09918
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ICM20600.h
243 lines (211 loc) · 7.97 KB
/
ICM20600.h
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
/*
ICM20600.h
A library for Grove - IMU 9DOF(ICM20600 + AK09918)
Copyright (c) 2018 seeed technology inc.
Website : www.seeed.cc
Author : Jerry Yip
Create Time: 2018-06
Version : 0.1
Change Log :
The MIT License (MIT)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#ifndef __IMU_9DOF_ICM20600_H__
#define __IMU_9DOF_ICM20600_H__
#include "I2Cdev.h"
/***************************************************************
ICM20600 I2C Register
***************************************************************/
#define ICM20600_XG_OFFS_TC_H 0x04
#define ICM20600_XG_OFFS_TC_L 0x05
#define ICM20600_YG_OFFS_TC_H 0x07
#define ICM20600_YG_OFFS_TC_L 0x08
#define ICM20600_ZG_OFFS_TC_H 0x0a
#define ICM20600_ZG_OFFS_TC_L 0x0b
#define ICM20600_SELF_TEST_X_ACCEL 0x0d
#define ICM20600_SELF_TEST_Y_ACCEL 0x0e
#define ICM20600_SELF_TEST_Z_ACCEL 0x0f
#define ICM20600_XG_OFFS_USRH 0x13
#define ICM20600_XG_OFFS_USRL 0x14
#define ICM20600_YG_OFFS_USRH 0x15
#define ICM20600_YG_OFFS_USRL 0x16
#define ICM20600_ZG_OFFS_USRH 0x17
#define ICM20600_ZG_OFFS_USRL 0x18
#define ICM20600_SMPLRT_DIV 0x19
#define ICM20600_CONFIG 0x1a
#define ICM20600_GYRO_CONFIG 0x1b
#define ICM20600_ACCEL_CONFIG 0x1c
#define ICM20600_ACCEL_CONFIG2 0x1d
#define ICM20600_GYRO_LP_MODE_CFG 0x1e
#define ICM20600_ACCEL_WOM_X_THR 0x20
#define ICM20600_ACCEL_WOM_Y_THR 0x21
#define ICM20600_ACCEL_WOM_Z_THR 0x22
#define ICM20600_FIFO_EN 0x23
#define ICM20600_FSYNC_INT 0x36
#define ICM20600_INT_PIN_CFG 0x37
#define ICM20600_INT_ENABLE 0x38
#define ICM20600_FIFO_WM_INT_STATUS 0x39
#define ICM20600_INT_STATUS 0x3a
#define ICM20600_ACCEL_XOUT_H 0x3b
#define ICM20600_ACCEL_XOUT_L 0x3c
#define ICM20600_ACCEL_YOUT_H 0x3d
#define ICM20600_ACCEL_YOUT_L 0x3e
#define ICM20600_ACCEL_ZOUT_H 0x3f
#define ICM20600_ACCEL_ZOUT_L 0x40
#define ICM20600_TEMP_OUT_H 0x41
#define ICM20600_TEMP_OUT_L 0x42
#define ICM20600_GYRO_XOUT_H 0x43
#define ICM20600_GYRO_XOUT_L 0x44
#define ICM20600_GYRO_YOUT_H 0x45
#define ICM20600_GYRO_YOUT_L 0x46
#define ICM20600_GYRO_ZOUT_H 0x47
#define ICM20600_GYRO_ZOUT_L 0x48
#define ICM20600_SELF_TEST_X_GYRO 0x50
#define ICM20600_SELF_TEST_Y_GYRO 0x51
#define ICM20600_SELF_TEST_Z_GYRO 0x52
#define ICM20600_FIFO_WM_TH1 0x60
#define ICM20600_FIFO_WM_TH2 0x61
#define ICM20600_SIGNAL_PATH_RESET 0x68
#define ICM20600_ACCEL_INTEL_CTRL 0x69
#define ICM20600_USER_CTRL 0x6A
#define ICM20600_PWR_MGMT_1 0x6b
#define ICM20600_PWR_MGMT_2 0x6c
#define ICM20600_I2C_IF 0x70
#define ICM20600_FIFO_COUNTH 0x72
#define ICM20600_FIFO_COUNTL 0x73
#define ICM20600_FIFO_R_W 0x74
#define ICM20600_WHO_AM_I 0x75
#define ICM20600_XA_OFFSET_H 0x77
#define ICM20600_XA_OFFSET_L 0x78
#define ICM20600_YA_OFFSET_H 0x7a
#define ICM20600_YA_OFFSET_L 0x7b
#define ICM20600_ZA_OFFSET_H 0x7d
#define ICM20600_ZA_OFFSET_L 0x7e
#define ICM20600_I2C_ADDR1 0x68
#define ICM20600_I2C_ADDR2 0x69
#define ICM20600_FIFO_EN_BIT (1 << 6)
#define ICM20600_FIFO_RST_BIT (1 << 2)
#define ICM20600_RESET_BIT (1 << 0)
#define ICM20600_DEVICE_RESET_BIT (1 << 7)
// Gyroscope scale range
enum gyro_scale_type_t {
RANGE_250_DPS = 0,
RANGE_500_DPS,
RANGE_1K_DPS,
RANGE_2K_DPS,
};
// Accelerometer scale range
enum acc_scale_type_t {
RANGE_2G = 0,
RANGE_4G,
RANGE_8G,
RANGE_16G,
};
// Gyroscope output data rate
enum gyro_lownoise_odr_type_t {
GYRO_RATE_8K_BW_3281 = 0,
GYRO_RATE_8K_BW_250,
GYRO_RATE_1K_BW_176,
GYRO_RATE_1K_BW_92,
GYRO_RATE_1K_BW_41,
GYRO_RATE_1K_BW_20,
GYRO_RATE_1K_BW_10,
GYRO_RATE_1K_BW_5,
};
// Accelerometer output data rate
enum acc_lownoise_odr_type_t {
ACC_RATE_4K_BW_1046 = 0,
ACC_RATE_1K_BW_420,
ACC_RATE_1K_BW_218,
ACC_RATE_1K_BW_99,
ACC_RATE_1K_BW_44,
ACC_RATE_1K_BW_21,
ACC_RATE_1K_BW_10,
ACC_RATE_1K_BW_5,
};
// Averaging filter settings for Low Power Accelerometer mode
enum acc_averaging_sample_type_t {
ACC_AVERAGE_4 = 0,
ACC_AVERAGE_8,
ACC_AVERAGE_16,
ACC_AVERAGE_32,
};
// Averaging filter configuration for low-power gyroscope mode
enum gyro_averaging_sample_type_t {
GYRO_AVERAGE_1 = 0,
GYRO_AVERAGE_2,
GYRO_AVERAGE_4,
GYRO_AVERAGE_8,
GYRO_AVERAGE_16,
GYRO_AVERAGE_32,
GYRO_AVERAGE_64,
GYRO_AVERAGE_128,
};
// ICM20600 power mode
enum icm20600_power_type_t {
ICM_SLEEP_MODE = 0,
ICM_STANDYBY_MODE,
ICM_ACC_LOW_POWER,
ICM_ACC_LOW_NOISE,
ICM_GYRO_LOW_POWER,
ICM_GYRO_LOW_NOISE,
ICM_6AXIS_LOW_POWER,
ICM_6AXIS_LOW_NOISE,
};
class ICM20600 {
public:
ICM20600(bool AD0 = true);
uint8_t getDeviceID();
void initialize();
void reset();
// Set power mode, the default mode is ICM_6AXIS_LOW_POWER(set in initialize() function)
void setPowerMode(icm20600_power_type_t mode);
// Divides the internal sample rate to generate the sample rate that controls
// sensor data output rate. Only works at mode: ICM_GYRO_LOW_POWER / ICM_ACC_LOW_POWER / ICM_ACC_LOW_NOISE
// SAMPLE_RATE = 1KHz / (1 + div)
void setSampleRateDivier(uint8_t div);
void setAccScaleRange(acc_scale_type_t range);
// Averaging filter settings for Low Power Accelerometer mode
void setAccAverageSample(acc_averaging_sample_type_t sample);
void setAccOutputDataRate(acc_lownoise_odr_type_t odr);
void setGyroScaleRange(gyro_scale_type_t range);
// Averaging filter configuration for low-power gyroscope mode
void setGyroAverageSample(gyro_averaging_sample_type_t sample);
void setGyroOutputDataRate(gyro_lownoise_odr_type_t odr);
void getAcceleration(int16_t* x, int16_t* y, int16_t* z);
int16_t getAccelerationX(void);
int16_t getAccelerationY(void);
int16_t getAccelerationZ(void);
int16_t getRawAccelerationX(void);
int16_t getRawAccelerationY(void);
int16_t getRawAccelerationZ(void);
void getGyroscope(int16_t* x, int16_t* y, int16_t* z);
int16_t getGyroscopeX(void);
int16_t getGyroscopeY(void);
int16_t getGyroscopeZ(void);
int16_t getRawGyroscopeX(void);
int16_t getRawGyroscopeY(void);
int16_t getRawGyroscopeZ(void);
// Yes there is a digital-output temperature sensor in ICM20600,
// return a integer centigrade degree
int16_t getTemperature(void);
private:
uint8_t _addr;
uint8_t _buffer[16];
uint16_t _acc_scale, _gyro_scale;
};
#endif // __IMU_9DOF_ICM20600_H__