完整論文下載:
3D計步器的設計.docx
(72.79 KB, 下載次數: 16)
2017-4-21 11:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
預覽:
0.png (93.66 KB, 下載次數: 54)
下載附件
2017-4-22 00:36 上傳
1人體跳躍模型
人體跳躍時的行為可以通過很多參數來描述,但不同的參數反映著不同的方面,本文主要是測量人跳躍次數,以達到及時了解自己每日跳躍次數及運動量并進行及時調節和鍛煉的目的,人跳躍的行為可以通過距離、速度、加速度等參數來描述,不同的參數有著不同的精確度,通過檢測人跳躍時的加速度信號可以有效的獲得步數信息。而人跳躍時在水平前向、側向和垂直方向上都有加速度,如下圖所示:
圖1 人體跳躍模擬圖
2 MMA7260結構與原理
本設計采用MMA7260來測量人體跳躍時的三維加速度信號。MMA7260是美國Freescale公司的一款低成本單芯片三軸高靈敏度加速度傳感器,是一種電容式的加速度傳感器,融合了信號調理、單極低通濾波器和溫度補償技術,并且具有4種不同的高靈敏度選擇模式,MMA7260的功能如下圖所示,X、Y、Z三個相互垂直方
向上的加速度有G-Cell傳感器單元感知,經過容壓變換器、增益放大、濾波器和溫度補償后以電壓信號輸出。
圖 2 MMA7260功能框圖
3 LCD(JHD12864F)功能結構
JHD12864F是一種具有4位/8位并行、2線或3線串行多種接口方式,內部含有簡體中文字庫的點陣圖形液晶顯示模塊;其顯示分辨率為128×64,內置8192個16*16點漢字,和128個16*8點ASCII字符集.利用該模塊靈活的接口方式和簡單、方便的操作指令,可構成全中文人機交互圖形界面。可以顯示8×4行16×16點陣的漢字,也可完成圖形顯示。
4 硬件設計
電子計步器的硬件結構框圖如下:它由傳感器檢測模塊和單片機控制模塊組成。
圖 3 MMA7260的輸出管腳圖
傳感器模塊是由MMA7260來對人體跳躍時的加速度信號進行檢測,其XYZ軸分別對人體跳躍時在水平前向、側向和垂直方向上產生的加速度信號進行檢測,能夠提高對人體行走時加速度信號的測量精度,另外可以在此模擬輸出腳上接上電容和電阻形成低通濾波器對高頻噪音和干擾信號進行濾波,從而減小測量誤差。
控制模塊主要對加速度信號進行讀取和顯示步數信息。ATmega單片機的PA0~PA2分別于MMA7260的三軸XYZ輸出端口相連接(如上圖所示),對傳感器檢測到的加速度信號進行采樣和A/D轉換,經過微控制器相關算法得出人體跳躍時的步數,并將該步數信號通過LCD液晶顯示屏進行顯示,同時可通過按鍵對LCD進行顯示、關閉和清零等操作。相關圖如下:
圖 4 單片機與LCD接線圖
5 軟件設計
在獲取加速度信號時,采樣頻率的選擇很重要。采樣頻率過低,不能準確反映數據變化的情況。采樣頻率過高,則會引入很多無關的信息,增加了系統的運算量,影響反應速度。需要根據實際情況選擇合適的采樣頻率。而人體跳躍時的頻率一般為110步/每分鐘(即1.8Hz),跑步時也不超過5Hz,本設計設定采樣頻率為10Hz。相關流程圖:
3D計步器部分程序 - #include "reg51.h"
- #include "intrins.h"
- #include <math.h>
- #include <stdio.h>
- #define FOSC 18432000L
- #define FOSC 11059200L //晶振 11.0592M
- #define BAUD 9600 typedef unsigned char BYTE; typedef unsigned int WORD;
- #define uchar unsigned char uint unsigned int
- /*Declare SFR associated with the ADC */
- sfr AUXR1 = 0XA2; sfr ADC_CONTR = 0xBC; //ADC control register sfr ADC_RES = 0xBD; //ADC high 8-bit result register sfr ADC_RESL = 0xBE;
- sfr ADC_LOW2 = 0xBE; //ADC low 2-bit result register
- sfr P1ASF = 0x9D; //P1 secondary function control register /*Define ADC operation const for ADC_CONTR*/
- #define ADC_POWER 0x80 //ADC power control bit
- #define ADC_FLAG 0x10 //ADC complete flag
- #define ADC_START 0x08 //ADC start control bit
- #define ADC_SPEEDLL 0x00 //420 clocks
- #define ADC_SPEEDL 0x20 //280 clocks
- #define ADC_SPEEDH 0x40 //140 clocks #define ADC_SPEEDHH 0x60 //70 clocks void InitUart();
- void InitADC();
- void SendData(BYTE dat);
- int GetADCResult(BYTE ch);
- void Delay(WORD n);
- uchar ge,shi,bai,qian,wan;
- Voidconversion(uint temp_data) { wan=temp_data/10000+0x30 ; temp_data=temp_data%10000; qian=temp_data/1000+0x30 ; temp_data=temp_data%1000; bai=temp_data/100+0x30 ; temp_data=temp_data%100; shi=temp_data/10+0x30 ; temp_data=temp_data%10; ge=temp_data+0x30; }
- //顯示變量
- //取余運算 //取余運算 //取余運算 //取余運算
- /*---------------------------Get ADC result ----------------------------*/
- int GetADCResult(BYTE ch) { int AD10bitResult; ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START; _nop_(); //Must wait before inquiry _nop_(); _nop_(); _nop_();
- while (!(ADC_CONTR & ADC_FLAG));//Wait complete
- flag ADC_CONTR &= ~ADC_FLAG; //Close ADC AD10bitResult=ADC_RES;
- AD10bitResult<<=8; AD10bitResult|=ADC_RESL; return AD10bitResult;
- //Return 10BIT ADC result
- } /*---------------------------Initial UART ----------------------------*/ void InitUart() { SCON = 0x5a; //8 bit data ,no parity bit TMOD = 0x20; //T1 as 8-bit auto reload TH1 = TL1 = -(FOSC/12/32/BAUD); //Set Uart baudrate TR1 = 1; //T1 start running }
-
- /*---------------------------Initial ADC sfr ----------------------------*/ void InitADC() { P1ASF = 0xff;
- //Open 8 channels ADC function
- AUXR1=AUXR1|0X04; //ad 值左對齊
- ADC_RES = 0; //Clear previous result
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL; Delay(2); //ADC power-on and delay } /*---------------------------Send one byte data to PC Input: dat (UART data) Output:----------------------------*/
- void SendData(BYTE dat) { while (!TI); TI = 0; SBUF = dat; } /*---------------------------Software delay function ----------------------------*/
- void Delay(WORD n) { WORD x; while (n--) { x = 5000; while (x--); } } //***************************************************************************** * void main()
- //Wait for the previous data is sent //Clear TI flag //Send current data
- {
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
|