在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于STM32的無線飛鼠(二)

            基于STM32的無線飛鼠(二)

            作者: 時間:2016-11-19 來源:網(wǎng)絡 收藏
            在前一篇博客中講了下一些題外話,從本篇開始講講重點的知識,說說無線飛鼠過程用到的模塊

            細說MPU6050

            • 一、 MPU6050簡介
            • 二、 細節(jié)問題
            • 三、 相關技術
            • 四、 操作步驟
            • 五、 實現(xiàn)代碼

            一、 MPU6050簡介

            MPU6050集成了3軸加速度和3軸陀螺儀,是一款不錯的傳感器模塊,可以用在很多方面,比如:四軸飛控、空中鼠標、兩輪平衡車、GPS定位方面、游戲機、3D遙控器、平板設備等等,此模塊給我們提供了強大的數(shù)據(jù)供應,由于將加速度和陀螺儀集成到了一起,免去了組合這兩個模塊時之間的軸差問題,減少了包裝問題,這兩年很火,成了DIY制作者的最愛。

            本文引用地址:http://www.biyoush.com/article/201611/318472.htm

            二、 細節(jié)問題

            在淘寶上買MPU6050時,要注意一下幾點:

            1. 查看賣家給出的介紹信息,是否刻意夸大,結合自己所學的知識進行判斷。比如:當時在某個論壇上看到某位大神將的,tb上說他們的模塊采用高性能的微處理器和先進的動力學解算與卡爾曼動態(tài)濾波算法,能夠快速求解出模塊當前的實時運動姿態(tài)。細心的你就會發(fā)現(xiàn)它的這種處理器根本就不能提供這種需求,也就是會所計算不出來。(STM8是8位的單片機,能做姿態(tài)解算和濾波嗎?)……想了下都有點搞笑.這個論壇上有詳細的解說:http://www.geek-workshop.com/thread-5820-1-1.html
            2. 不要讓模塊受到碰撞,否則會影響他的性能。

            三、相關技術

            MPU6050數(shù)據(jù)是用IIC進行讀取的,So必須學會IIC。類似于USB協(xié)議,不過和USB比起來可以說是小巫見大巫。

            1. IIC技術概述
              IIC 即Inter-Integrated Circuit(集成電路總線),這種總線類型是 由飛利浦半導體公司在八十年代初設計出來的兩線式串行總線
              特點:接口線少、器件封裝形式小、通信速率較高
              IIC總線只有兩根雙向信號線,如下圖所示:
            2. IIC數(shù)據(jù)傳輸
              數(shù)據(jù)有效位的定義:
              ? IIC總線在進行數(shù)據(jù)傳輸時,時鐘信號為高電平期間,數(shù)據(jù)線上的數(shù)據(jù)必須保持穩(wěn)定,只有在時鐘線上的信號為低電平期間,數(shù)據(jù)線的高電平或低電平狀態(tài)才允許變化
              起始和停止條件:
              ? 當SCL線是高電平時,SDA線從高電平向低電平切換,這個情況視為起始條件。
              ? 當SCL線是高電平時,SDA線有低電平向高電平切換,表示停止條件
              數(shù)據(jù)傳輸格式:
            3. IIC總線尋址
              IIC總線規(guī)定:從機地址有第一個字節(jié)的7位組成
              (想要插入表格,可是在這里不會用了,直接從world中截張圖算了)

            4. IIC總線編號
              從機的地址有固定部分和可編程部分組成。在一個系統(tǒng)中可能希望接入多個相同的從機,從機地址中科編程部分決定了可接入總線該類期間的最大數(shù)目

              例如:一個從機的7位尋址中有4為是固定的,3位是可編程的,那個這時僅能尋址8個同類期間。

            5. STM32F103中的IIC
              這里主要看下載STM32中,IIC是怎么個分布:


            四、操作步驟

            1. 熟悉MPU6050管腳


              上圖是我自己的模塊,由于連上了線,管腳不是很清楚,可以看著一張,管腳和清楚的。
            2. 管腳功能介紹

              這里已經(jīng)很詳細的介紹了各個管腳的功能,在心里就有個大概了解,在后面編寫代碼中就會明白好多,更多細節(jié)可以查看手冊的!

            五、實現(xiàn)代碼

            當時開始做這個東西的時候參考了原子、野火的各個例子,再次感謝你們。

            代碼塊

            MPU初始化:

            void MPU_Init(){ANBT_I2C_Configuration();       //IIC初始化delay_ms(30);AnBT_DMP_MPU6050_Init();        //MPU6050 的DMP初始化}

            下邊是讀取陀螺儀的數(shù)據(jù)函數(shù):

            void Read_Gyro_data(short *rxbuf){unsigned long sensor_timestamp;unsigned char i = 0;short gyro[3], accel[3], sensors;//陀螺儀存放數(shù)組,加速度存放數(shù)組,返回狀態(tài)量unsigned char more;long quat[4];       //四元數(shù)存放數(shù)組dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors,&more);if(sensors & INV_WXYZ_QUAT){rxbuf[0] = gyro[0];rxbuf[1] = gyro[1];rxbuf[2] = gyro[2];printf("rnRead_Gyro_data gyro:rn");for (i = 0; i < 3; i++){printf(" %d ",gyro[i]);}printf("rn");}}

            其實參考了圓點博士的開源代碼的,看了下匿名四軸下位機協(xié)議,當初試了下自己獲取的數(shù)據(jù)是否正確,很不錯的,下面是匿名的協(xié)議:

            /** 函數(shù)名:Data_Send_Status* 描述  :數(shù)據(jù)發(fā)送 傳感器  的狀態(tài)根據(jù)匿名四軸最新上位機編寫的顯示姿態(tài)的程序* 輸入  :Pitch:俯仰角Roll :橫滾角Yaw  :航向角gyro :陀螺儀accel:加速度* 輸出  :* 調用  :*/ void Data_Send_Status(float Pitch,float Roll,float Yaw,int16_t *gyro,int16_t *accel){unsigned char i = 0;unsigned char j = 0;unsigned char _cnt = 0,sum = 0;unsigned int _temp;u8 data_to_send[12] = {0};      //發(fā)送數(shù)組,初始化為0data_to_send[_cnt++] = 0xAA;    // 幀頭 170data_to_send[_cnt++] = 0xAA;    //      170data_to_send[_cnt++] = 0x01;    // 功能字 1data_to_send[_cnt++] = 0;       // 長度   0//橫滾角_temp = (int)(Roll * 100);   data_to_send[_cnt++] = BYTE1(_temp);  // 高 8 位data_to_send[_cnt++] = BYTE0(_temp);  // 低8位//俯仰角_temp = 0 - (int)(Pitch * 100);data_to_send[_cnt++] = BYTE1(_temp);data_to_send[_cnt++] = BYTE0(_temp);//航向角_temp = (int)(Yaw * 100);data_to_send[_cnt++] = BYTE1(_temp);data_to_send[_cnt++] = BYTE0(_temp);data_to_send[3] = _cnt - 4;     //數(shù)據(jù)長度//和校驗for(i = 0;i < _cnt;i++)sum += data_to_send[i];data_to_send[_cnt++] = sum;data_to_send[_cnt++] =