MPU6050.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #include "MPU6050.h"
  2. #include "IIC.h"
  3. /**
  4. * @brief 写数据到MPU6050寄存器
  5. * @param
  6. * @retval
  7. */
  8. void MPU6050_WriteReg(u8 reg_add,u8 reg_dat)
  9. {
  10. IIC_start();
  11. IIC_send_byte(MPU6050_WriteAddr);
  12. IIC_wait_ack();
  13. IIC_send_byte(reg_add);
  14. IIC_wait_ack();
  15. IIC_send_byte(reg_dat);
  16. IIC_wait_ack();
  17. IIC_stop();
  18. }
  19. /**
  20. * @brief 从MPU6050寄存器读取数据
  21. * @param
  22. * @retval
  23. */
  24. void MPU6050_ReadData(u8 reg_add,unsigned char*Read,u8 num)
  25. {
  26. unsigned char i;
  27. IIC_start();
  28. IIC_send_byte(MPU6050_WriteAddr);
  29. IIC_wait_ack();
  30. IIC_send_byte(reg_add);
  31. IIC_wait_ack();
  32. IIC_start();
  33. IIC_send_byte(MPU6050_ReadAddr);
  34. IIC_wait_ack();
  35. for(i=0;i<(num-1);i++){
  36. *Read=IIC_read_byte(1);
  37. Read++;
  38. }
  39. *Read=IIC_read_byte(0);
  40. IIC_stop();
  41. }
  42. /**
  43. * @brief 初始化MPU6050芯片
  44. * @param
  45. * @retval
  46. */
  47. void MPU6050_Init(void)
  48. {
  49. IIC_init();
  50. //在初始化之前要延时一段时间,若没有延时,则断电后再上电数据可能会出错
  51. DELAYClass.DelayMs(1000);
  52. MPU6050_WriteReg(MPU6050_RA_PWR_MGMT_1, 0x00); //解除休眠状态
  53. MPU6050_WriteReg(MPU6050_RA_SMPLRT_DIV , 0x07); //陀螺仪采样率,1KHz
  54. MPU6050_WriteReg(MPU6050_RA_CONFIG , 0x06); //低通滤波器的设置,截止频率是1K,带宽是5K
  55. MPU6050_WriteReg(MPU6050_RA_ACCEL_CONFIG , 0x00); //配置加速度传感器工作在2G模式,不自检
  56. MPU6050_WriteReg(MPU6050_RA_GYRO_CONFIG, 0x18); //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
  57. MPU6050ReadID();
  58. }
  59. /**
  60. * @brief 读取MPU6050的ID
  61. * @param
  62. * @retval
  63. */
  64. uint8_t MPU6050ReadID(void)
  65. {
  66. unsigned char Re = 0;
  67. MPU6050_ReadData(MPU6050_RA_WHO_AM_I,&Re,1); //读器件地址
  68. if(Re != 0x68)
  69. {
  70. printf("MPU6050 dectected error!\n");
  71. return 0;
  72. }
  73. else
  74. {
  75. printf("MPU6050 ID = 0x%02X\n",Re);
  76. return 1;
  77. }
  78. }
  79. /**
  80. * @brief 读取MPU6050的加速度数据
  81. * @param
  82. * @retval
  83. */
  84. void MPU6050ReadAcc(short *accData)
  85. {
  86. u8 buf[6];
  87. MPU6050_ReadData(MPU6050_ACC_OUT, buf, 6);
  88. accData[0] = (buf[0] << 8) | buf[1];
  89. accData[1] = (buf[2] << 8) | buf[3];
  90. accData[2] = (buf[4] << 8) | buf[5];
  91. }
  92. /**
  93. * @brief 读取MPU6050的角加速度数据
  94. * @param
  95. * @retval
  96. */
  97. void MPU6050ReadGyro(short *gyroData)
  98. {
  99. u8 buf[6];
  100. MPU6050_ReadData(MPU6050_GYRO_OUT,buf,6);
  101. gyroData[0] = (buf[0] << 8) | buf[1];
  102. gyroData[1] = (buf[2] << 8) | buf[3];
  103. gyroData[2] = (buf[4] << 8) | buf[5];
  104. }
  105. /**
  106. * @brief 读取MPU6050的原始温度数据
  107. * @param
  108. * @retval
  109. */
  110. void MPU6050ReadTemp(short *tempData)
  111. {
  112. u8 buf[2];
  113. MPU6050_ReadData(MPU6050_RA_TEMP_OUT_H,buf,2); //读取温度值
  114. *tempData = (buf[0] << 8) | buf[1];
  115. }
  116. /**
  117. * @brief 读取MPU6050的温度数据,转化成摄氏度
  118. * @param
  119. * @retval
  120. */
  121. void MPU6050_ReturnTemp(float *Temperature)
  122. {
  123. short temp3;
  124. u8 buf[2];
  125. MPU6050_ReadData(MPU6050_RA_TEMP_OUT_H,buf,2); //读取温度值
  126. temp3= (buf[0] << 8) | buf[1];
  127. *Temperature=((double) temp3/340.0)+36.53;
  128. }