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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1861|回復: 1
打印 上一主題 下一主題
收起左側

基于stm32的mpu6050開發

[復制鏈接]
跳轉到指定樓層
樓主
ID:469700 發表于 2019-7-29 15:31 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include "mpu6050.h"
  2. #include "sys.h"
  3. #include "delay.h"
  4. #include "usart.h"   

  5. //初始化MPU6050
  6. //返回值:0,成功
  7. //    其他,錯誤代碼
  8. //PA15 ADO控制腳
  9. u8 MPU_Init(void)
  10. {
  11.         u8 res;
  12.   GPIO_InitTypeDef  GPIO_InitStructure;
  13.        
  14.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能AFIO時鐘
  15.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//先使能外設IO PORTA時鐘
  16.        
  17.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;         // 端口配置
  18.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽輸出
  19.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度為50MHz
  20.   GPIO_Init(GPIOA, &GPIO_InitStructure);                                         //根據設定參數初始化GPIOA

  21.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//禁止JTAG,從而PA15可以做普通IO使用,否則PA15不能做普通IO!!!
  22.        
  23.         MPU_AD0_CTRL=0;                        //控制MPU6050的AD0腳為低電平,從機地址為:0X68
  24.        
  25.         MPU_IIC_Init();//初始化IIC總線
  26.         MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);        //復位MPU6050
  27.   delay_ms(100);
  28.         MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);        //喚醒MPU6050
  29.         MPU_Set_Gyro_Fsr(3);                                        //陀螺儀傳感器,±2000dps
  30.         MPU_Set_Accel_Fsr(0);                                        //加速度傳感器,±2g
  31.         MPU_Set_Rate(50);                                                //設置采樣率50Hz
  32.         MPU_Write_Byte(MPU_INT_EN_REG,0X00);        //關閉所有中斷
  33.         MPU_Write_Byte(MPU_USER_CTRL_REG,0X00);        //I2C主模式關閉
  34.         MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);        //關閉FIFO
  35.         MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80);        //INT引腳低電平有效
  36.         res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
  37.         if(res==MPU_ADDR)//器件ID正確
  38.         {
  39.                 MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);        //設置CLKSEL,PLL X軸為參考
  40.                 MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);        //加速度與陀螺儀都工作
  41.                 MPU_Set_Rate(50);                                                //設置采樣率為50Hz
  42.         }else return 1;
  43.         return 0;
  44. }
  45. //設置MPU6050陀螺儀傳感器滿量程范圍
  46. //fsr:0,±250dps;1,±500dps;2,±1000dps;3,±2000dps
  47. //返回值:0,設置成功
  48. //    其他,設置失敗
  49. u8 MPU_Set_Gyro_Fsr(u8 fsr)
  50. {
  51.         return MPU_Write_Byte(MPU_GYRO_CFG_REG,fsr<<3);//設置陀螺儀滿量程范圍  
  52. }
  53. //設置MPU6050加速度傳感器滿量程范圍
  54. //fsr:0,±2g;1,±4g;2,±8g;3,±16g
  55. //返回值:0,設置成功
  56. //    其他,設置失敗
  57. u8 MPU_Set_Accel_Fsr(u8 fsr)
  58. {
  59.         return MPU_Write_Byte(MPU_ACCEL_CFG_REG,fsr<<3);//設置加速度傳感器滿量程范圍  
  60. }
  61. //設置MPU6050的數字低通濾波器
  62. //lpf:數字低通濾波頻率(Hz)
  63. //返回值:0,設置成功
  64. //    其他,設置失敗
  65. u8 MPU_Set_LPF(u16 lpf)
  66. {
  67.         u8 data=0;
  68.         if(lpf>=188)data=1;
  69.         else if(lpf>=98)data=2;
  70.         else if(lpf>=42)data=3;
  71.         else if(lpf>=20)data=4;
  72.         else if(lpf>=10)data=5;
  73.         else data=6;
  74.         return MPU_Write_Byte(MPU_CFG_REG,data);//設置數字低通濾波器  
  75. }
  76. //設置MPU6050的采樣率(假定Fs=1KHz)
  77. //rate:4~1000(Hz)
  78. //返回值:0,設置成功
  79. //    其他,設置失敗
  80. u8 MPU_Set_Rate(u16 rate)
  81. {
  82.         u8 data;
  83.         if(rate>1000)rate=1000;
  84.         if(rate<4)rate=4;
  85.         data=1000/rate-1;
  86.         data=MPU_Write_Byte(MPU_SAMPLE_RATE_REG,data);        //設置數字低通濾波器
  87.         return MPU_Set_LPF(rate/2);        //自動設置LPF為采樣率的一半
  88. }

  89. //得到溫度值
  90. //返回值:溫度值(擴大了100倍)
  91. short MPU_Get_Temperature(void)
  92. {
  93.     u8 buf[2];
  94.     short raw;
  95.         float temp;
  96.         MPU_Read_Len(MPU_ADDR,MPU_TEMP_OUTH_REG,2,buf);
  97.     raw=((u16)buf[0]<<8)|buf[1];  
  98.     temp=36.53+((double)raw)/340;  
  99.     return temp*100;;
  100. }
  101. //得到陀螺儀值(原始值)
  102. //gx,gy,gz:陀螺儀x,y,z軸的原始讀數(帶符號)
  103. //返回值:0,成功
  104. //    其他,錯誤代碼
  105. u8 MPU_Get_Gyroscope(short *gx,short *gy,short *gz)
  106. {
  107.     u8 buf[6],res;  
  108.         res=MPU_Read_Len(MPU_ADDR,MPU_GYRO_XOUTH_REG,6,buf);
  109.         if(res==0)
  110.         {
  111.                 *gx=((u16)buf[0]<<8)|buf[1];  
  112.                 *gy=((u16)buf[2]<<8)|buf[3];  
  113.                 *gz=((u16)buf[4]<<8)|buf[5];
  114.         }        
  115.     return res;;
  116. }
  117. //得到加速度值(原始值)
  118. //gx,gy,gz:陀螺儀x,y,z軸的原始讀數(帶符號)
  119. //返回值:0,成功
  120. //    其他,錯誤代碼
  121. u8 MPU_Get_Accelerometer(short *ax,short *ay,short *az)
  122. {
  123.     u8 buf[6],res;  
  124.         res=MPU_Read_Len(MPU_ADDR,MPU_ACCEL_XOUTH_REG,6,buf);
  125.         if(res==0)
  126.         {
  127.                 *ax=((u16)buf[0]<<8)|buf[1];  
  128.                 *ay=((u16)buf[2]<<8)|buf[3];  
  129.                 *az=((u16)buf[4]<<8)|buf[5];
  130.         }        
  131.     return res;;
  132. }
  133. //IIC連續寫
  134. //addr:器件地址
  135. //reg:寄存器地址
  136. //len:寫入長度
  137. //buf:數據區
  138. //返回值:0,正常
  139. //    其他,錯誤代碼
  140. u8 MPU_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf)
  141. {
  142.         u8 i;
  143.     MPU_IIC_Start();
  144.         MPU_IIC_Send_Byte((addr<<1)|0);//發送器件地址+寫命令       
  145.         if(MPU_IIC_Wait_Ack())        //等待應答
  146.         {
  147.                 MPU_IIC_Stop();                 
  148.                 return 1;               
  149.         }
  150.     MPU_IIC_Send_Byte(reg);        //寫寄存器地址
  151.     MPU_IIC_Wait_Ack();                //等待應答
  152.         for(i=0;i<len;i++)
  153.         {
  154.                 MPU_IIC_Send_Byte(buf[i]);        //發送數據
  155.                 if(MPU_IIC_Wait_Ack())                //等待ACK
  156.                 {
  157.                         MPU_IIC_Stop();         
  158.                         return 1;                 
  159.                 }               
  160.         }   
  161.     MPU_IIC_Stop();         
  162.         return 0;       
  163. }
  164. //IIC連續讀
  165. //addr:器件地址
  166. //reg:要讀取的寄存器地址
  167. //len:要讀取的長度
  168. //buf:讀取到的數據存儲區
  169. //返回值:0,正常
  170. //    其他,錯誤代碼
  171. u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
  172. {
  173.         MPU_IIC_Start();
  174.         MPU_IIC_Send_Byte((addr<<1)|0);//發送器件地址+寫命令       
  175.         if(MPU_IIC_Wait_Ack())        //等待應答
  176.         {
  177.                 MPU_IIC_Stop();                 
  178.                 return 1;               
  179.         }
  180.     MPU_IIC_Send_Byte(reg);        //寫寄存器地址
  181.     MPU_IIC_Wait_Ack();                //等待應答
  182.     MPU_IIC_Start();
  183.         MPU_IIC_Send_Byte((addr<<1)|1);//發送器件地址+讀命令       
  184.     MPU_IIC_Wait_Ack();                //等待應答
  185.         while(len)
  186.         {
  187.                 if(len==1)*buf=MPU_IIC_Read_Byte(0);//讀數據,發送nACK
  188.                 else *buf=MPU_IIC_Read_Byte(1);                //讀數據,發送ACK  
  189.                 len--;
  190.                 buf++;
  191.         }   
  192.     MPU_IIC_Stop();        //產生一個停止條件
  193.         return 0;       
  194. }
  195. //IIC寫一個字節
  196. //reg:寄存器地址
  197. //data:數據
  198. //返回值:0,正常
  199. //    其他,錯誤代碼
  200. u8 MPU_Write_Byte(u8 reg,u8 data)                                  
  201. {
  202.     MPU_IIC_Start();
  203.         MPU_IIC_Send_Byte((MPU_ADDR<<1)|0);//發送器件地址+寫命令       
  204.         if(MPU_IIC_Wait_Ack())        //等待應答
  205.         {
  206.                 MPU_IIC_Stop();                 
  207.                 return 1;               
  208.         }
  209.     MPU_IIC_Send_Byte(reg);        //寫寄存器地址
  210.     MPU_IIC_Wait_Ack();                //等待應答
  211.         MPU_IIC_Send_Byte(data);//發送數據
  212.         if(MPU_IIC_Wait_Ack())        //等待ACK
  213.         {
  214.                 MPU_IIC_Stop();         
  215.                 return 1;                 
  216.         }                 
  217.     MPU_IIC_Stop();         
  218.         return 0;
  219. }
  220. //IIC讀一個字節
  221. //reg:寄存器地址
  222. //返回值:讀到的數據
  223. u8 MPU_Read_Byte(u8 reg)
  224. {
  225.         u8 res;
  226.     MPU_IIC_Start();
  227.         MPU_IIC_Send_Byte((MPU_ADDR<<1)|0);//發送器件地址+寫命令       
  228.         MPU_IIC_Wait_Ack();                //等待應答
  229.     MPU_IIC_Send_Byte(reg);        //寫寄存器地址
  230.     MPU_IIC_Wait_Ack();                //等待應答
  231.     MPU_IIC_Start();
  232.         MPU_IIC_Send_Byte((MPU_ADDR<<1)|1);//發送器件地址+讀命令       
  233.     MPU_IIC_Wait_Ack();                //等待應答
  234.         res=MPU_IIC_Read_Byte(0);//讀取數據,發送nACK
  235.     MPU_IIC_Stop();                        //產生一個停止條件
  236.         return res;               
  237. }


