123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394 |
- #ifndef MPU6050_H__
- #define MPU6050_H__
- #include "user_twim.h"
- #include "mygyro.h"
- #define MPU6050_INTERVALS 10
- #define MPU6050_SAMPLE_RATE 1000/MPU6050_INTERVALS
- #define MPU6050_GET_SIZE MPU6050_SAMPLE_RATE*2
- #define MPU6050_OFFSET_SIZE 10
- //设置MPU6050的数字低通滤波器
- #if (MPU6050_SAMPLE_RATE/2)>=260
- #define MPU6050_SAMPLE_LPF 0
- #define MPU6050_SMPLRT_DIV 8000/MPU6050_SAMPLE_RATE-1
- #elif (MPU6050_SAMPLE_RATE/2)>=188
- #define MPU6050_SAMPLE_LPF 1
- #define MPU6050_SMPLRT_DIV MPU6050_INTERVALS-1
- #elif (MPU6050_SAMPLE_RATE/2)>=98
- #define MPU6050_SAMPLE_LPF 2
- #define MPU6050_SMPLRT_DIV MPU6050_INTERVALS-1
- #elif (MPU6050_SAMPLE_RATE/2)>=44
- #define MPU6050_SAMPLE_LPF 3
- #define MPU6050_SMPLRT_DIV MPU6050_INTERVALS-1
- #elif (MPU6050_SAMPLE_RATE/2)>=21
- #define MPU6050_SAMPLE_LPF 4
- #define MPU6050_SMPLRT_DIV MPU6050_INTERVALS-1
- #elif (MPU6050_SAMPLE_RATE/2)>=10
- #define MPU6050_SAMPLE_LPF 5
- #define MPU6050_SMPLRT_DIV MPU6050_INTERVALS-1
- #elif (MPU6050_SAMPLE_RATE/2)>=5
- #define MPU6050_SAMPLE_LPF 6
- #define MPU6050_SMPLRT_DIV MPU6050_INTERVALS-1
- #else
- #define MPU6050_SAMPLE_LPF 7
- #define MPU6050_SMPLRT_DIV 8000/MPU6050_SAMPLE_RATE-1
- #endif
- /*****************************************************
- 设置陀螺仪
- XG_ST(bit7):该位置位X轴进行自检。
- YG_ST(bit6):该位置位Y轴进行自检。
- ZG_ST(bit5):该位置位Z轴进行自检。
- FS_SEL(bit4-bit3):0=±250°/s
- 1=±500°/s
- 2=±1000°/s
- 3=±2000°/s
- *****************************************************/
- #define MPU6050_GYRO_RANGE 0
- #if MPU6050_GYRO_RANGE==0
- #define MPU6050_GYRO_RESOLUTION 131.0
- #elif MPU6050_GYRO_RANGE==1
- #define MPU6050_GYRO_RESOLUTION 65.5
- #elif MPU6050_GYRO_RANGE==2
- #define MPU6050_GYRO_RESOLUTION 32.8
- #else MPU6050_GYRO_RANGE==3
- #define MPU6050_GYRO_RESOLUTION 16.4
- #endif
- /*****************************************************
- 设置加速度
- XA_ST(bit7):该位置1,加速度计的X轴执行自检。
- YA_ST(bit6):该位置1,加速度计的Y轴执行自检。
- ZA_ST(bit5):该位置1,加速度计的Z轴执行自检。
- FS_SEL(bit4-bit3):0=±2g/s
- 1=±4g
- 2=8g/s
- 3=±16g
- *****************************************************/
- #define MPU6050_ACC_RANGE 0
- #if MPU6050_ACC_RANGE==0
- #define MPU6050_ACC_RESOLUTION 16384.0
- #elif MPU6050_ACC_RANGE==1
- #define MPU6050_ACC_RESOLUTION 8192.0
- #elif MPU6050_ACC_RANGE==2
- #define MPU6050_ACC_RESOLUTION 4096.0
- #else MPU6050_ACC_RANGE==3
- #define MPU6050_ACC_RESOLUTION 2048.0
- #endif
- /*****************************************************
- 唤醒频率(bit7-bit6):0=1.25Hz,1=5Hz,2=20Hz,3=40Hz
- 以下置1:进入待机模式,置0:进入工作模式
- 加速度X轴(bit5)
- 加速度Y轴(bit4)
- 加速度Z轴(bit3)
- 陀螺仪X轴(bit2)
- 陀螺仪Y轴(bit1)
- 陀螺仪Z轴(bit0)
- *****************************************************/
- #define MPU6050_PWR_MGMT_2_WORK 0x00
- #define MPU6050_PWR_MGMT_2_SLEEP 0x07
- /*****************************************************
- 设备复位(bit7):置1-复位,复位后自动清0
- 睡眠模式(bit6):置1-进入睡眠模式
- 循环模式(bit5):置1-进入循环模式
- 温度传感器(bit3):置1-失能温度传感器
- 系统时钟源(bit2-bit0):0=内部8MHz,1=X轴,2=Y轴,3=Z轴,
- 4=外部32.768KHz,5=外部19.2MHz
- *****************************************************/
- #define MPU6050_PWR_MGMT_1_WORK 0x00
- #define MPU6050_PWR_MGMT_1_CYCLE 0x68
- #define MPU6050_PWR_MGMT_1_RESET 0x80
- #define MPU6050_PWR_MGMT_1_SLEEP 0x78
- /*****************************************************
- bit6 MOT_EN--该位置1,该位使能运动检测
- (Motion detection)产生中断。
- bit4 FIFO_OFLOW_EN--该位置1,该位使能 FIFO缓冲区溢出产
- 生中断。
- bit3 I2C_MST_INT_EN--该位置 1,该位使能 I2C主机所有中
- 断源产生中断。
- bit0 DATA_RDY_EN--该位置 1,该位使能数据就绪中断
- (Data Ready interrupt),所有的传感器寄存器写操
- 作完成时都会产生。
- *****************************************************/
- #define MPU6050_INT_EN 0x41
- #define MPU6050_INT_MOT_EN 0x40
- #define MPU6050_FIFO_OFLOW_EN 0x10
- #define MPU6050_I2C_MST_INT_EN 0x08
- #define MPU6050_DATA_RDY_EN 0x01
- /*****************************************************
- bit7 配置INT引脚逻辑电平,当设置为0时,INT引脚静息为
- 低电平,触发中断时产生高电平信号
- bit6 配置引脚驱动, 0:推挽模式;
- 1:开漏模式
- bit5 配置中断输出方式,0:50us电平脉冲;
- 1:持续信号直到中断结束
- bit4 配置中断锁存清除方式,0:只读(不允许手动清零);
- 1:可读写
- bit3 配置FSYNC中断逻辑电平, 0:高电平;
- 1:低电平
- bit2 FSYNC端口中断使能, 0:禁用;
- 1:启用
- bit1 I2C辅助总线状态标志位,当此位为1时,主机可以直接
- 访问I2C支路从机
- bit0 CLKOUT端口输出使能,0:禁用;
- 1:输出参考时钟
- *****************************************************/
- #define MPU6050_INTBP_CFG 0x10
- /*****************************************************
- bit0-7 该寄存器存储自由落体中断的加速度检测阈值,单位
- 为1LSB = 2mg。加速度计的任意一个轴的数据超过该
- 阈值时就会触发自由落体中断计时,若超过阈值的加
- 速度持续时间超过自由落体中断计时时间,就会产生
- 自由落体中断
- *****************************************************/
- #define MPU_FF_THR 0x14
- /*****************************************************
- bit0-7 该寄存器存储自由落体中断的时间阈值,单位为ms
- *****************************************************/
- #define MPU_FF_DUR 0x0A
- /*****************************************************
- bit0-7 该寄存器存储加速度中断的加速度检测阈值,单位为
- 1LSB = 2mg。加速度计的任意一个轴的数据超过该阈
- 值时就会触发加速度中断计时,若超过阈值的加速度
- 持续时间超过加速度中断计时时间,就会产生加速度
- 中断
- *****************************************************/
- #define MPU_MOT_THR 0x25
- /*****************************************************
- bit0-7 该寄存器存储加速度中断的时间阈值,单位为ms
- *****************************************************/
- #define MPU_MOT_DUR 0x14
- /*****************************************************
- bit0-7 该寄存器存储静止中断的加速度检测阈值,单位为
- 1LSB = 2mg。加速度计的三个轴的数据均小于该阈值
- 时就会触发静止中断计时,若静止中断计时结束后加
- 速度计值均未超过阈值,就会产生静止中断
- *****************************************************/
- #define MPU_ZRMOT_THR 0x20
- /*****************************************************
- bit0-7 该寄存器存储静止中断的时间阈值,单位为ms
- *****************************************************/
- #define MPU_ZRMOT_DUR 0x20
- typedef void (*set_acc_gyro_act_func)(bool stat);
- typedef enum{
- MPU6050_TYPE_WRITE,
- MPU6050_TYPE_WR_ACT,
- MPU6050_TYPE_READ,
- MPU6050_TYPE_VALUE
- }MPU6050_WORK_TYPE;
- typedef enum{
- MPU6050_NULL,
- MPU6050_GET_ID,
- MPU6050_SET_GYRO,
- MPU6050_SET_ACC,
- MPU6050_SET_SMPLRT,
- MPU6050_SET_LPF,
- MPU6050_SET_FIFO,
- MPU6050_SET_INT_EN,
- MPU6050_SET_INTBP_CFG,
- MPU6050_SET_INT_STATUS,
- MPU6050_SET_I2CMST,
- MPU6050_SET_PWR_MGMT_1_WORK,
- MPU6050_SET_PWR_MGMT_1_CYCLE,
- MPU6050_SET_PWR_MGMT_1_RESET,
- MPU6050_SET_PWR_MGMT_1_SLEEP,
- MPU6050_SET_PWR_MGMT_2_WORK,
- MPU6050_SET_PWR_MGMT_2_SLEEP,
- MPU6050_SET_FF_THR,
- MPU6050_SET_FF_DUR,
- MPU6050_SET_MOT_THR,
- MPU6050_SET_MOT_DUR,
- MPU6050_SET_ZRMOT_THR,
- MPU6050_SET_ZRMOT_DUR,
- MPU6050_GET_MOT_DET_STA,
- MPU6050_GET_GYRO,
- MPU6050_GET_ACC,
- }MPU6050_WORK_STAT;
- typedef struct{
- set_acc_gyro_act_func acc_gyro_func;
- MPU6050_WORK_STAT work_stat;
- MPU6050_WORK_TYPE work_type;
- uint8_t id;
- uint8_t mot_det_sta;
- uint8_t mpu6050_timeout;
- uint8_t mpu6050_error;
- bool calculation_stat;
- bool xfer_done;
- uint8_t acc_buff[6];
- uint8_t gyro_buff[6];
- uint16_t idx;
- uint8_t block;
- int16_t AccX[MPU6050_GET_SIZE];
- int16_t AccY[MPU6050_GET_SIZE];
- int16_t AccZ[MPU6050_GET_SIZE];
- int16_t GyroX[MPU6050_GET_SIZE];
- int16_t GyroY[MPU6050_GET_SIZE];
- int16_t GyroZ[MPU6050_GET_SIZE];
- uint8_t offset_idx;
- int16_t accx_offset_value[MPU6050_OFFSET_SIZE];
- int16_t accy_offset_value[MPU6050_OFFSET_SIZE];
- int16_t accz_offset_value[MPU6050_OFFSET_SIZE];
- // int16_t gyrox_offset_value[MPU6050_OFFSET_SIZE];
- // int16_t gyroy_offset_value[MPU6050_OFFSET_SIZE];
- // int16_t gyroz_offset_value[MPU6050_OFFSET_SIZE];
-
- int16_t accx_offset;
- int16_t accy_offset;
- int16_t accz_offset;
- int16_t gyrox_max_offset;
- int16_t gyrox_min_offset;
- int16_t gyroy_max_offset;
- int16_t gyroy_min_offset;
- int16_t gyroz_max_offset;
- int16_t gyroz_min_offset;
-
- float accx_nu_offset;
- float accy_nu_offset;
- float accz_nu_offset;
-
- float last_acc_nu_x;
- float last_acc_nu_y;
- float last_acc_nu_z;
- // float accx_offset;
- // float accy_offset;
- // float accz_offset;
- // float gyrox_offset;
- // float gyroy_offset;
- // float gyroz_offset;
- }mpu6050_work_s;
- typedef struct{
- bool stat;
- bool mpu6050_alarm;
- uint8_t move_stat;
- uint16_t gyro_value;
- uint32_t displacement_value;
- }mpu6050_data_s;
- #define MPU6050_ADDRESS_LEN 1 //MPU6050地址长度
- #define MPU6050_ADDRESS (0xD0>>1) //MPU6050地址
- #define MPU6050_WHO_AM_I 0x68U //MPU6050 ID
- #define MPU6050_GYRO_OUT 0x43
- #define MPU6050_ACC_OUT 0x3B
- #define ADDRESS_WHO_AM_I (0x75U) // !< WHO_AM_I register identifies the device. Expected value is 0x68.
- #define ADDRESS_SIGNAL_PATH_RESET (0x68U) // !<
- //MPU6050寄存器
- #define MPU_SELF_TESTX_REG 0x0D //自检寄存器X
- #define MPU_SELF_TESTY_REG 0x0E //自检寄存器Y
- #define MPU_SELF_TESTZ_REG 0x0F //自检寄存器Z
- #define MPU_SELF_TESTA_REG 0x10 //自检寄存器A
- #define MPU_SAMPLE_RATE_REG 0x19 //采样频率分频器
- #define MPU_CFG_REG 0x1A //配置寄存器
- #define MPU_GYRO_CFG_REG 0x1B //陀螺仪配置寄存器
- #define MPU_ACCEL_CFG_REG 0x1C //加速度计配置寄存器
- #define MPU_FF_THR_REG 0x1D //自由落体中断阈值寄存器
- #define MPU_FF_DUR_REG 0x1E //自由落体中断时间寄存器
- #define MPU_MOT_THR_REG 0x1F //加速度中断阈值寄存器
- #define MPU_MOT_DUR_REG 0x20 //加速度中断时间寄存器
- #define MPU_ZRMOT_THR_REG 0x21 //静止中断阈值寄存器
- #define MPU_ZRMOT_DUR_REG 0x22 //静止中断时间寄存器
- #define MPU_FIFO_EN_REG 0x23 //FIFO使能寄存器
- #define MPU_I2CMST_CTRL_REG 0x24 //IIC主机控制寄存器
- //#define MPU_I2CSLV0_ADDR_REG 0x25 //IIC从机0器件地址寄存器
- //#define MPU_I2CSLV0_REG 0x26 //IIC从机0数据地址寄存器
- //#define MPU_I2CSLV0_CTRL_REG 0x27 //IIC从机0控制寄存器
- //#define MPU_I2CSLV1_ADDR_REG 0x28 //IIC从机1器件地址寄存器
- //#define MPU_I2CSLV1_REG 0x29 //IIC从机1数据地址寄存器
- //#define MPU_I2CSLV1_CTRL_REG 0x2A //IIC从机1控制寄存器
- //#define MPU_I2CSLV2_ADDR_REG 0x2B //IIC从机2器件地址寄存器
- //#define MPU_I2CSLV2_REG 0x2C //IIC从机2数据地址寄存器
- //#define MPU_I2CSLV2_CTRL_REG 0x2D //IIC从机2控制寄存器
- //#define MPU_I2CSLV3_ADDR_REG 0x2E //IIC从机3器件地址寄存器
- //#define MPU_I2CSLV3_REG 0x2F //IIC从机3数据地址寄存器
- //#define MPU_I2CSLV3_CTRL_REG 0x30 //IIC从机3控制寄存器
- //#define MPU_I2CSLV4_ADDR_REG 0x31 //IIC从机4器件地址寄存器
- //#define MPU_I2CSLV4_REG 0x32 //IIC从机4数据地址寄存器
- //#define MPU_I2CSLV4_DO_REG 0x33 //IIC从机4写数据寄存器
- //#define MPU_I2CSLV4_CTRL_REG 0x34 //IIC从机4控制寄存器
- //#define MPU_I2CSLV4_DI_REG 0x35 //IIC从机4读数据寄存器
- //#define MPU_I2CMST_STA_REG 0x36 //IIC主机状态寄存器
- #define MPU_INTBP_CFG_REG 0x37 //中断/旁路设置寄存器
- #define MPU_INT_EN_REG 0x38 //中断使能寄存器
- #define MPU_INT_STA_REG 0x3A //中断状态寄存器
- #define MPU_MOT_DET_STA_REG 0x61 //运动状态寄存器
- #define MPU_I2CMST_DELAY_REG 0x67 //IIC主机延时管理寄存器
- #define MPU_SIGPATH_RST_REG 0x68 //信号通道复位寄存器
- #define MPU_MDETECT_CTRL_REG 0x69 //运动检测控制寄存器
- #define MPU_USER_CTRL_REG 0x6A //用户控制寄存器
- #define MPU_PWR_MGMT1_REG 0x6B //电源管理寄存器1
- #define MPU_PWR_MGMT2_REG 0x6C //电源管理寄存器2
- #define MPU_FIFO_CNTH_REG 0x72 //FIFO计数寄存器高八位
- #define MPU_FIFO_CNTL_REG 0x73 //FIFO计数寄存器低八位
- #define MPU_FIFO_RW_REG 0x74 //FIFO读写寄存器
- #define MPU_DEVICE_ID_REG 0x75 //器件ID寄存器
- void twi_master_init(void);
- bool mpu6050_init(void);
- /**
- @brief Function for writing a MPU6050 register contents over TWI.
- @param[in] register_address Register address to start writing to
- @param[in] value Value to write to register
- @retval true Register write succeeded
- @retval false Register write failed
- */
- static void mpu6050_register_write(uint8_t register_address, uint8_t value);
- /**
- @brief Function for reading MPU6050 register contents over TWI.
- Reads one or more consecutive registers.
- @param[in] register_address Register address to start reading from
- @param[in] number_of_bytes Number of bytes to read
- @param[out] destination Pointer to a data buffer where read data will be stored
- @retval true Register read succeeded
- @retval false Register read failed
- */
- static void mpu6050_read_write(uint8_t register_address);
- /**
- @brief Function for reading MPU6050 register contents over TWI.
- Reads one or more consecutive registers.
- @param[in] register_address Register address to start reading from
- @param[in] number_of_bytes Number of bytes to read
- @param[out] destination Pointer to a data buffer where read data will be stored
- @retval true Register read succeeded
- @retval false Register read failed
- */
- static void mpu6050_register_read(uint8_t * destination, uint8_t number_of_bytes);
- void mpu6050_set_func(set_acc_gyro_act_func func);
- void mpu6050_timers_init(void);
- void Mpu6050_Start(void);
- void mpu6050_offset_start(void);
- void Set_Mpu6050_Value(void);
- extern mpu6050_data_s mpu6050_data;
- extern mpu6050_work_s mpu6050_work;
- #endif //MPU6050_H__
|