STM32f429I discovery MEMS 範例修改心得

108 views
Skip to first unread message

wei...@gmail.com

unread,
Jul 16, 2014, 11:44:17 AM7/16/14
to stm...@googlegroups.com
週一剛拿到新買的 STM32f429I discovery, 這兩天利用空閒時間把開發環境準備好, 開始接觸 ARM 核心的處理器.

把官方提供的 MEMS 範例帶出來, 我對陀螺儀的用途還是不是很明白, 只知道箭頭會指出板子傾斜的方向, 所以對該範例做點修改, 希望直接在板子上顯示數字化的陀螺儀數值, 來幫助自己搞懂陀螺儀, 也順便熟悉開發環境, 這裡記錄一下修改步驟希望能幫助像我一樣剛接觸的人快一點上手.

修改步驟:
註:以下所有修改都只動到 main.c

1. 在 include 區塊增加兩個標準函示庫.

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include <stdio.h> // 新增
#include <string.h> // 新增

2. 在 Demo_MEMS(void) 函式裡新增兩個變數.

static void Demo_MEMS(void)
{
char str_convert_buffer[16]; // 新增
char str_output_buffer[32]; // 新增
...

str_convert_buffer 是用來暫存數字轉換出的字串.
str_output_buffer 是用來輸出文字到 LCD 上的.

3. 註解掉整個 if ( Xval>Yval) 判斷式內容.
這個區塊是用來在 LCD 上以箭頭顯示陀螺儀是向哪個方向傾斜, 現在我們打算直接看數字化的資訊, 所以註解掉這區塊.
"if ( Xval>Yval)"在整個專案裡只出現一次, 以關鍵字搜尋應該不難找.

4. 在步驟3的後方增加下列程式碼:
// Show X-AXIS.
strcpy( str_output_buffer, "X-AXIS: ");
sprintf( str_convert_buffer, "%-4.3f", Buffer[0]);
strcat( str_output_buffer, str_convert_buffer);
LCD_ClearLine(LINE(1));
LCD_DisplayStringLine( LINE(1), (uint8_t*)str_output_buffer);

// Show Y-AXIS.
strcpy( str_output_buffer, "Y-AXIS: ");
sprintf( str_convert_buffer,"%-4.3f",Buffer[1]);
strcat( str_output_buffer, str_convert_buffer);
LCD_ClearLine(LINE(2));
LCD_DisplayStringLine( LINE(2), (uint8_t*)str_output_buffer);

// Show Z-AXIS.
strcpy( str_output_buffer, "Z-AXIS: ");
sprintf( str_convert_buffer,"%-4.3f",Buffer[2]);
strcat( str_output_buffer, str_convert_buffer);
LCD_ClearLine(LINE(3));
LCD_DisplayStringLine( LINE(3), (uint8_t*)str_output_buffer);

// Delay for next display.
Delay(50);

這部分用來顯示數字化的陀螺儀 X軸 Y軸 及 Z軸 資訊, 三段程式碼都很類似, 下面是簡單的說明:

在 void Demo_MEMS(void) 的開始執行了 Demo_GyroReadAngRate(Buffer); 函式的呼叫, 這個函式會將
陀螺儀的三軸資訊存在 Buffer 裡, X軸為 Buffer[0], Y軸為 Buffer[1], Z軸為 Buffer[2], Buffer 的
資料型態是 float.

A. 用 strcpy( str_output_buffer, "?-AXIS: "); 將想顯示的軸號寫入 str_output_buffer.
B. 以 sprintf( str_convert_buffer,"%-4.3f",Buffer[?]); 將 float 型態的 buffer[?] 內容轉成 char* 型態
的字串.
C. 以 strcat( str_output_buffer, str_convert_buffer); 串接軸號與軸值.
D. 呼叫 LCD_ClearLine(LINE(?)); 清除指定行數上的文字.
E. 呼叫 LCD_DisplayStringLine( LINE(?), (uint8_t*)str_output_buffer); 在指定行數上顯示上面處理好的字串 str_output_buffer.

5. 重新 Builde 專案並開始 debug.
6. 以 LCD 顯示的文字為準:
當板子向前傾X軸為負, 當板子向後傾X軸為正.
當板子向左傾Y軸為負, 當板子向右傾Y軸為正.
當板子順時鐘旋轉Z軸為負, 當板子逆時鐘旋轉Z軸為正.
陀螺儀顯示的是"當下"的傾斜狀態, 所以當把板子傾斜後穩定一段時間, 陀螺儀的讀數會全變為 0.

最後順便請教一下, 像是範例提供的 LCD_ClearLine() 之類的函式, 有沒有文件可以查? 像這次花了很多時間用在從 stm32f429i_discovery_lcd.h
去挖出可以用的函式, 函式功能跟參數也都是一邊看程式碼一邊猜要怎麼用, 實在是有點沒效率.

Bee

unread,
Jul 16, 2014, 9:06:59 PM7/16/14
to stm...@googlegroups.com, wei...@gmail.com
查ST gui library

Bee

unread,
Jul 16, 2014, 9:11:06 PM7/16/14
to stm...@googlegroups.com, wei...@gmail.com
現在用32位元MCU,使用函式庫是重點。除了ST 週邊函式庫外。
包括有RTOS, GUI Library, File system等等都是用別人的。所以找函式庫能力很重要。

葉俊傑

unread,
Jul 16, 2014, 9:40:50 PM7/16/14
to stm...@googlegroups.com, wei...@gmail.com
您好,

在這裡提供點資訊給您,在一般多軸感測器中,不外乎採用了3軸的磁/加速規/陀螺儀
的,
1。磁:感測週邊磁場
2。加速規:感測加速度
3。陀螺儀:感測角速率

所以您在靜止時,由於角度率為0,所以讀數為0,但是它並不是感測傾斜角,這一點要注意。
傾斜角度,一般是用加速規去做量測,因為在地球上會有約1G的重力加速度,所以可以透過
3角函數的方式,去計算傾斜角度。

wei...@gmail.com於 2014年7月16日星期三UTC+8下午11時44分17秒寫道:
Reply all
Reply to author
Forward
0 new messages