找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stm32最小陀螺仪的源程序及其原理图PCB

[复制链接]
跳转到指定楼层
楼主
最小陀螺仪资料


Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


stm32单片机源程序如下:
  1. #include "main.h"

  2. //定义MPU6050内部地址
  3. #define        SMPLRT_DIV                0x19        //陀螺仪采样率 典型值 0X07 125Hz
  4. #define        CONFIG                        0x1A        //低通滤波频率 典型值 0x00
  5. #define        GYRO_CONFIG                0x1B        //陀螺仪自检及测量范围                 典型值 0x18 不自检 2000deg/s
  6. #define        ACCEL_CONFIG        0x1C        //加速度计自检及测量范围及高通滤波频率 典型值 0x01 不自检 2G 5Hz

  7. #define INT_PIN_CFG     0x37
  8. #define INT_ENABLE      0x38
  9. #define INT_STATUS      0x3A    //只读


  10. #define        ACCEL_XOUT_H        0x3B
  11. #define        ACCEL_XOUT_L        0x3C

  12. #define        ACCEL_YOUT_H        0x3D
  13. #define        ACCEL_YOUT_L        0x3E

  14. #define        ACCEL_ZOUT_H        0x3F
  15. #define        ACCEL_ZOUT_L        0x40

  16. #define        TEMP_OUT_H                0x41
  17. #define        TEMP_OUT_L                0x42

  18. #define        GYRO_XOUT_H                0x43
  19. #define        GYRO_XOUT_L                0x44       

  20. #define        GYRO_YOUT_H                0x45
  21. #define        GYRO_YOUT_L                0x46

  22. #define        GYRO_ZOUT_H                0x47
  23. #define        GYRO_ZOUT_L                0x48

  24. #define        PWR_MGMT_1                0x6B        //电源管理 典型值 0x00 正常启用
  25. #define        WHO_AM_I                0x75        //只读  默认读出应该是 MPU6050_ID = 0x68


  26. #define MPU6050_ID              0x68
  27. #define MPU6050_DEVICE_ADDRESS  0xD0
  28. #define MPU6050_DATA_START      ACCEL_XOUT_H   //由于数据存放地址是连续的,所以一并读出

  29. MPU6050_RAW_DATA    MPU6050_Raw_Data;
  30. MPU6050_REAL_DATA   MPU6050_Real_Data;

  31. int gyroADC_X_offset=0,gyroADC_Y_offset=0,gyroADC_Z_offset=0;

  32. //MPU6050 初始化,成功返回0  失败返回 0xff
  33. int MPU6050_Initialization(void)
  34. {
  35.     unsigned char temp_data = 0x00;

  36.     IIC_GPIO_Init();  //初始化IIC接口
  37.     HEAT_Configuration();
  38.    
  39.     if(IIC_ReadData(MPU6050_DEVICE_ADDRESS,WHO_AM_I ,&temp_data ,1)==0) //确定IIC总线上挂接的是否是MPU6050
  40.     {
  41.         if(temp_data != MPU6050_ID)
  42.         {
  43.             printf("error 1A\r\n");
  44.             return 0xff; //校验失败,返回0xff
  45.         }
  46.     }
  47.     else
  48.     {
  49.         printf("error 1B\r\n");
  50.         return 0xff; //读取失败 返回0xff
  51.     }
  52.    
  53.     if(IIC_WriteData(MPU6050_DEVICE_ADDRESS,PWR_MGMT_1,0x01) == 0xff)    //解除休眠状态
  54.     {
  55.         printf("error 1C\r\n");
  56.         return 0xff;
  57.     }
  58.     if(IIC_WriteData(MPU6050_DEVICE_ADDRESS,SMPLRT_DIV,0x07) == 0xff)//cyq:07 更新频率1khz
  59.     {
  60.         printf("error 1D\r\n");
  61.         return 0xff;
  62.     }
  63.     if(IIC_WriteData(MPU6050_DEVICE_ADDRESS,CONFIG,0x00) == 0xff)
  64.     {
  65.         printf("error 1E\r\n");
  66.         return 0xff;
  67.     }
  68.     if(IIC_WriteData(MPU6050_DEVICE_ADDRESS,GYRO_CONFIG,0x08) == 0xff)
  69.     {
  70.         printf("error 1F\r\n");
  71.         return 0xff;
  72.     }
  73.     if(IIC_WriteData(MPU6050_DEVICE_ADDRESS,ACCEL_CONFIG,0x08) == 0xff)
  74.     {
  75.         printf("error 1G\r\n");
  76.         return 0xff;
  77.     }
  78.     if(IIC_WriteData(MPU6050_DEVICE_ADDRESS,INT_PIN_CFG,0x00) == 0xff)
  79.     {
  80.         printf("error 1H\r\n");
  81.         return 0xff;
  82.     }
  83.     if(IIC_WriteData(MPU6050_DEVICE_ADDRESS,INT_ENABLE,0x01) == 0xff)
  84.     {
  85.         printf("error 1I\r\n");
  86.         return 0xff;
  87.     }
  88.    
  89.     //MPU6050_Interrupt_Configuration(); //MPU6050中断初始化
  90.    
  91.     return 0;
  92. }

  93. //MPU6050  数据读取,成功返回0  失败返回 0xff
  94. int MPU6050_ReadData(void)
  95. {
  96.     u8 buf[14];
  97.    
  98.     if(IIC_ReadData(MPU6050_DEVICE_ADDRESS,MPU6050_DATA_START,buf,14) == 0xff)
  99.     {
  100.         printf("error 1J\r\n");
  101.         return 0xff;
  102.     }
  103.     else
  104.     {
  105.         //读取寄存器原生数据
  106.            
  107.         MPU6050_Raw_Data.Accel_X = (buf[0]<<8 | buf[1]);
  108.         MPU6050_Raw_Data.Accel_Y = (buf[2]<<8 | buf[3]);
  109.         MPU6050_Raw_Data.Accel_Z = (buf[4]<<8 | buf[5]);
  110.         MPU6050_Raw_Data.Temp =    (buf[6]<<8 | buf[7]);  
  111.         MPU6050_Raw_Data.Gyro_X = (buf[8]<<8 | buf[9]);
  112.         MPU6050_Raw_Data.Gyro_Y = (buf[10]<<8 | buf[11]);
  113.         MPU6050_Raw_Data.Gyro_Z = (buf[12]<<8 | buf[13]);

  114.       
  115.         //将原生数据转换为实际值,计算公式跟寄存器的配置有关
  116.         MPU6050_Real_Data.Accel_X = (float)(MPU6050_Raw_Data.Accel_X)/8192.0; //见datasheet 30 of 47
  117.         MPU6050_Real_Data.Accel_Y = (float)(MPU6050_Raw_Data.Accel_Y)/8192.0; //见datasheet 30 of 47
  118.         MPU6050_Real_Data.Accel_Z = (float)(MPU6050_Raw_Data.Accel_Z)/8192.0; //见datasheet 30 of 47
  119.         MPU6050_Real_Data.Temp =   (float)(MPU6050_Raw_Data.Temp)/340.0+36.53;//见datasheet 31 of 47
  120.         MPU6050_Real_Data.Gyro_X = (float)(MPU6050_Raw_Data.Gyro_X - gyroADC_X_offset)/65.5;     //见datasheet 32 of 47
  121.         MPU6050_Real_Data.Gyro_Y = (float)(MPU6050_Raw_Data.Gyro_Y - gyroADC_Y_offset)/65.5;     //见datasheet 32 of 47
  122.         MPU6050_Real_Data.Gyro_Z = (float)(MPU6050_Raw_Data.Gyro_Z - gyroADC_Z_offset)/65.5;     //见datasheet 32 of 47
  123.     }
  124.    
  125.     return 0;
  126. }


  127. void MPU6050_Gyro_calibration(void)
  128. {
  129.         u16 i;
  130.         float x_temp=0,y_temp=0,z_temp=0;
  131. ……………………

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

所有资料51hei提供下载:
最小陀螺仪.zip (6.85 MB, 下载次数: 63)


评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:1 发表于 2017-8-11 01:51 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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