找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2950|回复: 0
打印 上一主题 下一主题
收起左侧

3D计步器的设计论文下载

[复制链接]
跳转到指定楼层
楼主
完整论文下载:
3D计步器的设计.docx (72.79 KB, 下载次数: 16)


预览:


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计步器部分程序
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #include <math.h>               
  4. #include <stdio.h>            
  5. #define FOSC 18432000L
  6. #define FOSC 11059200L          //晶振 11.0592M
  7. #define BAUD 9600 typedef unsigned char BYTE; typedef unsigned int WORD;
  8. #define uchar unsigned char uint unsigned int

  9. /*Declare SFR associated with the ADC */
  10. sfr AUXR1 = 0XA2; sfr ADC_CONTR = 0xBC; //ADC control register sfr ADC_RES = 0xBD; //ADC high 8-bit result register sfr ADC_RESL = 0xBE;
  11. sfr ADC_LOW2 = 0xBE; //ADC low 2-bit result register
  12. sfr P1ASF = 0x9D; //P1 secondary function control register /*Define ADC operation const for ADC_CONTR*/
  13. #define ADC_POWER 0x80 //ADC power control bit
  14. #define ADC_FLAG 0x10 //ADC complete flag
  15. #define ADC_START 0x08 //ADC start control bit
  16. #define ADC_SPEEDLL 0x00 //420 clocks
  17. #define ADC_SPEEDL 0x20 //280 clocks
  18. #define ADC_SPEEDH 0x40 //140 clocks #define ADC_SPEEDHH 0x60 //70 clocks void InitUart();
  19. void InitADC();
  20. void SendData(BYTE dat);
  21. int GetADCResult(BYTE ch);
  22. void Delay(WORD n);
  23. uchar ge,shi,bai,qian,wan;
  24. 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; }

  25. //显示变量

  26. //取余运算 //取余运算 //取余运算 //取余运算

  27. /*---------------------------Get ADC result ----------------------------*/
  28. int GetADCResult(BYTE ch) { int AD10bitResult; ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START; _nop_(); //Must wait before inquiry _nop_(); _nop_(); _nop_();
  29. while (!(ADC_CONTR & ADC_FLAG));//Wait complete
  30. flag ADC_CONTR &= ~ADC_FLAG; //Close ADC AD10bitResult=ADC_RES;
  31. AD10bitResult<<=8; AD10bitResult|=ADC_RESL; return AD10bitResult;

  32. //Return 10BIT ADC result

  33. } /*---------------------------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 }


  34. /*---------------------------Initial ADC sfr ----------------------------*/ void InitADC() { P1ASF = 0xff;

  35. //Open 8 channels ADC function

  36. AUXR1=AUXR1|0X04; //ad 值左对齐
  37. ADC_RES = 0; //Clear previous result
  38. ADC_CONTR = ADC_POWER | ADC_SPEEDLL; Delay(2); //ADC power-on and delay } /*---------------------------Send one byte data to PC Input: dat (UART data) Output:----------------------------*/
  39. void SendData(BYTE dat) { while (!TI); TI = 0; SBUF = dat; } /*---------------------------Software delay function ----------------------------*/
  40. void Delay(WORD n) { WORD x; while (n--) { x = 5000; while (x--); } } //***************************************************************************** * void main()

  41. //Wait for the previous data is sent //Clear TI flag //Send current data

  42. {

  43. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表