四軸飛行器1.3 MPU6050(大端)和M4的FPU開啟方法

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   使用   os   io   

四軸飛行器1.3 MPU6050(大端)和M4的FPU開啟方法
 原創文章,歡迎轉載,轉載請註明出處
      最近時間花在最多的地方就是STM32的I2C上了。之前就知道STM32的I2C並不好用,因為之前用過類比的I2C,也寫過AVR的I2C也就是TWI的硬體驅動,所以想試試寫STM32的硬體I2C。。。為了避免庫帶來的麻煩,之前和特意將STM32F4的標準庫升級到了1.3.0,但是貌似問題依舊。於是在網上找到了ST轉為I2C寫的CPAL的庫,拿著它的英文手冊和例子看了下,覺得很不錯,功能相當的齊全,按照手冊配置用起來應該不錯,於是開始載入到自己的項目中。它需要一個定時器,用來管理逾時,當通訊出現問題的時候,通過這個逾時機制可以見得到,從而可以做一些簡單的處理,它預設用的是systick中斷,這個好辦啊,用RTT的一個線程來替代systick或者用另外一個定時器就可以了,它還有一個要求,需要用到I2C相關的兩個中斷設定為最高優先順序,雖然覺得優點不舒服哈,但是只能這樣設定了,其實STM32中I2C的硬體缺陷就在這,需要第一時間響應I2C中斷,否則就可能出現問題,就算自己寫STM32的I2C,這兩個中斷優先順序也需要設定的很高,可是之後發現了一個我認為可能接受不了的東西,就是在中斷裡面有一個宏,__CPAL_I2C_TIMEOUT ,定義如下
 1 #define __CPAL_I2C_TIMEOUT_DETECT                ((pDevInitStruct->wCPAL_Timeout == CPAL_I2C_TIMEOUT_MIN) || 2                                                  (pDevInitStruct->wCPAL_Timeout == CPAL_I2C_TIMEOUT_DEFAULT)) 3  4 #define __CPAL_I2C_TIMEOUT(cmd, timeout)         pDevInitStruct->wCPAL_Timeout = CPAL_I2C_TIMEOUT_MIN + (timeout); 5                                                  while (((cmd) == 0) && (!__CPAL_I2C_TIMEOUT_DETECT)); 6                                                  if (__CPAL_I2C_TIMEOUT_DETECT) 7                                                  { 8                                                    return CPAL_I2C_Timeout (pDevInitStruct);  9                                                  }10                                                  pDevInitStruct->wCPAL_Timeout = CPAL_I2C_TIMEOUT_DEFAULT 

也就是說,這個CPAL庫需要試用最高優先順序的中斷,而且在最高優先順序的中斷裡面有個while,這可是最高優先順序中斷好麼,我其他的中斷還要不要響應了?RTT的線程調度還能不能愉快的調度了?積分還能不能在正確的時間內完成了, 積分出來的資料會不會漂的更厲害?果斷棄之。。
      放棄CPAL庫後,還有三個選擇,買的板子是有寫好的I2C的硬體庫的,沒有開源,為了快點做出來,就用他的庫吧,當放進來編譯好沒錯誤後,下到板子裡面運行,發現會卡死。。用不了。。當時不知道什麼問題,後來想應該是沒有用c99的原因,MDK預設是c89。還有兩個選擇,自己寫硬體I2C或者用簡單暴力的類比I2C。。。折騰了好幾天,進度太慢,我們首要任務是先飛起來,後面慢慢改,於是決定用類比I2C,只要好點封裝起來,後面把寫好的更好的I2C放進去還是很容易的。
     類比I2C就不多說了, 說下MPU6050吧。。。MPU6050網路上的資料那是非常的多,設定什麼的都比較簡單,我比較懶哈,沒用FIFO,懶得設定,就打算從0x3B移植讀到0X48,把所有資料讀出來,簡單的方法就是一個byte一個byte的讀出來,然後強制轉換成U16格式的再進行計算就可以了,可是這真的行得通嗎?用union測試了下,STM32F4的是小端模式,也就是說資料的低位儲存在記憶體的低地址中,而資料的高位儲存在記憶體的高地址中,可是看看MPU6050的手冊,你會發現它是大端模式,資料的低位儲存在記憶體的高地址中,而資料的高位,儲存在記憶體的低地址中。如:

如果全部順序讀出來,LSB和MSB是反的,要轉換一次。。於是又懶了,I2C連續讀都已經寫好了,但是不用算了,利用struct和union解決這個問題好了,用如下的方式定義一個struct和union的混合結構:

 1 typedef struct 2 { 3 union  4 { 5 struct  6 { 7       u8 data_L;    8   u8 data_H; 9 } b;10 u16 data;11 } acce_x;12 union 13 {14 struct 15 {16       u8 data_L;17   u8 data_H;18 } b;19 u16 data;20 } acce_y;21 union 22 {23 struct 24 {25       u8 data_L;26   u8 data_H;27 } b;28 u16 data;29 } acce_z;30 31 union 32 {33 struct 34 {35   u8 data_L;36   u8 data_H;37 } b;38 u16 data;39 } temp;40 41 union 42 {43 struct 44 {45   u8 data_L;46   u8 data_H;47 } b;48 u16 data;49 } gyro_x;50 union 51 {52 struct 53 {54   u8 data_L;55   u8 data_H;56 } b;57 u16 data;58 } gyro_y;59 union 60 {61 struct 62 {63   u8 data_L;64   u8 data_H;65 } b;66 u16 data;67 } gyro_z;68 69 }MPU6050_DATA_T;
