123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- /*
- * 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 "stm32f1xx_hal.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
- typedef enum
- {
- RANGE_250_DPS = 0,
- RANGE_500_DPS,
- RANGE_1K_DPS,
- RANGE_2K_DPS,
- } gyro_scale_type_t;
- // Accelerometer scale range
- typedef enum
- {
- RANGE_2G = 0,
- RANGE_4G,
- RANGE_8G,
- RANGE_16G,
- } acc_scale_type_t;
- // Gyroscope output data rate
- typedef enum
- {
- 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,
- } gyro_lownoise_odr_type_t;
- // Accelerometer output data rate
- typedef enum
- {
- 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,
- } acc_lownoise_odr_type_t;
- // Averaging filter settings for Low Power Accelerometer mode
- typedef enum
- {
- ACC_AVERAGE_4 = 0,
- ACC_AVERAGE_8,
- ACC_AVERAGE_16,
- ACC_AVERAGE_32,
- } acc_averaging_sample_type_t;
- // Averaging filter configuration for low-power gyroscope mode
- typedef enum
- {
- 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,
- } gyro_averaging_sample_type_t;
- // ICM20600 power mode
- typedef enum
- {
- 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,
- } icm20600_power_type_t;
- typedef struct
- {
- int16_t data_raw;
- int16_t offset;
- int16_t data_offset;
- float coefficient;
- float data;
- } Single_AXIS_Data_typedef;
- typedef struct
- {
- FunctionalState UpdateEn;
- float PitchAngle;
- float RollAngle;
- int16_t Roll;
- int16_t Pitch;
- int16_t Pitch_offset;
- uint8_t DataBuffer[14];
- uint8_t count;
- Single_AXIS_Data_typedef Temp;
- Single_AXIS_Data_typedef GyroX;
- Single_AXIS_Data_typedef GyroY;
- Single_AXIS_Data_typedef GyroZ;
- Single_AXIS_Data_typedef AcceX;
- Single_AXIS_Data_typedef AcceY;
- Single_AXIS_Data_typedef AcceZ;
- } ICM20600_Data_typedef;
- typedef struct
- {
- TrueOrFalse_Flag_Struct_t UpWardSlope_flag; //ÅÀÆÂ±ê־λ
- TrueOrFalse_Flag_Struct_t FellDown_flag; //µ¹Ï±ê־λ
- uint16_t UpWardSlope_True_Timecount;
- uint16_t UpWardSlope_False_Timecount;
- uint16_t FellDown_True_Timecount;
- uint16_t FellDown_False_Timecount;
- }Bike_Attitude_typedef;
- extern ICM20600_Data_typedef ICM20600Sensor;
- extern Bike_Attitude_typedef Bike_Attitude;
- extern TrueOrFalse_Flag_Struct_t ICM20600_OK_Flag;
- extern float twoKp, twoKi, invSampleFreq;
- extern float q0, q1, q2, q3;
- extern float integralFBx, integralFBy, integralFBz;
- extern uint8_t ICM20600_getDeviceID(void);
- extern void ICM20600_reset(void);
- extern void ICM20600_initialize(void);
- extern void ICM20600_coefficientinitialize( gyro_scale_type_t gyro_scale, acc_scale_type_t acc_scale, ICM20600_Data_typedef *ICM20600Sensor_temp );
- extern void ICM20600_setPowerMode(icm20600_power_type_t mode);
- extern void ICM20600_setGyroScaleRange(gyro_scale_type_t range);
- extern void ICM20600_setGyroAverageSample(gyro_averaging_sample_type_t sample);
- extern void ICM20600_setGyroOutputDataRate(gyro_lownoise_odr_type_t odr);
- extern void ICM20600_setAccScaleRange(acc_scale_type_t range);
- extern void ICM20600_setAccAverageSample(acc_averaging_sample_type_t sample);
- extern void ICM20600_setAccOutputDataRate(acc_lownoise_odr_type_t odr);
- extern void ICM20600_getSensordata( ICM20600_Data_typedef *ICM20600Sensor_temp );
- extern void ICM20600_computePitchAndRollAngle( ICM20600_Data_typedef *ICM20600Sensor_temp );
- extern void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az);
- extern float invSqrt(float x);
- extern void ComputeAngles(void);
- extern void BikeAttitude_Process(void);
- #endif // __IMU_9DOF_ICM20600_H__
|