久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10070|回復: 19
打印 上一主題 下一主題
收起左側

利用STM8驅動的MPU6050陀螺儀源程序

  [復制鏈接]
跳轉到指定樓層
樓主
利用STM8驅動的陀螺儀程序,參考其他人寫的32的程序,自己修改接口,完成驅動陀螺儀。

單片機源程序如下:
  1. #include "MPU6050.h"
  2. #include "IOI2C.h"
  3. #include "usart1.h"
  4. #include <math.h>
  5. #include "inv_mpu_dmp_motion_driver.h"
  6. #include "inv_mpu.h"
  7. #include <stdio.h>
  8. /**************************************************************************/
  9. #define PRINT_ACCEL     (0x01)
  10. #define PRINT_GYRO      (0x02)
  11. #define PRINT_QUAT      (0x04)
  12. #define ACCEL_ON        (0x01)
  13. #define GYRO_ON         (0x02)
  14. #define MOTION          (0)
  15. #define NO_MOTION       (1)
  16. #define DEFAULT_MPU_HZ  (200)
  17. #define FLASH_SIZE      (512)
  18. #define FLASH_MEM_START ((void*)0x1800)
  19. #define q30  1073741824.0f

  20. static signed char gyro_orientation[9] = {-1, 0, 0,
  21.                                            0,-1, 0,
  22.                                            0, 0, 1};

  23. static  unsigned short inv_row_2_scale(const signed char *row)
  24. {
  25.     unsigned short b;

  26.     if (row[0] > 0)
  27.         b = 0;
  28.     else if (row[0] < 0)
  29.         b = 4;
  30.     else if (row[1] > 0)
  31.         b = 1;
  32.     else if (row[1] < 0)
  33.         b = 5;
  34.     else if (row[2] > 0)
  35.         b = 2;
  36.     else if (row[2] < 0)
  37.         b = 6;
  38.     else
  39.         b = 7;      // error
  40.     return b;
  41. }


  42. static  unsigned short inv_orientation_matrix_to_scalar(
  43.     const signed char *mtx)
  44. {
  45.     unsigned short scalar;
  46.     scalar = inv_row_2_scale(mtx);
  47.     scalar |= inv_row_2_scale(mtx + 3) << 3;
  48.     scalar |= inv_row_2_scale(mtx + 6) << 6;


  49.     return scalar;
  50. }

  51. static void run_self_test(void)
  52. {
  53.     int result;
  54.     long gyro[3], accel[3];

  55.     result = mpu_run_self_test(gyro, accel);
  56.     if (result == 0x7) {
  57.         /* Test passed. We can trust the gyro data here, so let's push it down
  58.          * to the DMP.
  59.          */
  60.         float sens;
  61.         unsigned short accel_sens;
  62.         mpu_get_gyro_sens(&sens);
  63.         gyro[0] = (long)(gyro[0] * sens);
  64.         gyro[1] = (long)(gyro[1] * sens);
  65.         gyro[2] = (long)(gyro[2] * sens);
  66.         dmp_set_gyro_bias(gyro);
  67.         mpu_get_accel_sens(&accel_sens);
  68.         accel[0] *= accel_sens;
  69.         accel[1] *= accel_sens;
  70.         accel[2] *= accel_sens;
  71.         dmp_set_accel_bias(accel);
  72.                 printf("setting bias succesfully ......\r\n");
  73.     }
  74. }



  75. uint8_t buffer[14];

  76. int16_t  MPU6050_FIFO[6][11];
  77. int16_t Gx_offset=0,Gy_offset=0,Gz_offset=0;


  78. /**************************實現函數********************************************
  79. *函數原型:                void  MPU6050_newValues(int16_t ax,int16_t ay,int16_t az,int16_t gx,int16_t gy,int16_t gz)
  80. *功  能:            將新的ADC數據更新到 FIFO數組,進行濾波處理
  81. *******************************************************************************/

  82. void  MPU6050_newValues(int16_t ax,int16_t ay,int16_t az,int16_t gx,int16_t gy,int16_t gz)
  83. {
  84. unsigned char i ;
  85. int32_t sum=0;
  86. for(i=1;i<10;i++){        //FIFO 操作
  87. MPU6050_FIFO[0][i-1]=MPU6050_FIFO[0][i];
  88. MPU6050_FIFO[1][i-1]=MPU6050_FIFO[1][i];
  89. MPU6050_FIFO[2][i-1]=MPU6050_FIFO[2][i];
  90. MPU6050_FIFO[3][i-1]=MPU6050_FIFO[3][i];
  91. MPU6050_FIFO[4][i-1]=MPU6050_FIFO[4][i];
  92. MPU6050_FIFO[5][i-1]=MPU6050_FIFO[5][i];
  93. }
  94. MPU6050_FIFO[0][9]=ax;//將新的數據放置到 數據的最后面
  95. MPU6050_FIFO[1][9]=ay;
  96. MPU6050_FIFO[2][9]=az;
  97. MPU6050_FIFO[3][9]=gx;
  98. MPU6050_FIFO[4][9]=gy;
  99. MPU6050_FIFO[5][9]=gz;

  100. sum=0;
  101. for(i=0;i<10;i++){        //求當前數組的合,再取平均值
  102.    sum+=MPU6050_FIFO[0][i];
  103. }
  104. MPU6050_FIFO[0][10]=sum/10;

  105. sum=0;
  106. for(i=0;i<10;i++){
  107.    sum+=MPU6050_FIFO[1][i];
  108. }
  109. MPU6050_FIFO[1][10]=sum/10;

  110. sum=0;
  111. for(i=0;i<10;i++){
  112.    sum+=MPU6050_FIFO[2][i];
  113. }
  114. MPU6050_FIFO[2][10]=sum/10;

  115. sum=0;
  116. for(i=0;i<10;i++){
  117.    sum+=MPU6050_FIFO[3][i];
  118. }
  119. MPU6050_FIFO[3][10]=sum/10;

  120. sum=0;
  121. for(i=0;i<10;i++){
  122.    sum+=MPU6050_FIFO[4][i];
  123. }
  124. MPU6050_FIFO[4][10]=sum/10;

  125. sum=0;
  126. for(i=0;i<10;i++){
  127.    sum+=MPU6050_FIFO[5][i];
  128. }
  129. MPU6050_FIFO[5][10]=sum/10;
  130. }

  131. /**************************實現函數********************************************
  132. *函數原型:                void MPU6050_setClockSource(uint8_t source)
  133. *功  能:            設置  MPU6050 的時鐘源
  134. * CLK_SEL | Clock Source
  135. * --------+--------------------------------------
  136. * 0       | Internal oscillator
  137. * 1       | PLL with X Gyro reference
  138. * 2       | PLL with Y Gyro reference
  139. * 3       | PLL with Z Gyro reference
  140. * 4       | PLL with external 32.768kHz reference
  141. * 5       | PLL with external 19.2MHz reference
  142. * 6       | Reserved
  143. * 7       | Stops the clock and keeps the timing generator in reset
  144. *******************************************************************************/
  145. void MPU6050_setClockSource(uint8_t source){
  146.     IICwriteBits(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_CLKSEL_BIT, MPU6050_PWR1_CLKSEL_LENGTH, source);

  147. }

  148. /** Set full-scale gyroscope range.
  149. * @param range New full-scale gyroscope range value
  150. * @see getFullScaleRange()
  151. * @see MPU6050_GYRO_FS_250
  152. * @see MPU6050_RA_GYRO_CONFIG
  153. * @see MPU6050_GCONFIG_FS_SEL_BIT
  154. * @see MPU6050_GCONFIG_FS_SEL_LENGTH
  155. */
  156. void MPU6050_setFullScaleGyroRange(uint8_t range) {
  157.     IICwriteBits(devAddr, MPU6050_RA_GYRO_CONFIG, MPU6050_GCONFIG_FS_SEL_BIT, MPU6050_GCONFIG_FS_SEL_LENGTH, range);
  158. }

  159. /**************************實現函數********************************************
  160. *函數原型:                void MPU6050_setFullScaleAccelRange(uint8_t range)
  161. *功  能:            設置  MPU6050 加速度計的最大量程
  162. *******************************************************************************/
  163. void MPU6050_setFullScaleAccelRange(uint8_t range) {
  164.     IICwriteBits(devAddr, MPU6050_RA_ACCEL_CONFIG, MPU6050_ACONFIG_AFS_SEL_BIT, MPU6050_ACONFIG_AFS_SEL_LENGTH, range);
  165. }

  166. /**************************實現函數********************************************
  167. *函數原型:                void MPU6050_setSleepEnabled(uint8_t enabled)
  168. *功  能:            設置  MPU6050 是否進入睡眠模式
  169.                                 enabled =1   睡覺
  170.                             enabled =0   工作
  171. *******************************************************************************/
  172. void MPU6050_setSleepEnabled(uint8_t enabled) {
  173.     IICwriteBit(devAddr, MPU6050_RA_PWR_MGMT_1, MPU6050_PWR1_SLEEP_BIT, enabled);
  174. }

  175. /**************************實現函數********************************************
  176. *函數原型:                uint8_t MPU6050_getDeviceID(void)
  177. *功  能:            讀取  MPU6050 WHO_AM_I 標識         將返回 0x68
  178. *******************************************************************************/
  179. uint8_t MPU6050_getDeviceID(void) {

  180.     IICreadBytes(devAddr, MPU6050_RA_WHO_AM_I, 1, buffer);
  181.     return buffer[0];
  182. }

  183. /**************************實現函數********************************************
  184. *函數原型:                uint8_t MPU6050_testConnection(void)
  185. *功  能:            檢測MPU6050 是否已經連接
  186. *******************************************************************************/
  187. uint8_t MPU6050_testConnection(void) {
  188.    if(MPU6050_getDeviceID() == 0x68)  //0b01101000;
  189.    return 1;
  190.            else return 0;
  191. }

  192. /**************************實現函數********************************************
  193. *函數原型:                void MPU6050_setI2CMasterModeEnabled(uint8_t enabled)
  194. *功  能:            設置 MPU6050 是否為AUX I2C線的主機
  195. *******************************************************************************/
  196. void MPU6050_setI2CMasterModeEnabled(uint8_t enabled) {
  197.     IICwriteBit(devAddr, MPU6050_RA_USER_CTRL, MPU6050_USERCTRL_I2C_MST_EN_BIT, enabled);
  198. }

  199. /**************************實現函數********************************************
  200. *函數原型:                void MPU6050_setI2CBypassEnabled(uint8_t enabled)
  201. *功  能:            設置 MPU6050 是否為AUX I2C線的主機
  202. *******************************************************************************/
  203. void MPU6050_setI2CBypassEnabled(uint8_t enabled) {
  204.     IICwriteBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_I2C_BYPASS_EN_BIT, enabled);
  205. }

  206. /**************************實現函數********************************************
  207. *函數原型:                void MPU6050_initialize(void)
  208. *功  能:            初始化         MPU6050 以進入可用狀態。
  209. *******************************************************************************/
  210. void MPU6050_initialize(void) {
  211.     MPU6050_setClockSource(MPU6050_CLOCK_PLL_XGYRO); //設置時鐘
  212.     MPU6050_setFullScaleGyroRange(MPU6050_GYRO_FS_2000);//陀螺儀最大量程 +-1000度每秒
  213.     MPU6050_setFullScaleAccelRange(MPU6050_ACCEL_FS_2);        //加速度度最大量程 +-2G
  214.     MPU6050_setSleepEnabled(0); //進入工作狀態
  215.          MPU6050_setI2CMasterModeEnabled(0);         //不讓MPU6050 控制AUXI2C
  216.          MPU6050_setI2CBypassEnabled(0);         //主控制器的I2C與        MPU6050的AUXI2C        直通?刂破骺梢灾苯釉L問HMC5883L
  217. }




  218. /**************************************************************************
  219. 函數功能:MPU6050內置DMP的初始化
  220. 入口參數:無
  221. 返回  值:無
  222. 作    者:平衡小車之家
  223. **************************************************************************/
  224. void DMP_Init(void)
  225. {
  226.    u8 temp[1]={0};
  227.    i2cRead(0x68,0x75,1,temp);
  228.          printf("mpu_set_sensor complete ......\r\n");
  229.         if(temp[0]!=0x68)NVIC_SystemReset();
  230.         if(!mpu_init())
  231.   {
  232.           if(!mpu_set_sensors(INV_XYZ_GYRO | INV_XYZ_ACCEL))
  233.                    printf("mpu_set_sensor complete ......\r\n");
  234.           if(!mpu_configure_fifo(INV_XYZ_GYRO | INV_XYZ_ACCEL))
  235.                    printf("mpu_configure_fifo complete ......\r\n");
  236.           if(!mpu_set_sample_rate(DEFAULT_MPU_HZ))
  237.                    printf("mpu_set_sample_rate complete ......\r\n");
  238.           if(!dmp_load_motion_driver_firmware())
  239.                   printf("dmp_load_motion_driver_firmware complete ......\r\n");
  240.           if(!dmp_set_orientation(inv_orientation_matrix_to_scalar(gyro_orientation)))
  241.                    printf("dmp_set_orientation complete ......\r\n");
  242.           if(!dmp_enable_feature(DMP_FEATURE_6X_LP_QUAT | DMP_FEATURE_TAP |
  243.                 DMP_FEATURE_ANDROID_ORIENT | DMP_FEATURE_SEND_RAW_ACCEL | DMP_FEATURE_SEND_CAL_GYRO |
  244.                 DMP_FEATURE_GYRO_CAL))
  245.                    printf("dmp_enable_feature complete ......\r\n");
  246.           if(!dmp_set_fifo_rate(DEFAULT_MPU_HZ))
  247.                    printf("dmp_set_fifo_rate complete ......\r\n");
  248.           run_self_test();
  249.           if(!mpu_set_dmp_state(1))
  250.                    printf("mpu_set_dmp_state complete ......\r\n");
  251.   }
  252. }
  253. /**************************************************************************
  254. 函數功能:讀取MPU6050內置DMP的姿態信息
  255. 入口參數:無
  256. 返回  值:無
  257. 作    者:平衡小車之家
  258. **************************************************************************/
  259. uint8_t Read_DMP(float* Pitch,float* Roll,float* Yaw)
  260. {        
  261. ……………………

  262. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
6050測試3.rar (598.63 KB, 下載次數: 301)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂3 踩
回復

使用道具 舉報

沙發
ID:158903 發表于 2018-6-21 15:14 | 只看該作者

謝謝分享
回復

使用道具 舉報

板凳
ID:357306 發表于 2018-6-23 16:25 | 只看該作者
高手!謝謝,學習了
回復

使用道具 舉報

地板
ID:361002 發表于 2018-6-28 14:59 | 只看該作者
謝謝分享
回復

使用道具 舉報

5#
ID:425665 發表于 2018-11-13 14:28 | 只看該作者
正好有個項目可以用到這個程序,感謝樓主。
回復

使用道具 舉報

6#
ID:421518 發表于 2019-4-1 09:59 | 只看該作者
謝謝分享。。。。。
回復

使用道具 舉報

7#
ID:430197 發表于 2019-4-2 12:13 | 只看該作者
學習了,謝謝分享
回復

使用道具 舉報

8#
ID:578767 發表于 2019-7-6 01:23 | 只看該作者
學習 學習 謝謝
回復

使用道具 舉報

9#
ID:578767 發表于 2019-7-6 01:24 | 只看該作者
學習了,謝謝分享。。
回復

使用道具 舉報

10#
ID:585663 發表于 2019-7-22 20:39 | 只看該作者
uint8_t buffer[14];

int16_t  MPU6050_FIFO[6][11];
int16_t Gx_offset=0,Gy_offset=0,Gz_offset=0;

請問這段什么意思?實現什么功能
回復

使用道具 舉報

11#
ID:196702 發表于 2019-8-3 00:33 | 只看該作者
感謝樓主。
回復

使用道具 舉報

12#
ID:645237 發表于 2019-11-19 18:25 | 只看該作者
謝謝分享
回復

使用道具 舉報

13#
ID:754694 發表于 2020-8-25 12:57 來自手機 | 只看該作者
好資料,謝謝分享
回復

使用道具 舉報

14#
ID:229821 發表于 2020-9-11 22:47 | 只看該作者
好資料。謝謝樓主的共享精神。
回復

使用道具 舉報

15#
ID:754694 發表于 2020-10-24 21:24 來自手機 | 只看該作者
32到8完美移植,多謝分享
回復

使用道具 舉報

16#
ID:81138 發表于 2021-1-27 15:48 | 只看該作者
不知道電路是如何設計的
回復

使用道具 舉報

17#
ID:928052 發表于 2021-8-8 20:26 | 只看該作者
為什么重復下載,需要重復扣分呢?
回復

使用道具 舉報

18#
ID:767310 發表于 2021-8-26 16:21 | 只看該作者
編譯提示NVIC_SystemReset沒有定義,并且空間不足 ,請問樓主是用哪個型號的STM8芯片
回復

使用道具 舉報

19#
ID:1038866 發表于 2022-7-17 09:05 | 只看該作者
高手!謝謝,學習
回復

使用道具 舉報

20#
ID:189235 發表于 2023-10-14 00:51 | 只看該作者
#在這里快速回復#謝謝分享
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区精品视频 | 成人午夜激情 | 久久精品国产一区 | 男女性毛片 | 成人在线观看中文字幕 | 性色综合 | 国产毛片av | 综合一区| 综合色播 | 久久久国产亚洲精品 | 不卡视频一区二区三区 | 精品免费视频 | 久热精品在线播放 | 国产一级片一区二区三区 | 九九热在线免费视频 | 久久久久久一区 | 成人欧美 | 成人精品一区亚洲午夜久久久 | 亚洲精品一区中文字幕乱码 | 亚洲成av人影片在线观看 | 久久亚洲欧美日韩精品专区 | 中文字幕精品一区二区三区精品 | 久久骚| 中文在线a在线 | 欧美日本一区 | 亚洲 欧美 另类 综合 偷拍 | 日本网站免费观看 | 亚洲一区二区在线播放 | 亚洲欧美一区二区三区国产精品 | 一区精品在线观看 | 伊人色综合久久久天天蜜桃 | 成人一区二区在线 | 国产精品一区二区在线 | 免费在线视频一区二区 | 在线观看免费国产 | 国际精品鲁一鲁一区二区小说 | 狠狠干av| 欧美一区二区三区在线 | 国产精品一区二区三区久久 | 欧美福利网站 | av片在线观看网站 |