View Code

讀資料的時候就容易了,一個位元組一個位元組的讀,例如讀ACCX的高位元組,讀到mpu6050_data_t->acce_x.b.data_H中, 低位元組讀到mpu6050_data_t->acce_x.b.data_L中,而我們取資料的時候用mpu6050_data_t.acce_x.data就可以了,不需要進行LSB和MSB的資料轉換了,哈,懶人用懶人的方法,不過這個方法畢竟效率不高,等飛機飛起來再改。。哈。。
讀到的資料如下:

好像gyro_z的資料有點問題哈,後面再細看下,這些數值都是沒有處理過的,裸資料,還要根據我們選的配量來進行轉換才行。。

以前用過lsm303dlh算出過姿態資料的哈,就是反三角函數算,用的場合不一樣,資料也沒有濾波什麼的,就這樣算了。。這裡終點是我們要用到反三角函數,M4可是帶FPU的,不用白不用。。用了速度快很多。。哈。。開啟FPU。。需要下面幾個步驟:
在SystemIni 中有如下一句話

1   /* FPU settings ------------------------------------------------------------*/2   #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)3     SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */4   #endif

所以第一步需要設定這兩個宏,__FPU_PRESENT,__FPU_USED,尋找一番,發現在STM32F4XX.h中

1 #define __MPU_PRESENT             1       /*!< STM32F4XX provides an MPU                    2 #define __FPU_PRESENT             1       /*!< FPU present 已經定義好了
如果我們需要用到FPU,我們需要使用ARM為我們提供的數學函數,我們需要包涵arm_math.h標頭檔,
還需要添加arm_cortexMxx_math.lib到工程檔案中,位於\Libraries\CMSIS\Lib\ARM中。


   * The library installer contains prebuilt versions of the libraries in the <code>Lib</code> folder.
   * - arm_cortexM4lf_math.lib (Little endian and Floating Point Unit on Cortex-M4)
   * - arm_cortexM4bf_math.lib (Big endian and Floating Point Unit on Cortex-M4)
   * - arm_cortexM4l_math.lib (Little endian on Cortex-M4)
   * - arm_cortexM4b_math.lib (Big endian on Cortex-M4)
   * - arm_cortexM3l_math.lib (Little endian on Cortex-M3)
   * - arm_cortexM3b_math.lib (Big endian on Cortex-M3)
   * - arm_cortexM0l_math.lib (Little endian on Cortex-M0)

   * - arm_cortexM0b_math.lib (Big endian on Cortex-M3) 

STM32F407我們用的是小端模式,並且帶FPU,支援浮點運算的,所以我們要添加的庫是 arm_cortexM4lf_math.lib ,編譯後會發現有錯誤,需要添加 ARM_MATH_CM4宏,好了,一切準備就緒,可以使用M4的FPU了。。哈。。
看一下stm32f40x\Libraries\CMSIS\DSP_Lib\Source目錄,發現有不少檔案,如:解釋看個名字也能直到大概哈,草靠網上的解釋,矩陣計算,濾波函數說不定後面可以用到。。瞬間感覺高大上。。BasicMathFunctions
提供浮點數的各種基本運算函數,如加減乘除等運算。
CommonTables
arm_common_tables.c檔案提供位翻轉或相關參數表。
ComplexMathFunctions
複述數學功能,如向量處理,求模運算的。
ControllerFunctions
控制功能,主要為PID控制函數。arm_sin_cos_f32/-q31.c函數提供360點正餘弦函數表和任意角度的正餘弦函數值計算功能。
FastMathFunctions
快速數學功能函數,提供256點正餘弦函數表和任意任意角度的正餘弦函數值計算功能,和Q值開平方運算:
Arm_cos_f32/_q15/_q31.c:提供256點餘弦函數表和任意角度餘弦值計算功能。
Arm_sin_f32/_q15/_q31.c:提供256點正弦函數表和任意角度正弦值計算功能。
Arm_sqrt_q15/q31.c:提供迭代法計算平方根的函數。對於M4F的平方根運算,通過執行VSQRT指令完成。
FilteringFunctions
濾波函數功能,主要為FIR和LMS(最小均方根)濾波函數。
MatrixFunctions
矩陣處理函數。
StatisticsFunctions
統計功能函數,如求平均值、計算RMS、計算方差/標準差等。
SupportFunctions
支援功能函數,如資料拷貝,Q格式和浮點格式相互轉換,Q任意格式相互轉換。
TransformFunctions
變換功能。包括複數FFT(CFFT)/複數FFT逆運算(CIFFT)、實數FFT(RFFT)/實數FFT逆運算(RIFFT)、和DCT(離散餘弦變換)和配套的初始化函數。   
接下來要做的就是把MPU6050裸資料處理下,傳到matlab進行資料處理了。。要寫matlab的串口咯。。。。  通訊協議也可能開始需要簡單的策划下了,因為後面準備自己通過2401做遙控器的,通訊協議也應該開始考慮了。。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.