心电课设报告最终版.docx
《心电课设报告最终版.docx》由会员分享,可在线阅读,更多相关《心电课设报告最终版.docx(21页珍藏版)》请在冰豆网上搜索。
心电课设报告最终版
课程设计
心电信号采集模块的设计与开发
姓名
学号
学院信息学院
专业电子科学与技术
年级
指导教师
2013年7月7日
摘要
针对心电信号的特点进行心电信号的采集、数据转换模块的设计与开发。
本文设计一种用于心电信号采集的电路,然后进行A/D转换,使得心电信号的频率达到采样要求。
人体的心电信号是一种低频率的微弱信号,由于心电信号直接取自人体,所以在心电采集的过程中不可避免会混入各种干扰信号。
为获得含有较小噪声的心电信号,需要对采集到的心电信号做降噪处理。
本文通过滤波的方法将噪声从信号中分离。
并将采集到的小信号放大约1000倍,送入数模转换模块,让单片机处理。
关键词:
心电信号采集,降噪,A/D转换放大,电源电路
目录
1.课程设计任务及要求1
1.1设计任务1
1.2设计要求1
2.系统设计1
2.1方案论证1
2.2系统设计2
2.2.1结构框图2
2.2.2系统原理图2
2.3单元电路设计3
2.3.1前置放大及反馈电路3
2.3.2带通滤波电路(高通及低通滤波)3
2.3.350Hz陷波电路4
2.3.4电压放大电路4
2.3.5电平抬升电路5
3.软件部分设计5
3.1开发软件IAR简介5
3.2软件总体设计框图5
3.3软件分步配置:
7
3.3.1配置时钟:
7
3.3.2配置Timer_A0:
8
3.3.3配置ADC10:
9
3.3.4配置LCD1602:
10
3.4软件主程序10
4.调试效果图15
5.结论15
6.参考文献15
课程设计任务及要求
设计任务
⑴了解心电信号特点,设计心电信号调理电路,调理电路包括前端放大和右腿驱动电路、带通滤波和50Hz陷波电路、主放大和电平抬高电路等。
⑵学习MPS430单片机原理,通过对心电信号采集,实现对脉搏率的测量及显示。
⑶焊接相应电路,完成调试。
设计要求
在设计中了解心电信号特点,设计心电信号调理电路,调理电路包括前端放大和右腿驱动电路、带通滤波和50Hz陷波电路、主放大和电平抬高电路等。
系统设计
方案论证
将整个设计分成硬件部分和软件部分,在硬件设计部分又可细分为如下几个部分:
前置放大、带通滤波、陷波、电压放大、电平抬升以及反馈。
根据已有的器件,本设计使用AD620作为前置放大级。
带通滤波部分,分成了高通与低通两部分,为了提高滤波的效果,高通部分采低通部分采用了二阶切比雪夫低通滤波器,带通纹波为3dB。
50Hz滤波陷波电路考虑了Fliege结构点阻滤波器和“双T”型陷波电路,实际焊接后发现后者的效果明显更稳定,故改为采用了“双T”型陷波电路。
系统设计
结构框图
系统原理图
单元电路设计
前置放大及反馈电路
带通滤波电路(高通及低通滤波)
50Hz陷波电路
电压放大电路
电平抬升电路
软件部分设计
本设计软件部分的设计用Msp430Launchpad来实现。
开发软件IAR简介
IARSystems是全球领先的嵌入式系统开发工具和服务的供应商。
公司成立于1983年,提供的产品和服务涉及到嵌入式系统的设计、开发和测试的每一个阶段,包括:
带有C/C++编译器和调试器的集成开发环境(IDE)、实时操作系统和中间件、开发套件、硬件仿真器以及状态机建模工具。
公司总部在北欧的瑞典,在美国、日本、英国、德国、比利时、巴西和中国设有分公司。
它最著名的产品是C编译器-IAREmbeddedWorkbench,支持众多知名半导体公司的微处理器。
许多全球著名的公司都在使用IARSYSTEMS提供的开发工具,用以开发他们的前沿产品,从消费电子、工业控制、汽车应用、医疗、航空航天到手机应用系统....
2003年6月,IARSystems在中国成立办事处;2007年5月,成立爱亚软件技术咨询(上海)有限公司,以加强对中国以及部分东亚国家的产品销售和技术支持。
软件总体设计框图
软件分步配置:
配置时钟:
/************************************************************************
时钟设置,ADC10内置振荡器,ADC10SSELx=0,ADC10DIVx=0,F(adc10clk)=F(adc10osc)
系统时钟:
DOCLK=1.6MHZ
SMCLK=0.8MHZ
MCLK=1.6MHZ
TIMERCLK=0.1MHZ
ADC10CLK=0.8MHZ
ADCALL=4766HZ
**************************************************************************/
配置Timer_A0:
设置为up模式且计数值为1000时钟源为SMCLK经过8分频
TACCR0=1000;
TACTL=TASSEL_2+MC_1+TACLR+ID_3;
TACCTL0=CCIE;
配置ADC10:
LaunchPad内部ADC为8位10通道模数转换器。
实验中将P1.1作为模拟信号的输入端口。
时钟源为SMCLK
voidint_ADC10()
{
P1SEL|=BIT1;//使能A/D通道A1;
ADC10CTL0=ADC10SHT_1+ADC10ON+SREF_1+REF2_5V+REFON+MSC+ADC10IE;//打开ADC10内核,确定采样周期为8*ADC10OSC,选择内部参考电压为2.5v;
ADC10CTL1=INCH_1+ADC10DIV_0+CONSEQ_2+ADC10SSEL_3;//inputA1模拟信号输入选择通道A1即P1.1,设置为单通道多次转换模式,分频因子为1时钟为SMCLK
ADC10AE0|=BIT1;//使P1.1允许AD模拟输入信号
ADC10CTL0|=ENC;//使能转换;
ADC10CTL0|=ADC10SC;//开始转换;
ADC10CTL0&=~ADC10IFG;//清除标志位
}
配置LCD1602:
由于launchPad的引脚有限,并且1602采用
引脚说明:
launchPadLCD1602
P1.4——P1.7————>I/O高四位
P2.0——P2.3————>I/O低四位
P1.0P1.2P1.3————>RSRWEN
函数:
voiddir(chartemp)与voiddataport(chartemp)目的将一个八位的端口拆分为两个端口的高低四位而不影响此端口的其它位;
voiddataport(chartemp)
{
unsignedchartemp1,temp2,temp0,temp00;
temp1=P1OUT|0xf0;
temp2=P2OUT|0x0f;
temp0=temp|0x0f;
P1OUT=temp0&temp1;
temp00=temp|0xf0;
P2OUT=temp00&temp2;
}
voiddir(chartemp)
{
unsignedchartemp1,temp2,temp0,temp00;
temp1=P1DIR|0xf0;
temp2=P2DIR|0x0f;
temp0=temp|0x0f;
P1DIR=temp0&temp1;
temp00=temp|0xf0;
P2DIR=temp00&temp2;
}
软件主程序
/*****************************************
时钟设置,ADC10内置振荡器,ADC10SSELx=0,ADC10DIVx=0,F(adc10clk)=F(adc10osc)
系统时钟:
DOCLK=1.6MHZ
SMCLK=0.8MHZ
MCLK=1.6MHZ
TIMERCLK=0.1MHZ
ADC10CLK=0.8MHZ
ADCALL=4766HZ
******************************************/
#include"msp430g2553.h"
#include"function.h"
/*************************************变量声明******************************/
longm=0;//系统进入ADC10中断次数(可用于测试实际中ADCALL的频率)
uintn=0;//心率过度值
uinti=0;//测试用
intflag=0;//精确信号峰值个数
intflag1=0;
intflag2=0;
intnum_nn=0;
intyuzhih=1023;
intyuzhil=923;
uintfxin=0;//心率值
uintmin=0;//30s
uintmin_n=0;//30s次数
inta=0;
/*******************************变量声明*********************/
uchar*name1="xujinmeng";
uchar*name2="and";
uchar*name3="yingzhenhua!
";
uchar*frequency="Frequency:
";
uchar*HZ="HZ";
uchar*HeartRate="HeartRate:
";
uchar*Min="/Mi";
uchar*error="toolow!
error!
";
/*************************************主函数*****************************/
intmain(void)
{
//Stopwatchdogtimertopreventtimeoutreset
WDTCTL=WDTPW+WDTHOLD;
DcoClkSet(8,3);//msp430g2553datasheetP30配置DCOclk
SMClkSet
(2);//配置smclk见最上边
MClkSet
(1);//配置MCLK见最上边
/*配置LCD1602*/
LcdReset();
DispStr(0,0,name1);
Delay500ms();
LcdWriteCommand(0x01,1);
DispStr(0,0,name2);
Delay500ms();
LcdWriteCommand(0x01,1);
DispStr(0,0,name3);
Delay500ms();
LcdWriteCommand(0x01,1);
DispStr(0,0,frequency);
DispStr(13,0,HZ);
DispStr(0,1,HeartRate);
DispStr(12,1,Min);
DispStr(10,0,"?
?
");
DispStr(10,1,"?
?
");
/*配置ADC10*/
int_ADC10();//ADC10初始化
/*配置timer_A0*/
P1DIR|=BIT0;
TACCR0=1000;
TACTL=TASSEL_2+MC_1+TACLR+ID_3;
TACCTL0=CCIE;
_EINT();//打开总中断
LPM0;//CPUOFF
}
voiddisplayLCD_HZ(inttemp)
{
intnum_h,num_l;
charnum_h_LCD,num_l_LCD;
num_h=0;
num_l=0;
num_h=temp/10;
num_l=temp%10;
num_h_LCD=num_h+'0';//int——>char
num_l_LCD=num_l+'0';//int——>char
Disp1Char(10,0,num_h_LCD);
Disp1Char(11,0,num_l_LCD);
}
voiddisplayLCD_N(inttemp)
{
intnum_h,num_l;
charnum_h_LCD,num_l_LCD;
num_h=0;
num_l=0;
num_h=temp/10;
num_l=temp%10;
num_h_LCD=num_h+'0';//int——>char
num_l_LCD=num_l+'0';//int——>char
Disp1Char(10,1,num_h_LCD);
Disp1Char(11,1,num_l_LCD);
}
/************************************************************************
*ADC10中断
yuzhih与yuzhil为测量峰值个数。
大小不一致为避免波的自己震荡
************************************************************************/
#pragmavector=ADC10_VECTOR
__interruptvoidADC_ISR(void)
{
intread;
read=ADC10MEM;
m++;
if((read)>=yuzhih)//yuzhih,yuzhil为所需电压峰值的digit
{
flag=1;
i++;
}
if((flag==1)&&(read<=yuzhil))
{
flag=0;
n++;
min_n++;
}
}
/*TIMER中断*/
#pragmavector=TIMER0_A0_VECTOR
__interruptvoidtimer0(void)
{
a++;
min++;
if(a==100)
{
/*******************************自调节反馈*******************************/
if((i==0)&&(fxin==0))
{
flag1=1;
yuzhih=yuzhih-50;
if(yuzhih<=(yuzhil+50))
{
yuzhil=yuzhil-50;
if(yuzhil<=200)
{
LcdWriteCommand(0x01,1);
DispStr(0,0,error);
Delay500ms();
Delay500ms();
LcdWriteCommand(0x01,1);
yuzhil=923;
yuzhih=1023;
}
}
}
elseif(flag1==1)
{
flag1=0;
DispStr(0,0,frequency);
DispStr(13,0,HZ);
}
/****************************************************************************/
a=0;
P1OUT^=BIT0;//测试用
fxin=n+((n>55)?
4:
0)+((n>100)?
2:
0);//fxin纠正函数
n=0;
i=0;
displayLCD_HZ(fxin);//LCD显示
}
if(min==3000)
{
min_n=min_n*2;
displayLCD_N(min_n);
min_n=0;
min=0;
}
}
调试效果图
结论
根据以上效果图,可知心电图测试结果跟理论吻合,说明本次实验圆满成功。
通过本次实验,我们对模拟电路有了更进一步的理解,将课本上的理论成功应用到了实际中。
参考文献
《运算放大器权威指南》BruceCarter、RonMancini主编,姚剑清译人民邮电出版社
《OP放大电路设计》冈村迪夫著,王玲等译,科学出版社