/* * 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__