您的当前位置:首页基于单片机的心电图仪系统设计

基于单片机的心电图仪系统设计

2022-05-26 来源:飒榕旅游知识分享网
简易心电图仪的设计方案

摘 要

心电图是临床疾病诊断中常用的辅助手段。心电数据采集系统是心电图检查仪的关键部件。人体心电信号的主要频率范围为0.05Hz~100Hz,幅度约为0~4mV,信号十分微弱。由于心电信号中通常混杂有其它生物电信号,加之体外以50Hz工频干扰为主的电磁场的干扰,使得心电噪声背景较强,测量条件比较复杂。为了不失真地检出有临床价值的干净心电信号,往往要求心电数据采集系统具有高精度、高稳定性、高输入阻抗、高共模抑制比、低噪声及强抗干扰能力等性能。本设计利用89C51和A/D转换以及多路模拟开关设计了一种符合上述要求的多路心电数据采集系统。 一、方案的提出与比较

1、方案的提出

图1所示是一个心电数据系统的组成框图,其中心电信号由专用电极拾取后送入前置放大器初步放大,并在对各干扰信号进行一定抑制后送入带通滤波器,以滤除心电频率范围以外的干扰信号。主放大器可将滤波后的信号进一步放大到合适范围后,再经50Hz陷波器滤除工频和肌电干扰,然后将符合要求的心电模拟信号由模拟输入端送入高速ADC,以进行高精度A/D转换和数据的采集存储。

方案一:采用模拟分立元件,可以产生心电波,但采用模拟元件太大,即使使用单片机电路参数也与外部元件有关,外接的电阻电容对参数影响很大,在滤波过程中会出现很大的干扰,使得输出不精确,即此电路抗干扰能力低,成本也高;而且灵活性差,不能实现各种输出的智能化。,

方案二:采用以89C51为核心,采用INA128芯片作为前置放大,运用多级运放电路来提取信号。它在一定的程度上可以达到题目要求。但是,共模抑制比很难达到发挥80db以上,而且精确度不高,在以后的输出中会出现很多的毛刺。由于这些原因,我们不采用这种方法。

方案三: 以89C51为中心、采用性能优良的AD620管作为前置放大,既可以提高放大倍数,也可以提高共模抵制比、电路结构简单。。然后通过A/D和D/A转换,输出给示波器,若合理的选择器件参数,可使其输出波形失真小。所以采用此方案。 二、系统原理图以及各模块的说明

1、系统原理图

图一 2、模块说明:

①导联选择:采用CD4051来完成,用单片机来控制。

② 前置放大:采用AD620来完成,前置放大是心电数据采集的关键环节,用来把取样的信号进行放大,具有很高的共模抑制比和1~1000倍信号放大。

③ 高/低通滤波电路:采用LM324作为核心,用大小相当的电阻电容构成滤波

电路。

④50Hz陷波电路:采用LM324作为核心,用大小相当的电阻电容构成陷波电路,电路简单,容易实现。

⑤波形A/D采集存储模块:以单片机为核心,利用ADC0809,以2.5KHz的速率对输入信号进行采集。由于89C51内的存储空间不够,我们扩展了两片RAM,使存储深度达到了16KB,即每一个通道存储8KB。

⑥单片机控制模块:系统的主控制器,控制其他协调工作。

三、系统电路与理论数据 (1)导联通道的选择

方案一:两个导联均采用两个相同的通道,即采用两个仪表放大器INA128、两个滤波通道、两个50Hz陷波通道以及两个主放大电路、两个电平移位电路,然后通89C51来控制ADC0809来选择通道来进行处理。由于这种方法的思路非常清晰,各通道之间干扰小,但总体来说由于采用了两个通道,耗资大,所以本设计不采用此方案。

方案二:采用模拟开关4051,在两个导联通道均通过仪表放大器以后再通过4051进行通道的选择,然后送到后级进行处理。在这里为了保证每切换一次89C51能够采集存储完一次心电信号,我们用89C51来同时控制切换率和采样率,这样就切保了同步,同时也保证了心电信号不会被漏存少存。

方案三:在前置放大前级采用类比多工器ADG609,考虑到一般生理信号都属于差动式的,而ADG609的类比信号的输入范围介于Vss与Vdd之间,且有四个切换对,可以很轻易地经由89C51的设定来更改切换的频率,除此之外还具有快速切颀时间(Ton75ns max*Toff45ns max)、低启动阻抗、低消耗功率,以上这些特性都符合此设计的要求。ADG609的真值表如下:

A1 X 0 0 1 1

