mpu6050.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. #ifndef MPU6050_H__
  2. #define MPU6050_H__
  3. #include "user_twim.h"
  4. #include "mygyro.h"
  5. #define MPU6050_INTERVALS 10
  6. #define MPU6050_SAMPLE_RATE 1000/MPU6050_INTERVALS
  7. #define MPU6050_GET_SIZE MPU6050_SAMPLE_RATE*2
  8. #define MPU6050_OFFSET_SIZE 10
  9. //设置MPU6050的数字低通滤波器
  10. #if (MPU6050_SAMPLE_RATE/2)>=260
  11. #define MPU6050_SAMPLE_LPF 0
  12. #define MPU6050_SMPLRT_DIV 8000/MPU6050_SAMPLE_RATE-1
  13. #elif (MPU6050_SAMPLE_RATE/2)>=188
  14. #define MPU6050_SAMPLE_LPF 1
  15. #define MPU6050_SMPLRT_DIV MPU6050_INTERVALS-1
  16. #elif (MPU6050_SAMPLE_RATE/2)>=98
  17. #define MPU6050_SAMPLE_LPF 2
  18. #define MPU6050_SMPLRT_DIV MPU6050_INTERVALS-1
  19. #elif (MPU6050_SAMPLE_RATE/2)>=44
  20. #define MPU6050_SAMPLE_LPF 3
  21. #define MPU6050_SMPLRT_DIV MPU6050_INTERVALS-1
  22. #elif (MPU6050_SAMPLE_RATE/2)>=21
  23. #define MPU6050_SAMPLE_LPF 4
  24. #define MPU6050_SMPLRT_DIV MPU6050_INTERVALS-1
  25. #elif (MPU6050_SAMPLE_RATE/2)>=10
  26. #define MPU6050_SAMPLE_LPF 5
  27. #define MPU6050_SMPLRT_DIV MPU6050_INTERVALS-1
  28. #elif (MPU6050_SAMPLE_RATE/2)>=5
  29. #define MPU6050_SAMPLE_LPF 6
  30. #define MPU6050_SMPLRT_DIV MPU6050_INTERVALS-1
  31. #else
  32. #define MPU6050_SAMPLE_LPF 7
  33. #define MPU6050_SMPLRT_DIV 8000/MPU6050_SAMPLE_RATE-1
  34. #endif
  35. /*****************************************************
  36. 设置陀螺仪
  37. XG_ST(bit7):该位置位X轴进行自检。
  38. YG_ST(bit6):该位置位Y轴进行自检。
  39. ZG_ST(bit5):该位置位Z轴进行自检。
  40. FS_SEL(bit4-bit3):0=±250°/s
  41. 1=±500°/s
  42. 2=±1000°/s
  43. 3=±2000°/s
  44. *****************************************************/
  45. #define MPU6050_GYRO_RANGE 0
  46. #if MPU6050_GYRO_RANGE==0
  47. #define MPU6050_GYRO_RESOLUTION 131.0
  48. #elif MPU6050_GYRO_RANGE==1
  49. #define MPU6050_GYRO_RESOLUTION 65.5
  50. #elif MPU6050_GYRO_RANGE==2
  51. #define MPU6050_GYRO_RESOLUTION 32.8
  52. #else MPU6050_GYRO_RANGE==3
  53. #define MPU6050_GYRO_RESOLUTION 16.4
  54. #endif
  55. /*****************************************************
  56. 设置加速度
  57. XA_ST(bit7):该位置1,加速度计的X轴执行自检。
  58. YA_ST(bit6):该位置1,加速度计的Y轴执行自检。
  59. ZA_ST(bit5):该位置1,加速度计的Z轴执行自检。
  60. FS_SEL(bit4-bit3):0=±2g/s
  61. 1=±4g
  62. 2=8g/s
  63. 3=±16g
  64. *****************************************************/
  65. #define MPU6050_ACC_RANGE 0
  66. #if MPU6050_ACC_RANGE==0
  67. #define MPU6050_ACC_RESOLUTION 16384.0
  68. #elif MPU6050_ACC_RANGE==1
  69. #define MPU6050_ACC_RESOLUTION 8192.0
  70. #elif MPU6050_ACC_RANGE==2
  71. #define MPU6050_ACC_RESOLUTION 4096.0
  72. #else MPU6050_ACC_RANGE==3
  73. #define MPU6050_ACC_RESOLUTION 2048.0
  74. #endif
  75. /*****************************************************
  76. 唤醒频率(bit7-bit6):0=1.25Hz,1=5Hz,2=20Hz,3=40Hz
  77. 以下置1:进入待机模式,置0:进入工作模式
  78. 加速度X轴(bit5)
  79. 加速度Y轴(bit4)
  80. 加速度Z轴(bit3)
  81. 陀螺仪X轴(bit2)
  82. 陀螺仪Y轴(bit1)
  83. 陀螺仪Z轴(bit0)
  84. *****************************************************/
  85. #define MPU6050_PWR_MGMT_2_WORK 0x00
  86. #define MPU6050_PWR_MGMT_2_SLEEP 0x07
  87. /*****************************************************
  88. 设备复位(bit7):置1-复位,复位后自动清0
  89. 睡眠模式(bit6):置1-进入睡眠模式
  90. 循环模式(bit5):置1-进入循环模式
  91. 温度传感器(bit3):置1-失能温度传感器
  92. 系统时钟源(bit2-bit0):0=内部8MHz,1=X轴,2=Y轴,3=Z轴,
  93. 4=外部32.768KHz,5=外部19.2MHz
  94. *****************************************************/
  95. #define MPU6050_PWR_MGMT_1_WORK 0x00
  96. #define MPU6050_PWR_MGMT_1_CYCLE 0x68
  97. #define MPU6050_PWR_MGMT_1_RESET 0x80
  98. #define MPU6050_PWR_MGMT_1_SLEEP 0x78
  99. /*****************************************************
  100. bit6 MOT_EN--该位置1,该位使能运动检测
  101. (Motion detection)产生中断。
  102. bit4 FIFO_OFLOW_EN--该位置1,该位使能 FIFO缓冲区溢出产
  103. 生中断。
  104. bit3 I2C_MST_INT_EN--该位置 1,该位使能 I2C主机所有中
  105. 断源产生中断。
  106. bit0 DATA_RDY_EN--该位置 1,该位使能数据就绪中断
  107. (Data Ready interrupt),所有的传感器寄存器写操
  108. 作完成时都会产生。
  109. *****************************************************/
  110. #define MPU6050_INT_EN 0x41
  111. #define MPU6050_INT_MOT_EN 0x40
  112. #define MPU6050_FIFO_OFLOW_EN 0x10
  113. #define MPU6050_I2C_MST_INT_EN 0x08
  114. #define MPU6050_DATA_RDY_EN 0x01
  115. /*****************************************************
  116. bit7 配置INT引脚逻辑电平,当设置为0时,INT引脚静息为
  117. 低电平,触发中断时产生高电平信号
  118. bit6 配置引脚驱动, 0:推挽模式;
  119. 1:开漏模式
  120. bit5 配置中断输出方式,0:50us电平脉冲;
  121. 1:持续信号直到中断结束
  122. bit4 配置中断锁存清除方式,0:只读(不允许手动清零);
  123. 1:可读写
  124. bit3 配置FSYNC中断逻辑电平, 0:高电平;
  125. 1:低电平
  126. bit2 FSYNC端口中断使能, 0:禁用;
  127. 1:启用
  128. bit1 I2C辅助总线状态标志位,当此位为1时,主机可以直接
  129. 访问I2C支路从机
  130. bit0 CLKOUT端口输出使能,0:禁用;
  131. 1:输出参考时钟
  132. *****************************************************/
  133. #define MPU6050_INTBP_CFG 0x10
  134. /*****************************************************
  135. bit0-7 该寄存器存储自由落体中断的加速度检测阈值,单位
  136. 为1LSB = 2mg。加速度计的任意一个轴的数据超过该
  137. 阈值时就会触发自由落体中断计时,若超过阈值的加
  138. 速度持续时间超过自由落体中断计时时间,就会产生
  139. 自由落体中断
  140. *****************************************************/
  141. #define MPU_FF_THR 0x14
  142. /*****************************************************
  143. bit0-7 该寄存器存储自由落体中断的时间阈值,单位为ms
  144. *****************************************************/
  145. #define MPU_FF_DUR 0x0A
  146. /*****************************************************
  147. bit0-7 该寄存器存储加速度中断的加速度检测阈值,单位为
  148. 1LSB = 2mg。加速度计的任意一个轴的数据超过该阈
  149. 值时就会触发加速度中断计时,若超过阈值的加速度
  150. 持续时间超过加速度中断计时时间,就会产生加速度
  151. 中断
  152. *****************************************************/
  153. #define MPU_MOT_THR 0x25
  154. /*****************************************************
  155. bit0-7 该寄存器存储加速度中断的时间阈值,单位为ms
  156. *****************************************************/
  157. #define MPU_MOT_DUR 0x14
  158. /*****************************************************
  159. bit0-7 该寄存器存储静止中断的加速度检测阈值,单位为
  160. 1LSB = 2mg。加速度计的三个轴的数据均小于该阈值
  161. 时就会触发静止中断计时,若静止中断计时结束后加
  162. 速度计值均未超过阈值,就会产生静止中断
  163. *****************************************************/
  164. #define MPU_ZRMOT_THR 0x20
  165. /*****************************************************
  166. bit0-7 该寄存器存储静止中断的时间阈值,单位为ms
  167. *****************************************************/
  168. #define MPU_ZRMOT_DUR 0x20
  169. typedef void (*set_acc_gyro_act_func)(bool stat);
  170. typedef enum{
  171. MPU6050_TYPE_WRITE,
  172. MPU6050_TYPE_WR_ACT,
  173. MPU6050_TYPE_READ,
  174. MPU6050_TYPE_VALUE
  175. }MPU6050_WORK_TYPE;
  176. typedef enum{
  177. MPU6050_NULL,
  178. MPU6050_GET_ID,
  179. MPU6050_SET_GYRO,
  180. MPU6050_SET_ACC,
  181. MPU6050_SET_SMPLRT,
  182. MPU6050_SET_LPF,
  183. MPU6050_SET_FIFO,
  184. MPU6050_SET_INT_EN,
  185. MPU6050_SET_INTBP_CFG,
  186. MPU6050_SET_INT_STATUS,
  187. MPU6050_SET_I2CMST,
  188. MPU6050_SET_PWR_MGMT_1_WORK,
  189. MPU6050_SET_PWR_MGMT_1_CYCLE,
  190. MPU6050_SET_PWR_MGMT_1_RESET,
  191. MPU6050_SET_PWR_MGMT_1_SLEEP,
  192. MPU6050_SET_PWR_MGMT_2_WORK,
  193. MPU6050_SET_PWR_MGMT_2_SLEEP,
  194. MPU6050_SET_FF_THR,
  195. MPU6050_SET_FF_DUR,
  196. MPU6050_SET_MOT_THR,
  197. MPU6050_SET_MOT_DUR,
  198. MPU6050_SET_ZRMOT_THR,
  199. MPU6050_SET_ZRMOT_DUR,
  200. MPU6050_GET_MOT_DET_STA,
  201. MPU6050_GET_GYRO,
  202. MPU6050_GET_ACC,
  203. }MPU6050_WORK_STAT;
  204. typedef struct{
  205. set_acc_gyro_act_func acc_gyro_func;
  206. MPU6050_WORK_STAT work_stat;
  207. MPU6050_WORK_TYPE work_type;
  208. uint8_t id;
  209. uint8_t mot_det_sta;
  210. uint8_t mpu6050_timeout;
  211. uint8_t mpu6050_error;
  212. bool calculation_stat;
  213. bool xfer_done;
  214. uint8_t acc_buff[6];
  215. uint8_t gyro_buff[6];
  216. uint16_t idx;
  217. uint8_t block;
  218. int16_t AccX[MPU6050_GET_SIZE];
  219. int16_t AccY[MPU6050_GET_SIZE];
  220. int16_t AccZ[MPU6050_GET_SIZE];
  221. int16_t GyroX[MPU6050_GET_SIZE];
  222. int16_t GyroY[MPU6050_GET_SIZE];
  223. int16_t GyroZ[MPU6050_GET_SIZE];
  224. uint8_t offset_idx;
  225. int16_t accx_offset_value[MPU6050_OFFSET_SIZE];
  226. int16_t accy_offset_value[MPU6050_OFFSET_SIZE];
  227. int16_t accz_offset_value[MPU6050_OFFSET_SIZE];
  228. // int16_t gyrox_offset_value[MPU6050_OFFSET_SIZE];
  229. // int16_t gyroy_offset_value[MPU6050_OFFSET_SIZE];
  230. // int16_t gyroz_offset_value[MPU6050_OFFSET_SIZE];
  231. int16_t accx_offset;
  232. int16_t accy_offset;
  233. int16_t accz_offset;
  234. int16_t gyrox_max_offset;
  235. int16_t gyrox_min_offset;
  236. int16_t gyroy_max_offset;
  237. int16_t gyroy_min_offset;
  238. int16_t gyroz_max_offset;
  239. int16_t gyroz_min_offset;
  240. float accx_nu_offset;
  241. float accy_nu_offset;
  242. float accz_nu_offset;
  243. float last_acc_nu_x;
  244. float last_acc_nu_y;
  245. float last_acc_nu_z;
  246. // float accx_offset;
  247. // float accy_offset;
  248. // float accz_offset;
  249. // float gyrox_offset;
  250. // float gyroy_offset;
  251. // float gyroz_offset;
  252. }mpu6050_work_s;
  253. typedef struct{
  254. bool stat;
  255. bool mpu6050_alarm;
  256. uint8_t move_stat;
  257. uint16_t gyro_value;
  258. uint32_t displacement_value;
  259. }mpu6050_data_s;
  260. #define MPU6050_ADDRESS_LEN 1 //MPU6050地址长度
  261. #define MPU6050_ADDRESS (0xD0>>1) //MPU6050地址
  262. #define MPU6050_WHO_AM_I 0x68U //MPU6050 ID
  263. #define MPU6050_GYRO_OUT 0x43
  264. #define MPU6050_ACC_OUT 0x3B
  265. #define ADDRESS_WHO_AM_I (0x75U) // !< WHO_AM_I register identifies the device. Expected value is 0x68.
  266. #define ADDRESS_SIGNAL_PATH_RESET (0x68U) // !<
  267. //MPU6050寄存器
  268. #define MPU_SELF_TESTX_REG 0x0D //自检寄存器X
  269. #define MPU_SELF_TESTY_REG 0x0E //自检寄存器Y
  270. #define MPU_SELF_TESTZ_REG 0x0F //自检寄存器Z
  271. #define MPU_SELF_TESTA_REG 0x10 //自检寄存器A
  272. #define MPU_SAMPLE_RATE_REG 0x19 //采样频率分频器
  273. #define MPU_CFG_REG 0x1A //配置寄存器
  274. #define MPU_GYRO_CFG_REG 0x1B //陀螺仪配置寄存器
  275. #define MPU_ACCEL_CFG_REG 0x1C //加速度计配置寄存器
  276. #define MPU_FF_THR_REG 0x1D //自由落体中断阈值寄存器
  277. #define MPU_FF_DUR_REG 0x1E //自由落体中断时间寄存器
  278. #define MPU_MOT_THR_REG 0x1F //加速度中断阈值寄存器
  279. #define MPU_MOT_DUR_REG 0x20 //加速度中断时间寄存器
  280. #define MPU_ZRMOT_THR_REG 0x21 //静止中断阈值寄存器
  281. #define MPU_ZRMOT_DUR_REG 0x22 //静止中断时间寄存器
  282. #define MPU_FIFO_EN_REG 0x23 //FIFO使能寄存器
  283. #define MPU_I2CMST_CTRL_REG 0x24 //IIC主机控制寄存器
  284. //#define MPU_I2CSLV0_ADDR_REG 0x25 //IIC从机0器件地址寄存器
  285. //#define MPU_I2CSLV0_REG 0x26 //IIC从机0数据地址寄存器
  286. //#define MPU_I2CSLV0_CTRL_REG 0x27 //IIC从机0控制寄存器
  287. //#define MPU_I2CSLV1_ADDR_REG 0x28 //IIC从机1器件地址寄存器
  288. //#define MPU_I2CSLV1_REG 0x29 //IIC从机1数据地址寄存器
  289. //#define MPU_I2CSLV1_CTRL_REG 0x2A //IIC从机1控制寄存器
  290. //#define MPU_I2CSLV2_ADDR_REG 0x2B //IIC从机2器件地址寄存器
  291. //#define MPU_I2CSLV2_REG 0x2C //IIC从机2数据地址寄存器
  292. //#define MPU_I2CSLV2_CTRL_REG 0x2D //IIC从机2控制寄存器
  293. //#define MPU_I2CSLV3_ADDR_REG 0x2E //IIC从机3器件地址寄存器
  294. //#define MPU_I2CSLV3_REG 0x2F //IIC从机3数据地址寄存器
  295. //#define MPU_I2CSLV3_CTRL_REG 0x30 //IIC从机3控制寄存器
  296. //#define MPU_I2CSLV4_ADDR_REG 0x31 //IIC从机4器件地址寄存器
  297. //#define MPU_I2CSLV4_REG 0x32 //IIC从机4数据地址寄存器
  298. //#define MPU_I2CSLV4_DO_REG 0x33 //IIC从机4写数据寄存器
  299. //#define MPU_I2CSLV4_CTRL_REG 0x34 //IIC从机4控制寄存器
  300. //#define MPU_I2CSLV4_DI_REG 0x35 //IIC从机4读数据寄存器
  301. //#define MPU_I2CMST_STA_REG 0x36 //IIC主机状态寄存器
  302. #define MPU_INTBP_CFG_REG 0x37 //中断/旁路设置寄存器
  303. #define MPU_INT_EN_REG 0x38 //中断使能寄存器
  304. #define MPU_INT_STA_REG 0x3A //中断状态寄存器
  305. #define MPU_MOT_DET_STA_REG 0x61 //运动状态寄存器
  306. #define MPU_I2CMST_DELAY_REG 0x67 //IIC主机延时管理寄存器
  307. #define MPU_SIGPATH_RST_REG 0x68 //信号通道复位寄存器
  308. #define MPU_MDETECT_CTRL_REG 0x69 //运动检测控制寄存器
  309. #define MPU_USER_CTRL_REG 0x6A //用户控制寄存器
  310. #define MPU_PWR_MGMT1_REG 0x6B //电源管理寄存器1
  311. #define MPU_PWR_MGMT2_REG 0x6C //电源管理寄存器2
  312. #define MPU_FIFO_CNTH_REG 0x72 //FIFO计数寄存器高八位
  313. #define MPU_FIFO_CNTL_REG 0x73 //FIFO计数寄存器低八位
  314. #define MPU_FIFO_RW_REG 0x74 //FIFO读写寄存器
  315. #define MPU_DEVICE_ID_REG 0x75 //器件ID寄存器
  316. void twi_master_init(void);
  317. bool mpu6050_init(void);
  318. /**
  319. @brief Function for writing a MPU6050 register contents over TWI.
  320. @param[in] register_address Register address to start writing to
  321. @param[in] value Value to write to register
  322. @retval true Register write succeeded
  323. @retval false Register write failed
  324. */
  325. static void mpu6050_register_write(uint8_t register_address, uint8_t value);
  326. /**
  327. @brief Function for reading MPU6050 register contents over TWI.
  328. Reads one or more consecutive registers.
  329. @param[in] register_address Register address to start reading from
  330. @param[in] number_of_bytes Number of bytes to read
  331. @param[out] destination Pointer to a data buffer where read data will be stored
  332. @retval true Register read succeeded
  333. @retval false Register read failed
  334. */
  335. static void mpu6050_read_write(uint8_t register_address);
  336. /**
  337. @brief Function for reading MPU6050 register contents over TWI.
  338. Reads one or more consecutive registers.
  339. @param[in] register_address Register address to start reading from
  340. @param[in] number_of_bytes Number of bytes to read
  341. @param[out] destination Pointer to a data buffer where read data will be stored
  342. @retval true Register read succeeded
  343. @retval false Register read failed
  344. */
  345. static void mpu6050_register_read(uint8_t * destination, uint8_t number_of_bytes);
  346. void mpu6050_set_func(set_acc_gyro_act_func func);
  347. void mpu6050_timers_init(void);
  348. void Mpu6050_Start(void);
  349. void mpu6050_offset_start(void);
  350. void Set_Mpu6050_Value(void);
  351. extern mpu6050_data_s mpu6050_data;
  352. extern mpu6050_work_s mpu6050_work;
  353. #endif //MPU6050_H__