ICM20600.h 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. /*
  2. * ICM20600.h
  3. * A library for Grove - IMU 9DOF(ICM20600 + AK09918)
  4. *
  5. * Copyright (c) 2018 seeed technology inc.
  6. * Website : www.seeed.cc
  7. * Author : Jerry Yip
  8. * Create Time: 2018-06
  9. * Version : 0.1
  10. * Change Log :
  11. *
  12. * The MIT License (MIT)
  13. *
  14. * Permission is hereby granted, free of charge, to any person obtaining a copy
  15. * of this software and associated documentation files (the "Software"), to deal
  16. * in the Software without restriction, including without limitation the rights
  17. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  18. * copies of the Software, and to permit persons to whom the Software is
  19. * furnished to do so, subject to the following conditions:
  20. *
  21. * The above copyright notice and this permission notice shall be included in
  22. * all copies or substantial portions of the Software.
  23. *
  24. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  25. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  26. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  27. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  28. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  29. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  30. * THE SOFTWARE.
  31. */
  32. #ifndef __IMU_9DOF_ICM20600_H__
  33. #define __IMU_9DOF_ICM20600_H__
  34. #include "stm32f1xx_hal.h"
  35. /***************************************************************
  36. ICM20600 I2C Register
  37. ***************************************************************/
  38. #define ICM20600_XG_OFFS_TC_H 0x04
  39. #define ICM20600_XG_OFFS_TC_L 0x05
  40. #define ICM20600_YG_OFFS_TC_H 0x07
  41. #define ICM20600_YG_OFFS_TC_L 0x08
  42. #define ICM20600_ZG_OFFS_TC_H 0x0a
  43. #define ICM20600_ZG_OFFS_TC_L 0x0b
  44. #define ICM20600_SELF_TEST_X_ACCEL 0x0d
  45. #define ICM20600_SELF_TEST_Y_ACCEL 0x0e
  46. #define ICM20600_SELF_TEST_Z_ACCEL 0x0f
  47. #define ICM20600_XG_OFFS_USRH 0x13
  48. #define ICM20600_XG_OFFS_USRL 0x14
  49. #define ICM20600_YG_OFFS_USRH 0x15
  50. #define ICM20600_YG_OFFS_USRL 0x16
  51. #define ICM20600_ZG_OFFS_USRH 0x17
  52. #define ICM20600_ZG_OFFS_USRL 0x18
  53. #define ICM20600_SMPLRT_DIV 0x19
  54. #define ICM20600_CONFIG 0x1a
  55. #define ICM20600_GYRO_CONFIG 0x1b
  56. #define ICM20600_ACCEL_CONFIG 0x1c
  57. #define ICM20600_ACCEL_CONFIG2 0x1d
  58. #define ICM20600_GYRO_LP_MODE_CFG 0x1e
  59. #define ICM20600_ACCEL_WOM_X_THR 0x20
  60. #define ICM20600_ACCEL_WOM_Y_THR 0x21
  61. #define ICM20600_ACCEL_WOM_Z_THR 0x22
  62. #define ICM20600_FIFO_EN 0x23
  63. #define ICM20600_FSYNC_INT 0x36
  64. #define ICM20600_INT_PIN_CFG 0x37
  65. #define ICM20600_INT_ENABLE 0x38
  66. #define ICM20600_FIFO_WM_INT_STATUS 0x39
  67. #define ICM20600_INT_STATUS 0x3a
  68. #define ICM20600_ACCEL_XOUT_H 0x3b
  69. #define ICM20600_ACCEL_XOUT_L 0x3c
  70. #define ICM20600_ACCEL_YOUT_H 0x3d
  71. #define ICM20600_ACCEL_YOUT_L 0x3e
  72. #define ICM20600_ACCEL_ZOUT_H 0x3f
  73. #define ICM20600_ACCEL_ZOUT_L 0x40
  74. #define ICM20600_TEMP_OUT_H 0x41
  75. #define ICM20600_TEMP_OUT_L 0x42
  76. #define ICM20600_GYRO_XOUT_H 0x43
  77. #define ICM20600_GYRO_XOUT_L 0x44
  78. #define ICM20600_GYRO_YOUT_H 0x45
  79. #define ICM20600_GYRO_YOUT_L 0x46
  80. #define ICM20600_GYRO_ZOUT_H 0x47
  81. #define ICM20600_GYRO_ZOUT_L 0x48
  82. #define ICM20600_SELF_TEST_X_GYRO 0x50
  83. #define ICM20600_SELF_TEST_Y_GYRO 0x51
  84. #define ICM20600_SELF_TEST_Z_GYRO 0x52
  85. #define ICM20600_FIFO_WM_TH1 0x60
  86. #define ICM20600_FIFO_WM_TH2 0x61
  87. #define ICM20600_SIGNAL_PATH_RESET 0x68
  88. #define ICM20600_ACCEL_INTEL_CTRL 0x69
  89. #define ICM20600_USER_CTRL 0x6A
  90. #define ICM20600_PWR_MGMT_1 0x6b
  91. #define ICM20600_PWR_MGMT_2 0x6c
  92. #define ICM20600_I2C_IF 0x70
  93. #define ICM20600_FIFO_COUNTH 0x72
  94. #define ICM20600_FIFO_COUNTL 0x73
  95. #define ICM20600_FIFO_R_W 0x74
  96. #define ICM20600_WHO_AM_I 0x75
  97. #define ICM20600_XA_OFFSET_H 0x77
  98. #define ICM20600_XA_OFFSET_L 0x78
  99. #define ICM20600_YA_OFFSET_H 0x7a
  100. #define ICM20600_YA_OFFSET_L 0x7b
  101. #define ICM20600_ZA_OFFSET_H 0x7d
  102. #define ICM20600_ZA_OFFSET_L 0x7e
  103. #define ICM20600_I2C_ADDR1 0x68
  104. #define ICM20600_I2C_ADDR2 0x69
  105. #define ICM20600_FIFO_EN_BIT (1 << 6)
  106. #define ICM20600_FIFO_RST_BIT (1 << 2)
  107. #define ICM20600_RESET_BIT (1 << 0)
  108. #define ICM20600_DEVICE_RESET_BIT (1 << 7)
  109. // Gyroscope scale range
  110. typedef enum
  111. {
  112. RANGE_250_DPS = 0,
  113. RANGE_500_DPS,
  114. RANGE_1K_DPS,
  115. RANGE_2K_DPS,
  116. } gyro_scale_type_t;
  117. // Accelerometer scale range
  118. typedef enum
  119. {
  120. RANGE_2G = 0,
  121. RANGE_4G,
  122. RANGE_8G,
  123. RANGE_16G,
  124. } acc_scale_type_t;
  125. // Gyroscope output data rate
  126. typedef enum
  127. {
  128. GYRO_RATE_8K_BW_3281 = 0,
  129. GYRO_RATE_8K_BW_250,
  130. GYRO_RATE_1K_BW_176,
  131. GYRO_RATE_1K_BW_92,
  132. GYRO_RATE_1K_BW_41,
  133. GYRO_RATE_1K_BW_20,
  134. GYRO_RATE_1K_BW_10,
  135. GYRO_RATE_1K_BW_5,
  136. } gyro_lownoise_odr_type_t;
  137. // Accelerometer output data rate
  138. typedef enum
  139. {
  140. ACC_RATE_4K_BW_1046 = 0,
  141. ACC_RATE_1K_BW_420,
  142. ACC_RATE_1K_BW_218,
  143. ACC_RATE_1K_BW_99,
  144. ACC_RATE_1K_BW_44,
  145. ACC_RATE_1K_BW_21,
  146. ACC_RATE_1K_BW_10,
  147. ACC_RATE_1K_BW_5,
  148. } acc_lownoise_odr_type_t;
  149. // Averaging filter settings for Low Power Accelerometer mode
  150. typedef enum
  151. {
  152. ACC_AVERAGE_4 = 0,
  153. ACC_AVERAGE_8,
  154. ACC_AVERAGE_16,
  155. ACC_AVERAGE_32,
  156. } acc_averaging_sample_type_t;
  157. // Averaging filter configuration for low-power gyroscope mode
  158. typedef enum
  159. {
  160. GYRO_AVERAGE_1 = 0,
  161. GYRO_AVERAGE_2,
  162. GYRO_AVERAGE_4,
  163. GYRO_AVERAGE_8,
  164. GYRO_AVERAGE_16,
  165. GYRO_AVERAGE_32,
  166. GYRO_AVERAGE_64,
  167. GYRO_AVERAGE_128,
  168. } gyro_averaging_sample_type_t;
  169. // ICM20600 power mode
  170. typedef enum
  171. {
  172. ICM_SLEEP_MODE = 0,
  173. ICM_STANDYBY_MODE,
  174. ICM_ACC_LOW_POWER,
  175. ICM_ACC_LOW_NOISE,
  176. ICM_GYRO_LOW_POWER,
  177. ICM_GYRO_LOW_NOISE,
  178. ICM_6AXIS_LOW_POWER,
  179. ICM_6AXIS_LOW_NOISE,
  180. } icm20600_power_type_t;
  181. typedef struct
  182. {
  183. int16_t data_raw;
  184. int16_t offset;
  185. int16_t data_offset;
  186. float coefficient;
  187. float data;
  188. } Single_AXIS_Data_typedef;
  189. typedef struct
  190. {
  191. FunctionalState UpdateEn;
  192. float PitchAngle;
  193. float RollAngle;
  194. int16_t Roll;
  195. int16_t Pitch;
  196. int16_t Pitch_offset;
  197. uint8_t DataBuffer[14];
  198. uint8_t count;
  199. Single_AXIS_Data_typedef Temp;
  200. Single_AXIS_Data_typedef GyroX;
  201. Single_AXIS_Data_typedef GyroY;
  202. Single_AXIS_Data_typedef GyroZ;
  203. Single_AXIS_Data_typedef AcceX;
  204. Single_AXIS_Data_typedef AcceY;
  205. Single_AXIS_Data_typedef AcceZ;
  206. } ICM20600_Data_typedef;
  207. typedef struct
  208. {
  209. TrueOrFalse_Flag_Struct_t UpWardSlope_flag; //ÅÀÆÂ±ê־λ
  210. TrueOrFalse_Flag_Struct_t FellDown_flag; //µ¹Ï±ê־λ
  211. uint16_t UpWardSlope_True_Timecount;
  212. uint16_t UpWardSlope_False_Timecount;
  213. uint16_t FellDown_True_Timecount;
  214. uint16_t FellDown_False_Timecount;
  215. }Bike_Attitude_typedef;
  216. extern ICM20600_Data_typedef ICM20600Sensor;
  217. extern Bike_Attitude_typedef Bike_Attitude;
  218. extern TrueOrFalse_Flag_Struct_t ICM20600_OK_Flag;
  219. extern float twoKp, twoKi, invSampleFreq;
  220. extern float q0, q1, q2, q3;
  221. extern float integralFBx, integralFBy, integralFBz;
  222. extern uint8_t ICM20600_getDeviceID(void);
  223. extern void ICM20600_reset(void);
  224. extern void ICM20600_initialize(void);
  225. extern void ICM20600_coefficientinitialize( gyro_scale_type_t gyro_scale, acc_scale_type_t acc_scale, ICM20600_Data_typedef *ICM20600Sensor_temp );
  226. extern void ICM20600_setPowerMode(icm20600_power_type_t mode);
  227. extern void ICM20600_setGyroScaleRange(gyro_scale_type_t range);
  228. extern void ICM20600_setGyroAverageSample(gyro_averaging_sample_type_t sample);
  229. extern void ICM20600_setGyroOutputDataRate(gyro_lownoise_odr_type_t odr);
  230. extern void ICM20600_setAccScaleRange(acc_scale_type_t range);
  231. extern void ICM20600_setAccAverageSample(acc_averaging_sample_type_t sample);
  232. extern void ICM20600_setAccOutputDataRate(acc_lownoise_odr_type_t odr);
  233. extern void ICM20600_getSensordata( ICM20600_Data_typedef *ICM20600Sensor_temp );
  234. extern void ICM20600_computePitchAndRollAngle( ICM20600_Data_typedef *ICM20600Sensor_temp );
  235. extern void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az);
  236. extern float invSqrt(float x);
  237. extern void ComputeAngles(void);
  238. extern void BikeAttitude_Process(void);
  239. #endif // __IMU_9DOF_ICM20600_H__