(2)前置放大部分

方案一:采用LM324与NE5534等低噪声,具有一定精度的普通运算放大器要构建放大电路,但从体表采集到的信号除了人体的心脏产生的电信号以外,还包含肌电,呼吸以及50Hz工频信号等带来的干扰.其中,工频干扰收起的共模信号可能远大于心电信号,从而影响系统对心电信号的分析采样,因此,共模抑制比是衡量心电图仪情能的重要标准之一.本题要求运算放大器的共模抑制比不小于80db.上述两种运算放大器的共模抑制能

A0 X 0 1 0 1

EN 0 1 1 1 1

通道选择 NONE 1 2 3 4

力虽然能达到这个要求,但有这样的单个运放构成的电路难以达到较高的共模抑制比,故不采取此方案。

方案二:心电信号为一差动式信号并且小于4mV,通常信号会先经过第一级的适当放大后,再经过高低通滤波器,采用分级放大的原因是为了避免直流偏压经过放大后,造成后级的电饱和,而使放大后的信号产生失真.因此为了避免放大器饱和,在这一级的放大增益应该小于30.一般说来作为前级放大单元必须具有高输入阻抗.高共模斥拒比等基本特性,在这里我们采用了低功耗,高精度的仪表放大器-----AD620, AD620输入端采用超β处理技术,具有低输入偏置电流、低噪音、高精度、较高建立时间、低功耗等特性,共模抑制比可达130dB,非常适合作为医疗仪器前置放大器使用。其增益可调(范围约1~1000倍),并可由公式

G=1+(51+51)/15=7.2

来确定。为防止前置放大器工作于饱区和或截止区,其增益不能过大。试验表明:10倍左右效果较好。因此,我们采用了此方案。

方案三:采用仪表放大器INA128.其具有良好的共模输入抑制能力,共模抑制比大于120DB,而且只需外接一个电阻就可调节增益..INA128对直流电源的要求低,甚至只需2.25V的直流电源电压就要表现出色的功能特性,静态电流只有700uA,功耗低,但INA128的价格昂贵,因此我们不采用此方案。

(3)心电信号处理部分

心电信号属于低频小信号,易受干扰,因此必须对所采集的信号进行高通,低通,陷波的处理.因此我们将心电信号处理部分的方案主要放在滤波部分和陷波部分。 1、滤波部分

如图3所示,带通滤波由双运放集成电路LM324构成。LM324具有高精度、低偏置、低功耗等特性,片内集成了两个运放,可灵活组成各类放大和滤波电路。由于心电信号频带主要集中在0.05~100Hz左右,频带较宽,为此,采用LM324的两个运放分别设计二阶压控有源高通和低通滤波器并组合成带通滤波。其中,U6A、C

6、C7、R8、R9构成高通滤波器,为不损失心电信号的低频成分,其截止频率设计为

f=1/ 2π

C6C7R8R9 =0.05Hz。

U6B、R10、R11、C8、C9构成低通滤波器,同样,为不损失其高频成分,截止频率设计为

f=1/ 2π

C8C9R10R11 =500Hz

放大电路由LM324、R12、R13构成。考虑到心电信号幅度约为0~4mV,而A/D转换输入信号要求1V左右,因此,整个信号电路的放大倍数需1000倍左右。而前置放大约10倍左右,因此本级放大倍数设计为100倍左右,即G=1+R12/R13≈100。

其中低通滤波又分有源滤波和数字滤波。图三为低通滤波的幅频特性.

图三

有源滤波方案:

一阶滤波。其结构相对简单,且采用了集成运算放大器,它具有高输入阻抗和低输出阻抗,同时由于具有缓冲作用效果比无源滤波器好,幅频特性曲线可达到-20db/10倍频,但要想实现更明显的滤波效果。此方案仍未满足要求。

二级滤波采有类似的结构,但幅频特性曲线能达到-40db/10倍频程,滤波效果比一阶明显。

二级以上的滤波。它是由多个一阶和二阶滤波器组成的,效果自然要比

上述两种滤波好,但其电路比一阶和二阶复杂,所需电阻电容较多,而电阻电容的实际值很难与设计要求精确匹配,有时为了匹配需要好几个电阻的串并联,同时由于不能避免环境因素对电阻电容的影响,因此用的电阻电容越多,误差就越大,导致实际的滤波效果与设计时所期望的存在一定的差距。本设计只对截止频率的精确度有要求,而对系的统的频域衰减率未做特别的要求,因此可以不必选择高阶滤波方案。

数字滤波方案:

