毕业设计论文 基于单片机的计步器设计Word文档格式.docx
《毕业设计论文 基于单片机的计步器设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《毕业设计论文 基于单片机的计步器设计Word文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
Abstract
SimpleaccelerationpedometerwithtriaxialaccelerationsensorMMA7260stepmetertestsystemcomposedofMCUPIC18F452,canexerciseanassessmenttothehumanbodymovement.Differentfromthetraditionalmechanicalsensor,sensorMMA7260iscapacitivethreeaxis,byaccelerationsignalwhenitcapturesthehumanbodymovement,moreaccurate.Isfilteredbylow-passfilter,thesinglechipmicrocomputerbuilt-inA/Dconverterforsignalsampling,A/Dconversion.Softwareusingadaptivealgorithmimplementationplanstepfunction,reducetheerrorcount,moreprecise.Single-chipmicrocomputercontrolstep5110liquidcrystaldisplaymeter.Thewholemachineworkingcurrentisonly1-1.5mA,realizeultra-lowpowerconsumption.
Keywords:
SCM,electronicpedometer,triaxialaccelerationsensor
1引言
1.1计步器的发展背景
随着社会的不断进步与发展,人们的物质生活水平不断提高,人们便开始越来越关注自身的健康。
运动则是最好的方式,计步器作为一种可以计算行走的步数测量仪器,所以人们可以制定适量的运动方案来健身,并根据运行情况来分析人体的健康状况,因此越发被广泛的应用。
电子计步器是一种适应市场需求的设计,使用起来也简单方便。
1.2计步器的研究目的
计步器是一种十分受欢迎的日常锻炼进度监控器,可以激励人们挑战自己,能够增强体质,并且帮助减肥瘦身。
早期设计利用加重的机械开关检测步伐,并带有一个简单的计数器。
每当晃动这些装置时,可便以听到有一个金属球来回滑动,或者一个摆锤左右摆动敲击挡块。
1.3目标
通过设计一个以STC89C52单片机为核心的计步器可以实现计频数,频数累计功能。
是一种结构简单、性能稳定、使用方便、价格低廉、智能化的计步器,具有一定的实用价值。
2系统总体设计
2.1总体框图
如图2.1所以,该计步器总共由四个模块构成。
低通滤波器、主控MCU、竖直方向加速度传感器、显示模块组成。
传感器采集数据经低通滤波器滤波,输入单片机内部A/D、D/A,将数据处理后输出液晶显示,加速度传感器的竖直方向的加速度输出,AN0为单片机一个模拟输入口,数据经单片机处理后由液晶输出。
图2.1计步器总体框图
Fig.2.1Pedometeroverallblockdiagram
2.2传感器选择
传统的机械式的计步器利用人体行走时的振动引起计步器内部簧片或者弹力小球的振动来产生电子脉冲,内部处理器通过判断电子脉冲的方法来达到计步的功能。
这种机械式方式的成本比较低,但是它的准确性和灵敏度很低。
DXL330是一个竖直方向模拟输出的加速度传感器,正好可以作为垂直方向的传感器。
利用MEMS(微机电系统)加速度传感器制作工艺,很容易地和传统的CMoS工艺结合起来,服机械式的准确性和灵敏度低的缺点。
MMA7260是美国Freescale公司推盘的一款低成本、单芯片,置轴加速度传感器。
该微型电容式加速度传感器融合了信号调理、单掇低通滤波器和滠度补偿技本,并提供四种加速度范围。
DXL330和MMA7260都是适合于做手持式电子计步器的传感器,但相比之下,MMA7260价格更低,性价比稍好,该设计选择MMA7260。
2.3低通滤波器理论分析
通常来讲,人体每秒钟行走5~2步,最多不超过5步。
因此,合理的计步器输出为0.5~5Hz。
在模拟电路部分,采用5Hz的抗混叠带宽来过滤高频噪声;
在数字电路部分,采用5Hz截止频率的FIR低通滤波器来过滤高频噪声。
FIR低通滤波器参数设计分析:
根据现有资源情况,以及考虑性价比因素,只对信号进行简单的低通滤波。
参考芯片手册资料,选择电阻1kΩ电阻,0.1uF电容构成一个无源低通滤波。
由截止频率
得
=1592Hz。
低通滤波器无法过滤0.5Hz以下的噪声,因此我们采用了时间窗口的方法来实现。
如图2.2所示,我们把大于T1或者小于T2的频率输出都认为是噪声的影响。
图2.2传感器输出曲线图
Fig2.2Sensoroutputcurve
3硬件电路设计
3.1传感器连接及滤波电路模块
如图3.1所示,为传感器底座,接口以及滤波电路图。
在信号通过
输出前通过一阶滤波电路滤波。
图3.1传感器连接及滤波电路
Fig.3.1Sensorconnectionandfiltercircuit
此模块电路主要功能就用于做MMA7260加速度传感器的一个转接口,而且利用MMA7260该加速度传感器产生相应的变化值。
相当于整个系统的信号产生模块。
在MMA7260每一路信号输出端都接了一个RC低能滤波器,从而在硬件上做到减小高频噪声干扰。
3.2微处理器模块
本系统中是以PIC18F452为主控芯片来设计的,区别于一般的MCS-51单片机的总线结构是冯-诺依曼型、单指令流水线结构。
PIC单片机的总线结构是哈佛结构、双指令流水线结构,指令和数据空间是完全分开的,可以对程序和数据同时进行访问,所以提高了数据吞吐率。
也是因为哈弗结构程序和数据总线可以采用不同的宽度,数据总线都是8位的,但指令总线位数分别位12、14、16位。
我们选择的Pic18f452就是数据总线为8位,指令总线为16位的一款单片机。
另外PIC单片机的所有寄存器,包括I/O口,定时器和程序计数器等都采用RAM结构形式,而且都只需要一个指令周期就可以完成访问和操作。
如图3.2所示,主控模块由pic18f452为主要部分,外接一个16M的晶振,接上VCC和地构成最小系统模块。
图3.2主控制器最小系统电路
Fig.3.2Maincontrollerminimumsystemcircuit
3.3显示模块
5110是一块低功耗的CMOSLCD控制驱动器,设计为驱动48行84列的图形显示。
所有必须的显示功能集成在一块芯片上,包括LCD电压及偏置电压发生器,只须很少外部元件且功耗小。
5110与微控制器的接口使用串行总线。
以下是5110主要的几个引脚的功能:
SDIN:
串行数据线
SCLK:
串行时钟线
D/C:
模式选择
SCE:
芯片使能
RES:
复位实时时钟模块
图3.3显示模块
Fig.3.3Displaymodule
如图3.3所示,将SCE与单片机的RD3连接,将RES(RST)连接到单片机的RD4,D/C连接到单片机的RD5引脚,将DIN连接到单片机的RD6,SCLK连接到RC3。
4软件设计
软件总体设计
图4.1程序流程图
Fig.4.1Programflowchart
程序流程图如图4.1所示:
不同的人行走会有不同加速度大小的输出,因此软件中动态参数的设置提供了一种自适应的方法,来满足不同行人的要求。
动态参数包括动态精度、动态阈值以及加速度传感器的峰一峰值的输出。
动态精度是用来量化采样的数据以去除高频的噪声;
动态阈值满足下式就可以判断一步的成立。
OldData>
DynamicThreshold>
NewData。
于是在进入测试后首先进行预采样,进行自适应,获得动态阈值。
软件中量化的模块有两个移位寄存器组成:
新数据寄存器和旧数据寄存器。
新数据寄存器的内容为动态精度和加速度变化值,当加速度变化值大于动态精度时,这时的数据就可以移位到新数据寄存器;
当加速度变化值小于或者等于动态精度时,新数据寄存器保持不变。
旧数据寄存器则不断的更新采样的数据。
为防止不同时间,人体运动状态不同,设置软件每隔50步,重新采样取得阈值,继续计数,同时为防止不同时间的阈值不同产生的误计数,比如人已经停止运动,但是没有按下结束键是,采用前后两次阈值比较,在某一变化范围内认为有效阈值,这样就避免了错误的计数,提高了计数精度。
输入步长,在结束运动时,可以计算运动的里程数,对锻炼量进行评估。
5制作与调试
5.1硬件电路单片机部分的连接图
5.2调试
为了检测计步算法的可行性,我们做了以下实验:
测试系统主电路板及附属电源组成,在实验中本测试系统由测试对象随身携带,全部绑在脚的正左方,像携带沙袋一样。
分别进行多次实验,得到多组数据。
5.3实测及误差分析
测试方案:
由于加速度传感器有竖直加速度测试值,所以测试时采用把传感器按x轴向竖直向上的方法分别进行测量,进行评估。
以每次100步为标准,测试结果如下表5.1所示:
表5.1作品测试结果
Table.5.1Workstestresults
次数
竖直向上
标准
实测
误差
1
100
98
-2
96
-4
97
-3
2
95
-5
103
3
101
4
5
104
6
7
数据分析:
根据数据分析得计步器的精度为95%,精度还是比较不错的,软件算法可能需要继续优化,提高精度。
6结论
结论:
利用人运动时产生加速度变化来检测步数的计步器,在实测时计步器的精度达到95%,这个结果已经比较不错,为了可以较好的实现计步功能。
而且体型小功耗低,工作电流只有1mA-1.5mA,非常适合应用于手持式设备。
这种计步器在人们日常中的应用。
设计过程总结的几点经验:
一、首先弄懂本设计的设计的原理和设计要求,理解各个模块的工作原理。
二、先尽量把硬件做完善,确保硬件各个通路都能正常,以免在调试软件的时候遇到问题不知所措。
三、使用C语言编程要养成良好的编程风建议:
致谢
此次毕业设计能够顺利完成,我的学习生涯也将告一段落。
在此,我要对四年来帮助过我的人表示深深的感谢。
感谢我的指导老师吕集尔老师,一直以来负责又耐心的指导我,并从查阅资料、论文的修改、论文格式调整等各个环节中都给予了我悉心的指导,感谢指导老师和同学们在我做毕业设计的过程中对我的帮助,让我对许多相关知识有了更深层次的了解,也让我养成了积极向上、执着追求目标的好习惯。
参考文献
[1]宋浩然廖文帅赵一鸣.基于加速度传感器ADX543的高精度计步器.传感技术学报,2006,19(4).
[2]赵祥欣.基于三维加速度传感器的跌倒监测研究.硕士学位论文.
[3]曹赟周宇徐寅林.加速度传感器在步态信号采集系统中的应用.信息化研究,2009,35(9).
附录1实物图
附录2总原理图
附录3源程序
voidmain()
{
unsignedinti=0,FirCouFlag=1;
unsignedintdynThreh=600,dynThrel=450;
//三轴方向不同的动态中间阈值
unsignedintdynthreTemph=0,dynthreTempl=0;
//动态中间阈值临时值
intdiff=0;
//采样值与阈值的差值
unsignedcharDiff=0;
//三轴合成特征值数组峰峰值
unsignedlongtempvx=0,tempvy=0,tempvz=0;
//三轴合成特征值运算中间变量
CloseInterKey();
TRIS_KEY0=1;
ad_init();
N5110Init();
init_24xx();
LCD_clear();
//step_length();
WelcomeFace();
Drawnum(0,2,0,1);
Drawnum(1,2,0,1);
Drawnum(2,2,0,1);
Drawnum(3,2,0,1);
DrawStr(5,2,20,24);
//stop
while
(1)
{
if(BUTTON_IO0==0)//进入测试
{
delay(20);
if(BUTTON_IO0==0)
{
tmrCounter=0;
//计时清零
delay(1200);
//秒长延时
SLEEP=1;
//唤醒MMA7260
DrawStr(5,2,15,19);
//Count
}
while
(1)
for(i=0;
i<
300;
i++)
{
ADCON0=0x01;
//选择AN0
tempx=get_ad();
ADCON0=0x09;
//选择AN1
tempy=get_ad();
ADCON0=0x11;
//选择AN2
tempz=get_ad();
//==============计算阈值==================
tempvx=(unsignedlong)tempx*(unsignedlong)tempx;
tempvy=(unsignedlong)tempy*(unsignedlong)tempy;
tempvz=(unsignedlong)tempz*(unsignedlong)tempz;
array[i]=sqrt(tempvx+tempvy+tempvz);
//delay(5);
}
DoMinMaxMid(array,minmax,300);
Diff=minmax[1]-minmax[0];
dynThreh=minmax[0]+0.7*Diff;
dynThrel=minmax[0]+0.4*Diff;
//TimerInit();
InterKeyInit();
//计时清零
if(Diff>
=WalkThreL)
while
(1)
{
for(i=0;
10;
i++)
{
ADCON0=0x01;
tempx=get_ad();
ADCON0=0x09;
tempy=get_ad();
ADCON0=0x11;
//选择AN2
tempz=get_ad();
//delay(20);
tempvx=(unsignedlong)tempx*(unsignedlong)tempx;
tempvy=(unsignedlong)tempy*(unsignedlong)tempy;
tempvz=(unsignedlong)tempz*(unsignedlong)tempz;
diff=sqrt(tempvx+tempvy+tempvz);
while(diff<
=dynThreh)
{
ADCON0=0x01;
tempx=get_ad();
ADCON0=0x09;
//选择AN1
tempy=get_ad();
ADCON0=0x11;
tempz=get_ad();
tempvx=(unsignedlong)tempx*(unsignedlong)tempx;
tempvy=(unsignedlong)tempy*(unsignedlong)tempy;
tempvz=(unsignedlong)tempz*(unsignedlong)tempz;
diff=sqrt(tempvx+tempvy+tempvz);
//delay(10);
}
while(diff>
=dynThrel)
{
tempvx=(unsignedlong)tempx*(unsignedlong)tempx;
if(FirCouFlag==1)
counter=7;
FirCouFlag=0;
else
counter++;
}
Drawnum(0,2,(counter/1000),1);
Drawnum(1,2,(counter%1000/100),1);
Drawnum(2,2,(counter%100/10),1);
Drawnum(3,2,(counter%10),1);
}//endfor
//==================重新计算阈值==============
i<
75;
{
ADCON0=0x01;
tempvx=(unsignedlong)tempx*(unsignedlong)tempx;
array[i]=sqrt(tempvx+tempvy+tempvz);
}
DoMinMaxMid(array,minmax,75);
Diff=minmax[1]-minmax[0];
dynthreTemph=minmax[0]+0.7*Diff;
dynthreTempl=minmax[0]+0.4*Diff;
//adTemp=DoArrayDiffAver(array);
if(Diff>
=WalkThreL&
&
Diff<
=WalkThreH)//判断是否进行阈值替代
counter++;
Drawnum(1,2,(cou