#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__