数字滤波的优点是参数可调节性好,可以通过更改程序中的参数对截止频率进行精确的调节,由于参数不会随温度等环境因素改变,从而精确度得到保证。因此我们选择了此方案。

图四

2、陷波处理部分

工频干扰是心电信号的主要干扰,虽然前置放大电路对共模干扰具有较强的抑制作用,但有部分工频干扰是以差模信号方式进入电路的,且频率处于心电信号的频带之内,加上电极和输入回路不稳定等因素,前级电路输出的心电信号仍存在较强的工频干扰,所以必须专门滤除。

方案一:采用自适应相关模板法。利用工频干扰的相关特性,从原始输入信号中得到工

频干扰的模板,进而原始输入信号中减去工频干扰的模板,达到滤波干扰的目的。但这种方法算法虽然简单但程序设计比较复杂,所以不采用此方案。

方案二:采用模拟双T陷波。 通过图五幅频特性可知,对于W=W0的其他频率信号,通过双T网络具有较强的负反馈,因为双T网络具有良好的滤波特性,在仪表的电源噪声滤波电路中获得了较为广泛的应用,又因为双T网络具有比RC串、并联网络更好的选频特性,故我们选用了此方案。

图五 3、电平移位电路

经过一系列信号调理后,陷波输出的心电信号为交变信号,而本设计中ADC0809转换输入电压范围为0~5V,因此,在送入ADC之前还需进行电平抬升,在图四中,电平抬升部分由U11、R42、R43、R44构成。

图六

通过调节100K的电位器,从而可以调节输出电压的范围。 (四)、单片机系统的设计

1、由ADC0809与89C51构成的数据采集存储系统

信号采集部分: 前级经过处理放大的模拟信号通过ADC0809处理后转换成数字信号, ADC0809的转换时钟脉冲为200us, 为了有效的转换,ADC0809的start启动信号设置为100us的时钟脉冲,启动方式采用定时器溢出和软件写ADBUSY位启动相结合的方式,输出通道是采用软件分时控制其输出通道。输出后的数字信号直接送往单片机处理,当存储键有效时,单片机就会把输入信号存储起来,存储采用顺序存储方式,即先存第一通道再存第二通道,为了保证每个通道不会少存或重存,我们用单片机来不断查询ADC的转换结束线EOC,即第一个通道的数据转换完以后,EOC线为高电平,然后存储到第一个通道的存储区,同时切换到第二个通道的A/D转换,存储方法与第一个道通道一样。为了回放的时候能看到比较完整的心电图形,存储周期(每一个通道)设置为8KB*400us=3.2s,因此要占用较大的数据存储空间,显然单片机内部的数据存储空间是无法满足要求的,本系统采用的是外扩两片8KB的数据存储芯片以达到设计要求。当存储键无效的时候,摸/数转换后的信号直接由单片机输出,信号不会存储起来。单片机输出的信号送到下一级数/摸转换电路还原成模拟信号,再经过倒T网络后送到示波器显示。当回放键有效的时候,就会把存储在外部数据单元的心电信号显示出来。图八所示是单片机与信号调理电路连接框图。由于单片机里存储的是两路信号,而本设计的提高部分又要求同时显示这两路信号,但DAC0832转换后只有一个输出端口,为了达到此要求,我们设计了两种方案。

方案一:采用CPLD来还原DAC0832送来的两路信号,然后通过倒T形网络进行电平移位,把两路心电信号电平移到不同的电平等级上,再通过CPLD进行二选一切换送往示波器,由于人眼视觉暂留,而CPLD切换的速度非常快,因此在示波器上看上去就是两路信号同时显示。虽然这种方法较容易实现,且易于控制,两通道之间干扰小,但用到了CPLD芯片,价格比较昂贵,况且这里要求切换的频率不是很高,普通单片机可以轻松实现,不需要使用复杂的CPLD系统。所以,在这里我们不采用此方案。

方案二:采用模拟开关和89C51来进行控制,具体电路见原理图,在某一时刻我们只让单片机存储的一路信号送往DAC0832,在DAC0832输出的外部我们并联了两个倒

T形网络来进行电平移位,而这两个倒T形网络另一端接在高速模拟开关4051的两个通道上,通过单片机来控制4051的选择地址线。当第一路信号送过来时,用单片机来控制4051打开一个通道进行信号的传输,然后送到显波器显示;第二路信号来时,4051又打开另外一个通道送往显示。这样,不断地切换两个通道来进行轮流显示,只要切换的速度足够快,同样在示波器看上去也是两路信号同时显示。因此,我们采用了此方案。T型电阻的结构如下:

