找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1478|回复: 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 单片机教程网

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