找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12853|回复: 14
收起左侧

整理后的mpu6050 dmp文件,包括6050驱动代码(读取DMP输出的三个角)

  [复制链接]
ID:219263 发表于 2018-1-26 16:23 | 显示全部楼层 |阅读模式
main函数,初始化时钟串口等,执行MPU6050Test();后 while(i){ReadGYRO()}就能读取DMP输出的三个角

0.png

单片机源程序如下:
  1. #include "mpu6050.h"

  2. #define delay_ms(x)  DelayMs(x)

  3. void MPU6050Test(void)
  4. {
  5.                 int FLAG;

  6.                 do
  7.                 {
  8.                         FLAG=MPU_Init();        //初始化MPU6050, PC0,PC1
  9.                         delay_ms (200);
  10.                         printf ("Waiting...\n");
  11.       if(FLAG)
  12.                                 printf("ErrorMPU6050:%d...\t\n",FLAG);
  13.                 }while(FLAG);
  14.                 do
  15.                 {
  16.                         FLAG=mpu_dmp_init();
  17.                         delay_ms (200);
  18.                           if(FLAG)
  19.       printf("ErrorDMP:%d...\t\n",FLAG);
  20.                 }while(FLAG);
  21.                 printf("MPU6050 DMP Int... \t\n");
  22. }
  23. float anger[3];
  24. void ReadGYRO()
  25. {                       
  26.         float loop_time_200hz=Get_Cycle_T(0);
  27.         //TDT_IMUBotupdate(0.05,Gyroy);
  28.        

  29.                
  30.                 //        MPU_Get_Accelerometer(&Gyroy->aaceleration[X],&Gyroy->aaceleration[Y],&Gyroy->aaceleration[Z]);        //得到加速度传感器数据
  31.                 //        MPU_Get_Gyroscope(&Gyroy->gyro[X],&Gyroy->gyro[Y],&Gyroy->gyro[Z]);        //得到陀螺仪数据
  32.         MPU_Get_Accelerometer(&Gyroy->OriginalAace[0],&Gyroy->OriginalAace[1],&Gyroy->OriginalAace[2]);
  33.         MPU_Get_Gyroscope(&Gyroy->OriginalGyroys[0],&Gyroy->OriginalGyroys[1],&Gyroy->OriginalGyroys[2]);
  34.                         for(int i=0;i<3;i++)
  35.                         {
  36.                                 mpu9250filter.acc.origin [i]  =Gyroy->OriginalAace[i];
  37.                                 mpu9250filter.gyro.origin [i]  =Gyroy->OriginalGyroys[i];
  38.                         }
  39.                         Mpu9250Top_Data_Prepare();
  40.                         TDT_update(0.5f *loop_time_200hz);
  41.                  printf("dmp=%d\n",mpu_dmp_get_data(&anger[0],&anger[1],&anger[2]));
  42. //        float T_IMU=Get_Cycle_T(0);
  43. //        //TDT_IMUBotupdate(0.05,Gyroy);
  44. //       


  45. //                        if(mpu_dmp_get_data(&anger[0],&anger[1],&anger[2])==0)
  46. //                {
  47. //                //        MPU_Get_Accelerometer(&Gyroy->aaceleration[X],&Gyroy->aaceleration[Y],&Gyroy->aaceleration[Z]);        //得到加速度传感器数据
  48. //                //        MPU_Get_Gyroscope(&Gyroy->gyro[X],&Gyroy->gyro[Y],&Gyroy->gyro[Z]);        //得到陀螺仪数据
  49. //        MPU_Get_Accelerometer(&Gyroy->OriginalAace[0],&Gyroy->OriginalAace[1],&Gyroy->OriginalAace[2]);
  50. //        MPU_Get_Gyroscope(&Gyroy->OriginalGyroys[0],&Gyroy->OriginalGyroys[1],&Gyroy->OriginalGyroys[2]);
  51. //                }
  52. }
  53. //初始化MPU6050
  54. //返回值:0,成功
  55. //    其他,错误代码
  56. u8 MPU_Init(void)
  57. {
  58.         u8 res;
  59.         IIC_Init();//初始化IIC总线
  60.         MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);        //复位MPU6050
  61.     delay_ms(100);
  62.         MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);        //唤醒MPU6050
  63.         MPU_Set_Gyro_Fsr(3);                                        //陀螺仪传感器,±2000dps
  64.         MPU_Set_Accel_Fsr(0);                                        //加速度传感器,±2g
  65.         MPU_Set_Rate(50);                                                //设置采样率50Hz
  66.         MPU_Write_Byte(MPU_INT_EN_REG,0X00);        //关闭所有中断
  67.         MPU_Write_Byte(MPU_USER_CTRL_REG,0X00);        //I2C主模式关闭
  68.         MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);        //关闭FIFO
  69.         MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80);        //INT引脚低电平有效
  70.         res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
  71.         if(res==MPU_ADDR)//器件ID正确
  72.         {
  73.                 MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);        //设置CLKSEL,PLL X轴为参考
  74.                 MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);        //加速度与陀螺仪都工作
  75.                 MPU_Set_Rate(50);                                                //设置采样率为50Hz
  76.         }else return 1;
  77.         return 0;
  78. }
  79. //设置MPU6050陀螺仪传感器满量程范围
  80. //fsr:0,±250dps;1,±500dps;2,±1000dps;3,±2000dps
  81. //返回值:0,设置成功
  82. //    其他,设置失败
  83. u8 MPU_Set_Gyro_Fsr(u8 fsr)
  84. {
  85.         return MPU_Write_Byte(MPU_GYRO_CFG_REG,fsr<<3);//设置陀螺仪满量程范围  
  86. }
  87. //设置MPU6050加速度传感器满量程范围
  88. //fsr:0,±2g;1,±4g;2,±8g;3,±16g
  89. //返回值:0,设置成功
  90. //    其他,设置失败
  91. u8 MPU_Set_Accel_Fsr(u8 fsr)
  92. {
  93.         return MPU_Write_Byte(MPU_ACCEL_CFG_REG,fsr<<3);//设置加速度传感器满量程范围  
  94. }
  95. //设置MPU6050的数字低通滤波器
  96. //lpf:数字低通滤波频率(Hz)
  97. //返回值:0,设置成功
  98. //    其他,设置失败
  99. u8 MPU_Set_LPF(u16 lpf)
  100. {
  101.         u8 data=0;
  102.         if(lpf>=188)data=1;
  103.         else if(lpf>=98)data=2;
  104.         else if(lpf>=42)data=3;
  105.         else if(lpf>=20)data=4;
  106.         else if(lpf>=10)data=5;
  107.         else data=6;
  108.         return MPU_Write_Byte(MPU_CFG_REG,data);//设置数字低通滤波器  
  109. }
  110. //设置MPU6050的采样率(假定Fs=1KHz)
  111. //rate:4~1000(Hz)
  112. //返回值:0,设置成功
  113. //    其他,设置失败
  114. u8 MPU_Set_Rate(u16 rate)
  115. {
  116.         u8 data;
  117.         if(rate>1000)rate=1000;
  118.         if(rate<4)rate=4;
  119.         data=1000/rate-1;
  120.         data=MPU_Write_Byte(MPU_SAMPLE_RATE_REG,data);        //设置数字低通滤波器
  121.         return MPU_Set_LPF(rate/2);        //自动设置LPF为采样率的一半
  122. }

  123. //得到温度值
  124. //返回值:温度值(扩大了100倍)
  125. short MPU_Get_Temperature(void)
  126. {
  127.     u8 buf[2];
  128.     short raw;
  129.         float temp;
  130.         MPU_Read_Len(MPU_ADDR,MPU_TEMP_OUTH_REG,2,buf);
  131.     raw=((u16)buf[0]<<8)|buf[1];  
  132.     temp=36.53+((double)raw)/340;  
  133.     return temp*100;;
  134. }
  135. //得到陀螺仪值(原始值)
  136. //gx,gy,gz:陀螺仪x,y,z轴的原始读数(带符号)
  137. //返回值:0,成功
  138. //    其他,错误代码
  139. u8 MPU_Get_Gyroscope(short *gx,short *gy,short *gz)
  140. {
  141.     u8 buf[6],res;  
  142.         res=MPU_Read_Len(MPU_ADDR,MPU_GYRO_XOUTH_REG,6,buf);
  143.         if(res==0)
  144.         {
  145.                 *gx=((u16)buf[0]<<8)|buf[1];  
  146.                 *gy=((u16)buf[2]<<8)|buf[3];  
  147.                 *gz=((u16)buf[4]<<8)|buf[5];

  148.         }        

  149.     return res;;
  150. }
  151. //得到加速度值(原始值)
  152. //gx,gy,gz:陀螺仪x,y,z轴的原始读数(带符号)
  153. //返回值:0,成功
  154. //    其他,错误代码
  155. u8 MPU_Get_Accelerometer(short *ax,short *ay,short *az)
  156. {
  157.     u8 buf[6],res;  
  158.         res=MPU_Read_Len(MPU_ADDR,MPU_ACCEL_XOUTH_REG,6,buf);
  159.         if(res==0)
  160.         {
  161.                 *ax=((u16)buf[0]<<8)|buf[1];  
  162.                 *ay=((u16)buf[2]<<8)|buf[3];  
  163.                 *az=((u16)buf[4]<<8)|buf[5];
  164.         }        
  165.     return res;;
  166. }
  167. //IIC连续写
  168. //addr:器件地址
  169. //reg:寄存器地址
  170. //len:写入长度
  171. //buf:数据区
  172. //返回值:0,正常
  173. //    其他,错误代码
  174. u8 MPU_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf)
  175. {
  176.         u8 i;
  177.     IIC_Start();
  178.         IIC_Send_Byte((addr<<1)|0);//发送器件地址+写命令       
  179.         if(IIC_Wait_Ack())        //等待应答
  180.         {
  181.                 IIC_Stop();                 
  182.                 return 1;               
  183.         }
  184.     IIC_Send_Byte(reg);        //写寄存器地址
  185.     IIC_Wait_Ack();                //等待应答
  186.         for(i=0;i<len;i++)
  187.         {
  188.                 IIC_Send_Byte(buf[i]);        //发送数据
  189.                 if(IIC_Wait_Ack())                //等待ACK
  190.                 {
  191.                         IIC_Stop();         
  192.                         return 1;                 
  193.                 }               
  194.         }   
  195.     IIC_Stop();         
  196.         return 0;       
  197. }
  198. //IIC连续读
  199. //addr:器件地址
  200. //reg:要读取的寄存器地址
  201. //len:要读取的长度
  202. //buf:读取到的数据存储区
  203. //返回值:0,正常
  204. //    其他,错误代码
  205. u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
  206. {
  207.         IIC_Start();
  208.         IIC_Send_Byte((addr<<1)|0);//发送器件地址+写命令       
  209.         if(IIC_Wait_Ack())        //等待应答
  210.         {
  211.                 IIC_Stop();                 
  212.                 return 1;               
  213.         }
  214.     IIC_Send_Byte(reg);        //写寄存器地址
  215.     IIC_Wait_Ack();                //等待应答
  216.     IIC_Start();
  217.         IIC_Send_Byte((addr<<1)|1);//发送器件地址+读命令       
  218.     IIC_Wait_Ack();                //等待应答
  219.         while(len)
  220.         {
  221.                 if(len==1)*buf=IIC_Read_Byte(0);//读数据,发送nACK
  222.                 else *buf=IIC_Read_Byte(1);                //读数据,发送ACK  
  223.                 len--;
  224.                 buf++;
  225.         }   
  226.     IIC_Stop();        //产生一个停止条件
  227.         return 0;       
  228. }
  229. //IIC写一个字节
  230. //reg:寄存器地址
  231. //data:数据
  232. //返回值:0,正常
  233. //    其他,错误代码
  234. u8 MPU_Write_Byte(u8 reg,u8 data)                                  
  235. {
  236.     IIC_Start();
  237.         IIC_Send_Byte((MPU_ADDR<<1)|0);//发送器件地址+写命令       
  238.         if(IIC_Wait_Ack())        //等待应答
  239.         {
  240.                 IIC_Stop();                 
  241.                 return 1;               
  242.         }
  243.     IIC_Send_Byte(reg);        //写寄存器地址
  244.     IIC_Wait_Ack();                //等待应答
  245.         IIC_Send_Byte(data);//发送数据
  246.         if(IIC_Wait_Ack())        //等待ACK
  247.         {
  248.                 IIC_Stop();         
  249.                 return 1;                 
  250.         }                 
  251.     IIC_Stop();         
  252.         return 0;
  253. }
  254. //IIC读一个字节
  255. //reg:寄存器地址
  256. //返回值:读到的数据
  257. u8 MPU_Read_Byte(u8 reg)
  258. {
  259.         u8 res;
  260.     IIC_Start();
  261.         IIC_Send_Byte((MPU_ADDR<<1)|0);//发送器件地址+写命令       
  262.         IIC_Wait_Ack();                //等待应答
  263.     IIC_Send_Byte(reg);        //写寄存器地址
  264.     IIC_Wait_Ack();                //等待应答
  265.     IIC_Start();
  266.         IIC_Send_Byte((MPU_ADDR<<1)|1);//发送器件地址+读命令       
  267.     IIC_Wait_Ack();                //等待应答
  268.         res=IIC_Read_Byte(0);//读取数据,发送nACK
  269.     IIC_Stop();                        //产生一个停止条件
  270.         return res;               
  271. }