图七 设Vin=0V 时,V0=V1;

Vin=5V时,V0=V2。

根据KCL原理,利用下列二元一次方程组求出R1、R2:

V1 / R0 = (5 - V1) / R1 - V1 / R2 V2 / R2 = (5 - V2) / R0 + (5 - V2) / R1 其中,第一路V1为脉冲序列的低电平,电压为1V,

V2为脉冲序列的高电平,电压为 V1 + 0.2V; 第二路V1为脉冲序列的低电平,电压为1.9V, V2为脉冲序列的高电平,电压为 V1 + 0.2V 设R0 = 51KΩ

解此方程组可得R1、R2 列如下表: 一路 二路

R1/ KΩ R2/ KΩ V1/V V2/V

四、扩展电路图

10.00 2.632 1.0V 1.2V

5.263 3.448 1.9V 2.1V

图八 五、软硬件电路设计: (一)、软件图

六、电源设计

(1)+-15V电源(0.7A) -15V电源电路图如图所示

对于滤波电容的选择,要考虑:一、整流管的压降;二、815/7915最小允许压降Ud;三、电网波10%。从而允许纹波的峰峰值∆τt=18×2(1−10%)−0.7−Ud−15=4.9V 按近似电流放电计算,并设θ=00(通角),则 C=

I•∆t0.7×1/100

==1430µF 选取滤波电容C=2200µF/30V ∆u4.9

(2) +-5V电源(1A) 电源电路如图所示

允许的最大纹波峰峰值∆τt=9×2(1−10%)−1.4−2.3−5=2.76V C=

I•∆t0.7×1/100

==3600µF 选取滤波电容C=4700µF/16V

2.76∆u

(三)+-12V电源设计同上,电路图如下:

七、测试报告(仪器种类、型号、观测现象、测试步骤)

(一)、测试仪表

100M的模拟示波器、数字万用表、函数波发生器、EDA系统开发工具、仿真器、PC机等。

(二)、调试过程及功能实现 调试过程:

1、心电信号放大部分的调试

(1)前置级调试 由AD620来完成前置级,按照题目的要求,在此部分信号

放大倍数要达到1000倍,为此,我们利用LM324采用了两级放大。

我们先设AD620的Rg=5K,外接电阻分别为50K,这样前置的放大倍数大概就是20倍,但经过测试,输出的波形会出现严重的失真,于是我们把Rg换成了一个50K的可变电阻,经过调试当Rg=11.5K的时候输出的效果最好,波形失真最小。

(2)高通滤波器的调试 在高通部分,为了满足题目的要求,我们设置低频截止频率为0.05Hz,经过计算,RC选频网络中的C为0.1uF,R分别为1.5M和7.5M, 为了能够看到高通滤波的效果,我们用信号发生器产生的三角波作为它的输入信号,经过仔细的调整,我们发现当频率低于0.05Hz的时候,电压衰减很大,波形也变得非常的不稳定,且失真,因此基本达到我们设计的要要求。

(3)我们用同样的方法设计了低通滤波器。

(4)50Hz陷波电路的调试

为了防止50Hz的工频对电路的干扰。对工频进行陷波提高电路的稳定性, 利用双T二阶带阻滤波电路进行陷波。电路如下图所示: 根据理论值:c为1uF,R2=160,R1=16k,R5=R6=2k,R4=4k;

在调试的过程中,根据理论值进行测试,陷波频率偏离原设计频率较远在75Hz,在电容不变的情况下,经过多次对电阻调试,最后选中R2=180,刚好将50Hz的中心频率陷掉,范围在48~53Hz之间。达到题目给定要求。

(5)主放大电路 利用同相比例运放两级放大。

2、采集电路调试 在采集电路数据输入部分加入标准信号,由单片机将其写入

RAM指定的地址中,在将其读出后显示在LED显示。

3、显示电路的调试 调节T型电阻网络,用高精度电位器确定电阻阻值,并进

行微调,结果显示正常。

功能实现:

(1)电压放大倍数与输出电压动态范围测试 通过功率函数发生器产生一个小幅值的电压信号作为输入,用示波器来检测其输出波形,读取输出波形的幅值,得到增益测试数据如下表, NO 输入 输出 实际增益倍

1 20mV 19.8V 990.1

2 20.6mV 20.8V 1009.4

3 21mV 20.9V 995.2

4 23mV 23.1V 1004.1

5 25mV 25.2V 1008

结果分析:系统的放大倍数在1000+-5%的范围内,输出电压满足动态范围大于+-10%的要求。

