久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13784|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 毛片视频网站 | 成人精品在线视频 | 国产一区二区三区四区 | 国产1区2区在线观看 | 国产在线一区二区 | 亚洲日产精品 | 黄免费观看 | 99re在线视频精品 | 欧美成人免费在线视频 | 美女国内精品自产拍在线播放 | 亚洲精品 在线播放 | 亚洲精品无 | 91免费看片 | 国产精品1区 | 999久久久 | 亚洲精品一区av在线播放 | 欧洲成人免费视频 | 日韩久久久久久 | 久久久久久久香蕉 | 国产午夜精品一区二区三区嫩草 | 91久久精品国产 | 福利视频网址 | 日韩中文久久 | 中文字幕在线观看一区二区 | 国产成人精品999在线观看 | 久久久久久免费精品一区二区三区 | 蜜月va乱码一区二区三区 | 免费国产黄 | 国产精品久久久久久久免费大片 | 日韩精彩视频 | 久久只有精品 | 国产精品久久免费观看 | 久久久久亚洲精品 | 黄色片网站在线观看 | 久久精品视频一区二区三区 | 国产精品视频一二三区 | 国产精品免费一区二区三区四区 | 日韩一区二 | 国产一级特黄视频 | 一区二区av | 亚洲网站在线观看 |