找回密码
 立即注册

QQ登录

只需一步,快速开始

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

mpu6050六轴传感器stm32程序

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1. #include "mpu6050.h"
  2. #include "sys.h"
  3. #include "delay.h"
  4. #include "usart.h"   
  5. //////////////////////////////////////////////////////////////////////////////////         
  6. //本程序只供学习使用,未经作者许可,不得用于其它任何用途
  7. //ALIENTEK STM32F407开发板
  8. //MPU6050 驱动代码          
  9. //正点原子@ALIENTEK
  10. //创建日期:14/5/9
  11. //版本:V1.0
  12. //版权所有,盗版必究。
  13. //Copyright(C) 广州市星翼电子科技有限公司 2014-2024
  14. //All rights reserved                                                                          
  15. //////////////////////////////////////////////////////////////////////////////////        

  16. //初始化MPU6050
  17. //返回值:0,成功
  18. //    其他,错误代码
  19. u8 MPU_Init(void)
  20. {
  21.         u8 res;
  22.         IIC_Init();//初始化IIC总线
  23.         MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);        //复位MPU6050
  24.     delay_ms(100);
  25.         MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);        //唤醒MPU6050
  26.         MPU_Set_Gyro_Fsr(3);                                        //陀螺仪传感器,±2000dps
  27.         MPU_Set_Accel_Fsr(0);                                        //加速度传感器,±2g
  28.         MPU_Set_Rate(50);                                                //设置采样率50Hz
  29.         MPU_Write_Byte(MPU_INT_EN_REG,0X00);        //关闭所有中断
  30.         MPU_Write_Byte(MPU_USER_CTRL_REG,0X00);        //I2C主模式关闭
  31.         MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);        //关闭FIFO
  32.         MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80);        //INT引脚低电平有效
  33.         res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
  34.         if(res==MPU_ADDR)//器件ID正确
  35.         {
  36.                 MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);        //设置CLKSEL,PLL X轴为参考
  37.                 MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);        //加速度与陀螺仪都工作
  38.                 MPU_Set_Rate(50);                                                //设置采样率为50Hz
  39.         }else return 1;
  40.         return 0;
  41. }
  42. //设置MPU6050陀螺仪传感器满量程范围
  43. //fsr:0,±250dps;1,±500dps;2,±1000dps;3,±2000dps
  44. //返回值:0,设置成功
  45. //    其他,设置失败
  46. u8 MPU_Set_Gyro_Fsr(u8 fsr)
  47. {
  48.         return MPU_Write_Byte(MPU_GYRO_CFG_REG,fsr<<3);//设置陀螺仪满量程范围  
  49. }
  50. //设置MPU6050加速度传感器满量程范围
  51. //fsr:0,±2g;1,±4g;2,±8g;3,±16g
  52. //返回值:0,设置成功
  53. //    其他,设置失败
  54. u8 MPU_Set_Accel_Fsr(u8 fsr)
  55. {
  56.         return MPU_Write_Byte(MPU_ACCEL_CFG_REG,fsr<<3);//设置加速度传感器满量程范围  
  57. }
  58. //设置MPU6050的数字低通滤波器
  59. //lpf:数字低通滤波频率(Hz)
  60. //返回值:0,设置成功
  61. //    其他,设置失败
  62. u8 MPU_Set_LPF(u16 lpf)
  63. {
  64.         u8 data=0;
  65.         if(lpf>=188)data=1;
  66.         else if(lpf>=98)data=2;
  67.         else if(lpf>=42)data=3;
  68.         else if(lpf>=20)data=4;
  69.         else if(lpf>=10)data=5;
  70.         else data=6;
  71.         return MPU_Write_Byte(MPU_CFG_REG,data);//设置数字低通滤波器  
  72. }
  73. //设置MPU6050的采样率(假定Fs=1KHz)
  74. //rate:4~1000(Hz)
  75. //返回值:0,设置成功
  76. //    其他,设置失败
  77. u8 MPU_Set_Rate(u16 rate)
  78. {
  79.         u8 data;
  80.         if(rate>1000)rate=1000;
  81.         if(rate<4)rate=4;
  82.         data=1000/rate-1;
  83.         data=MPU_Write_Byte(MPU_SAMPLE_RATE_REG,data);        //设置数字低通滤波器
  84.         return MPU_Set_LPF(rate/2);        //自动设置LPF为采样率的一半
  85. }

  86. //得到温度值
  87. //返回值:温度值(扩大了100倍)
  88. short MPU_Get_Temperature(void)
  89. {
  90.     u8 buf[2];
  91.     short raw;
  92.         float temp;
  93.         MPU_Read_Len(MPU_ADDR,MPU_TEMP_OUTH_REG,2,buf);
  94.     raw=((u16)buf[0]<<8)|buf[1];  
  95.     temp=36.53+((double)raw)/340;  
  96.     return temp*100;;
  97. }
  98. //得到陀螺仪值(原始值)
  99. //gx,gy,gz:陀螺仪x,y,z轴的原始读数(带符号)
  100. //返回值:0,成功
  101. //    其他,错误代码
  102. u8 MPU_Get_Gyroscope(short *gx,short *gy,short *gz)
  103. {
  104.     u8 buf[6],res;  
  105.         res=MPU_Read_Len(MPU_ADDR,MPU_GYRO_XOUTH_REG,6,buf);
  106.         if(res==0)
  107.         {
  108.                 *gx=((u16)buf[0]<<8)|buf[1];  
  109.                 *gy=((u16)buf[2]<<8)|buf[3];  
  110.                 *gz=((u16)buf[4]<<8)|buf[5];
  111.         }        
  112.     return res;;
  113. }
  114. //得到加速度值(原始值)
  115. //gx,gy,gz:陀螺仪x,y,z轴的原始读数(带符号)
  116. //返回值:0,成功
  117. //    其他,错误代码
  118. u8 MPU_Get_Accelerometer(short *ax,short *ay,short *az)
  119. {
  120.     u8 buf[6],res;  
  121.         res=MPU_Read_Len(MPU_ADDR,MPU_ACCEL_XOUTH_REG,6,buf);
  122.         if(res==0)
  123.         {
  124.                 *ax=((u16)buf[0]<<8)|buf[1];  
  125.                 *ay=((u16)buf[2]<<8)|buf[3];  
  126.                 *az=((u16)buf[4]<<8)|buf[5];
  127.         }        
  128.     return res;;
  129. }
  130. //IIC连续写
  131. //addr:器件地址
  132. //reg:寄存器地址
  133. //len:写入长度
  134. //buf:数据区
  135. //返回值:0,正常
  136. //    其他,错误代码
  137. u8 MPU_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf)
  138. {
  139.         u8 i;
  140.     IIC_Start();
  141.         IIC_Send_Byte((addr<<1)|0);//发送器件地址+写命令       
  142.         if(IIC_Wait_Ack())        //等待应答
  143.         {
  144.                 IIC_Stop();                 
  145.                 return 1;               
  146.         }
  147.     IIC_Send_Byte(reg);        //写寄存器地址
  148.     IIC_Wait_Ack();                //等待应答
  149.         for(i=0;i<len;i++)
  150.         {
  151.                 IIC_Send_Byte(buf[i]);        //发送数据
  152.                 if(IIC_Wait_Ack())                //等待ACK
  153.                 {
  154.                         IIC_Stop();         
  155.                         return 1;                 
  156.                 }               
  157.         }   
  158.     IIC_Stop();         
  159.         return 0;       
  160. }
  161. //IIC连续读
  162. //addr:器件地址
  163. //reg:要读取的寄存器地址
  164. //len:要读取的长度
  165. //buf:读取到的数据存储区
  166. //返回值:0,正常
  167. //    其他,错误代码
  168. u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
  169. {
  170.         IIC_Start();
  171.         IIC_Send_Byte((addr<<1)|0);//发送器件地址+写命令       
  172.         if(IIC_Wait_Ack())        //等待应答
  173.         {
  174.                 IIC_Stop();                 
  175.                 return 1;               
  176.         }
  177.     IIC_Send_Byte(reg);        //写寄存器地址
  178.     IIC_Wait_Ack();                //等待应答
  179.     IIC_Start();
  180.         IIC_Send_Byte((addr<<1)|1);//发送器件地址+读命令       
  181.     IIC_Wait_Ack();                //等待应答
  182.         while(len)
  183.         {
  184.                 if(len==1)*buf=IIC_Read_Byte(0);//读数据,发送nACK
  185.                 else *buf=IIC_Read_Byte(1);                //读数据,发送ACK  
  186.                 len--;
  187.                 buf++;
  188.         }   
  189.     IIC_Stop();        //产生一个停止条件
  190.         return 0;       
  191. }
  192. //IIC写一个字节
  193. //reg:寄存器地址
  194. //data:数据
  195. //返回值:0,正常
  196. //    其他,错误代码
  197. u8 MPU_Write_Byte(u8 reg,u8 data)                                  
  198. {
  199.     IIC_Start();
  200.         IIC_Send_Byte((MPU_ADDR<<1)|0);//发送器件地址+写命令       
  201.         if(IIC_Wait_Ack())        //等待应答
  202.         {
  203.                 IIC_Stop();                 
  204.                 return 1;               
  205.         }
  206.     IIC_Send_Byte(reg);        //写寄存器地址
  207.     IIC_Wait_Ack();                //等待应答
  208.         IIC_Send_Byte(data);//发送数据
  209.         if(IIC_Wait_Ack())        //等待ACK
  210.         {
  211. ……………………

  212. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
MPU6050.rar (40.27 KB, 下载次数: 51)



评分

参与人数 1黑币 +8 收起 理由
ytteria0001 + 8 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:281632 发表于 2018-2-2 09:50 | 只看该作者
这个可以驱动步进电机进行平衡调整吗?
回复

使用道具 举报

板凳
ID:338605 发表于 2018-5-26 11:30 | 只看该作者
学习学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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