找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4494|回复: 1
打印 上一主题 下一主题
收起左侧

STM32 MPU6050-GY521库函数

[复制链接]
跳转到指定楼层
楼主
STM32 MPU6050-GY521库函数
移植直接引用库函数就行


所有资料51hei提供下载:
MPU6050.zip (46.71 KB, 下载次数: 143)



单片机源程序如下:
  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 单片机教程网

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