標(biāo)題: stm32最小陀螺儀的源程序及其原理圖PCB [打印本頁]

作者: 666666666666661    時(shí)間: 2017-8-9 13:54
標(biāo)題: stm32最小陀螺儀的源程序及其原理圖PCB
最小陀螺儀資料


Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)


stm32單片機(jī)源程序如下:
  1. #include "main.h"

  2. //定義MPU6050內(nèi)部地址
  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        //加速度計(jì)自檢及測量范圍及高通濾波頻率 典型值 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        //只讀  默認(rèn)讀出應(yīng)該是 MPU6050_ID = 0x68


  26. #define MPU6050_ID              0x68
  27. #define MPU6050_DEVICE_ADDRESS  0xD0
  28. #define MPU6050_DATA_START      ACCEL_XOUT_H   //由于數(shù)據(jù)存放地址是連續(xù)的,所以一并讀出

  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; //校驗(yàn)失敗,返回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)    //解除休眠狀態(tài)
  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  數(shù)據(jù)讀取,成功返回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.         //讀取寄存器原生數(shù)據(jù)
  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.         //將原生數(shù)據(jù)轉(zhuǎn)換為實(shí)際值,計(jì)算公式跟寄存器的配置有關(guān)
  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黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
最小陀螺儀.zip (6.85 MB, 下載次數(shù): 63)



作者: admin    時(shí)間: 2017-8-11 01:51
好資料,51黑有你更精彩!!!




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1