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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STM32 MPU6050-GY521庫函數

[復制鏈接]
跳轉到指定樓層
樓主
STM32 MPU6050-GY521庫函數
移植直接引用庫函數就行


所有資料51hei提供下載:
MPU6050.zip (46.71 KB, 下載次數: 144)



單片機源程序如下:
  1. #include "mpu6050.h"
  2. #include "sys.h"
  3. #include "delay.h"
  4. #include "usart.h"   
  5. //////////////////////////////////////////////////////////////////////////////////         
  6. //本程序只供學習使用,未經作者許可,不得用于其它任何用途
  7. //ALIENTEK精英STM32開發板V3
  8. //MPU6050 驅動代碼           
  9. //////////////////////////////////////////////////////////////////////////////////

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

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

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

  218. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼






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

使用道具 舉報

沙發
ID:356403 發表于 2019-7-30 08:41 | 只看該作者
感謝分享,試試看
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 涩涩视频在线观看 | 亚洲国产网址 | 自拍偷拍亚洲一区 | 国产精品久久久久免费 | 人人叉 | 成人在线播放网站 | 亚洲综合99 | 精品中文字幕一区 | www.国产| 久久久久久久久精 | 成人在线视 | 成人免费看 | 日韩羞羞 | 精品影院| 久久精品国产免费一区二区三区 | 亚洲 欧美 另类 综合 偷拍 | 国产一区二区在线免费观看 | 干出白浆视频 | 免费一级片 | www.色五月.com | 久久噜噜噜精品国产亚洲综合 | www.五月婷婷.com | 日韩不卡一二区 | 国产亚洲精品久久久久动 | 久久精品中文字幕 | 91久久精品一区二区二区 | 久久久91 | 亚欧洲精品在线视频免费观看 | 久久精品91久久久久久再现 | 国产小视频在线观看 | 国产精品欧美一区二区三区不卡 | 国产www.| 亚洲一区二区三区免费观看 | 怡红院免费的全部视频 | 91精品国产色综合久久不卡98 | 国产伦精品一区二区三毛 | 超碰电影 | 国产一区不卡 | 久久久精品一区二区三区 | 精品91久久久 | 精品国产31久久久久久 |