复制代码

所有资料51hei提供下载:
MPU6050 DMP.zip (43.69 KB, 下载次数: 251)
回复

使用道具 举报

ID:284626 发表于 2018-5-5 18:18 | 显示全部楼层
main.C呢!!!!!
回复

使用道具 举报

ID:324874 发表于 2018-5-18 21:41 | 显示全部楼层
谢谢分享,学习一下
回复

使用道具 举报

ID:152785 发表于 2018-7-18 10:00 | 显示全部楼层
兄弟,这个你试过吗?确定能行?指导下呗
回复

使用道具 举报

ID:327894 发表于 2018-8-6 10:17 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:327894 发表于 2018-8-6 10:18 | 显示全部楼层
楼主用的是什么芯片啊
回复

使用道具 举报

ID:383347 发表于 2018-8-6 10:35 | 显示全部楼层
顶一个
回复

使用道具 举报

ID:388317 发表于 2018-8-20 22:51 | 显示全部楼层
感谢分享!
回复

使用道具 举报

ID:336044 发表于 2018-9-12 14:24 | 显示全部楼层
不会用
回复

使用道具 举报

ID:229577 发表于 2018-12-4 10:56 | 显示全部楼层
这明显不是dmp呀, 坑货
回复

使用道具 举报

ID:576259 发表于 2019-7-2 11:13 | 显示全部楼层
楼主厉害
回复

使用道具 举报

ID:384844 发表于 2019-7-20 18:39 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:185372 发表于 2019-10-7 07:53 | 显示全部楼层
这个能使用dmp库吗?遇到错误了。希望这个会有用。
回复

使用道具 举报

ID:670179 发表于 2019-12-22 07:55 | 显示全部楼层
正常感谢!文件不全
回复

使用道具 举报

ID:349536 发表于 2020-5-7 19:10 | 显示全部楼层
楼主,你的代码没有main()函数呀,而且只有官方dmp的几个文件,不是工程文件要怎么用呢求源工程文件!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表