復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:644664 發表于 2020-8-12 15:59 | 只看該作者
為啥讀取陀螺儀的時候只讀取了X軸高寄存器?這樣能得到x、y、z軸三個方向上的數據嗎?連續讀函數也是讀同一個寄存器啊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久这里只有精品首页 | 国产成人精品一区二三区在线观看 | 大乳boobs巨大吃奶挤奶 | 一级国产精品一级国产精品片 | 精品一区二区三区在线观看 | 欧美中文字幕在线观看 | 久久久久国产一级毛片 | 精品久久久网站 | 亚洲一区二区三区免费在线观看 | 一区二区精品 | 中文字幕不卡一区 | 日韩超碰 | 久久成人精品视频 | 日韩一区二区久久 | 最新中文字幕在线 | 一区二区三区国产 | 日韩欧美在线视频一区 | 亚洲一区中文字幕在线观看 | 亚洲社区在线 | 日韩视频一区二区三区 | 男女羞羞视频在线免费观看 | 国产精品久久久久久久毛片 | 欧美日韩亚洲国产综合 | 成人午夜免费福利视频 | 亚洲精品9999 | 日韩在线一区二区三区 | 日韩理论电影在线观看 | 日日干天天干 | 日韩视频一区二区 | 在线免费小视频 | 国产福利91精品一区二区三区 | va在线 | 亚洲国产成人久久久 | 91综合在线观看 | 99久久精品一区二区毛片吞精 | 亚洲一区二区三区免费在线观看 | 国产一区视频在线 | 成人在线播放 | 中文字幕在线中文 | 免费在线黄色av | 精品久久久久国产免费第一页 |