(2)-3dB高频截止频率(理论截止频率为500Hz)

输入峰-峰值为5V的三角波,频率调节范围为50——600Hz,用示波器测量输出电压峰-峰值,所得低通滤波电路测试数据如下表: NO 频率 输出电压 增益

1 53Hz 5V 0

2 62 5.11V -0.01

3 100Hz 4.98V -0.26

4 350Hz 4.05V -1.20

5 550Hz 3.21V -3.86

(3)频带内响应波动指标测试

为了减小工频干扰,我们引用了陷波电路,所以对50Hz左右的信号衰减是较大的,自然也就能满足题目对“频带内响应波动在+-3dB之内“的要求。

(4)直流稳压电源测试 在给放大器供电情况下,输出交流噪声有效值为0.1mV. (5)共模抑制比测试

由于选用的是仪表放大器AD620,它的性能指标已说明它的共模抑制比能达到130dB,因此能满足题目对“共模抑制比大于等于60dB”的要求。

(6)人体心电信号测试 C语言程序:

//-----------------------------------------

// 二路信号自动存储 //----------------------------------------- #include #include #include

#define uchar unsigned char

#define PA XBYTE[0x7ffc] //定义8255 #define PB XBYTE[0x7ffd] #define PC XBYTE[0x7ffe]

#define COM8255 XBYTE[0x7fff]

sbit cunchukey=P1^0; //存储开启按钮 sbit start=P1^1; // start输出 sbit dispkey=P1^2; //显示按钮 sbit clrkey=P1^3; //清零按钮

sbit eoc=P1^4; //判断是否转换完,转换完后eoc=1 sbit on_off1=P1^5; //采样通道选择 sbit on_off2=P1^6; //输出通道选择

uchar xdata table1[8191]; // _at_ 0xc000; //定义62256 uchar xdata table2[8191]; // _at_ 0xa000; uchar clktime; //控制200us输出

bit error=0; //有存储之后才能有显示,即error=1; bit mark; //存储信号锁定 int cuntime1,cuntime2; //存储计数

cunchu(); //存储数据 data_display(); //数据输出 intin(); //初始化

clr(); //清空所有数组空间 on_off_con(); //通道控制 start_con(); //start信号控制

void delay(uchar x) //延时 {

while(x--); }

//--------------main---------------- main() {

intin(); while(1) {

cunchu();

data_display(); clr();

on_off_con();

} }

//---------------clear--------------------- clr() { int i;

if(clrkey==0) {

delay(248); if(clrkey==0) {

mark=0; error=0;

for(i=0;i<8191;i++) {

table1[i]=0; table2[i]=0; } }

while(1)

{if(clrkey==1) break;} } }

//---------------intin-------------------- intin() {

COM8255=0x90;

on_off1=1; //初始化模拟开关 on_off2=0; }

//---------------on_off_con------------------- on_off_con() {

on_off1=!on_off1; }

//---------------start control------------ start_con() {start=1; delay(2);

start=0; delay(5);

for(;;) //判断是还转换完 if(eoc==1)

break; //转换完后跳出 }

//---------------cunchu------------------------ cunchu() {

if(cunchukey==0||mark==1) {if(cunchukey==0) delay(100);

if(cunchukey==0||mark==1) {

mark=1; error=1; start_con(); //调用start脉冲信号 if(on_off1==1) //判断通道 table1[cuntime1++]=PA; else

table2[cuntime2++]=PA; } if(cuntime1>=8191&&cuntime2>=8191) mark=0;

while(1)

{ if(cunchukey==1) break;} } }

//------------------data_display------------------- data_display() {

bit disp_flag=1; //输出通道切换位 int disptime1,disptime2; //输出计数

if(dispkey==0&&error==1) //从存储RAM输出 { delay(100); if(dispkey==0) {

while(1) {

if(disp_flag)

{ on_off2=1; //开输出通道1 PB=table1[disptime1++]; delay(10); } if(!disp_flag) { on_off2=0; //开输出通道2 PB=table2[disptime2++]; delay(10); }

disp_flag=!disp_flag;

if(disptime1>=8191&&disptime2>=8191) {disptime1=0; disptime2=0;}

if(cunchukey==0||clrkey==0||dispkey==0) {delay(50); if(cunchukey==0||clrkey==0||dispkey==0) break;}} while(1)

{ if(dispkey==1) break;} }}

else //从采样端输出 {

start_con();

if(on_off1==1) //选择输出通道 on_off2=1; else

on_off2=0; PB=PA; } }

因篇幅问题不能全部显示,请点此查看更多更全内容