wei...@gmail.com
unread,Jul 16, 2014, 11:44:17 AM7/16/14Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
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
去挖出可以用的函式, 函式功能跟參數也都是一邊看程式碼一邊猜要怎麼用, 實在是有點沒效率.