摘 要: 研制一款便携式心电监护系统对于预防老年人群的心脑血管疾病有着十分重要的意义。本文设计中使用了当前比较流行的三星公司ARM11系列的低功耗、功能强大的S3C6410作为心电监护系统的核心控制单元,并在ARM平台上设计扩展一块心电信号采集及处理板,剪切并移植打包了开源的Linux操作系统。在嵌入式Linux系统平台上构建的便携式心电监护系统,能够实现人体心电信号的实时采集、实时心率计算、实时交互的GUI界面显示等功能。测试结果表明,便携式心电监护系统的各功能正常,性能良好,工作性能达到系统设计要求。
关键词: ARM;心电监护;便携式;嵌入式Linux
0 引言
随着中国人口老龄化逐渐严重,心脑血管疾病的发病率大大提升,研制一款便携式心电监护系统对于预防老年人群的心脑血管疾病有着十分重要的意义[1]。本文结合飞速发展的嵌入式Linux系统,使用当前比较流行的三星公司ARM11系列的低功耗、功能强大的S3C6410作为心电监护系统的核心控制单元,在ARM平台上移植了嵌入式Linux系统,在该平台上开发便携式心电监护系统,实现对人体心电信号的实时采集、实时心率计算、实时交互的GUI界面显示等功能。主要介绍了便携式心电监护系统的软硬件设计与实现。
1 系统硬件设计与实现
嵌入式系统硬件由心电信号调理电路和嵌入式系统两部分构成。这两部分既相互独立又紧密联系,两者协同工作。嵌入式系统是整个硬件的核心,它控制整个系统外围设备进行工作,而心电调理电路则为后端的嵌入式系统提供纯净的心电信号。
1.1 心电采集与调理电路设计
通过人体电极采集人体的心电信号,信号由导联线传送给仪表放大电路进行一级放大,从仪表放大电路输出两路信号分别传送至左腿驱动电路和高通滤波电路,左腿驱动电路输出的信号反馈到左腿电极进一步消除共模信号,高通滤波器将信号中的超低频信号滤除,然后将信号传送到主放大电路进行二级放大。放大后的信号传送到低通滤波器滤除信号中的高频噪声,从低通滤波器输出的信号传送入工频陷波电路,去除信号中交流电产生的50 Hz干扰,最后信号被送入电平提升电路。这个电路主要是给心电信号加入一个直流分量,使信号被ADC采样后不会失真。图1是心电信号调理电路的模块图,主要由以下几个模块组成:
(1)人体电极,采用一次性黏贴型传导电极。
(2)心电导联线,采用自编三绞线,编织成三角形状的导联线可以消除部分干扰,减小心电信号的失真。
(3)仪表放大电路,采用亚诺德开云棋牌官网在线客服(AD)公司生产的单电源仪表放大器AD620。AD620在电源供电为±5 V时,允许的最大输出电压范围是±3.8 V,而心电信号的幅值在±5 mV之间,加上体表和心电电极产生的±300 mV共模直流偏移电压,所以AD620可以设置最大的增益为12.88[2]。本设计将增益设置为10,RG设置为5 k。
(4)左腿驱动电路,采用方向放大电路,两个输入端电压相等并等于0,故没有共模输入信号[3]。因此,左腿驱动电路对共模抑制没有要求,在放大器选择上也没有严格要求,本设计采用的是AD公司生产的常用运算放大器OP07。
(5)高通滤波器,高通滤波电路仍沿用左腿驱动电路中使用过的运算放大器OP07作为放大器件,高通滤波部分采用带内幅频特性曲线平坦的一阶有源巴特沃思滤波器。
(6)主运算放大电路,ADC转换器采用ARM自带的10位AD。实际电路中,将前后两级放大电路的增益设定为1 000倍。
(7)低通滤波电路,采用OP07运算放大器,采用二阶有源巴特沃思低通滤波器,以提高滤波器幅频曲线的下降速度。
(8)工频陷波电路,滤除对心电信号影响严重的交流电50 Hz工频干扰。
(9)电平提升电路,将从前面电路输出的心电信号提升一个直流分量,使得心电信号的负值部分全部转换成正电平信号。这样就解决了因ADC采样而造成的信号丢失,避免了ADC采样后心电信号的失真。
1.2 数字电路设计
数字电路部分是便携式心电监护系统后期对信号处理并实现与用户交互的核心部分。心电信号由模拟电路的输出端送入ADC转换器后,实现了从模拟信号处理到数字信号处理的转换。这一转换方便了后期对心电信号的实时采集、实时心率计算、实时传输以及实时显示。数字部分由OK6410的核心板构成的嵌入式最小系统,以及底板上的ADC电路、LCD控制电路、SD卡接口电路和以太网接口电路等组成。数字电路部分组成框图如图2所示。
(1)嵌入式最小系统,以内核为ARM11 76JZF-S的S3C6410微处理器为中心,周围有与之相配接的复位电路、时钟电路、辅助电源、SDRAM电路以及Flash电路等,保证嵌入式微处理器能够正常运行系统。OK6410核心板提供了四个不同的晶振源,复位电路使用了专业的复位芯片Max811,S3C6410微处理器需要多种电源供电,所以核心板每一路电源输入由电源芯片单独供电。同时,S3C6410外扩了一个256 MB的DAND Flash存储器和一个128 MB的Mobile DDR内存。
(2)ADC电路,S3C6410处理器内置了一个参考电压为3.3 V的10位A/D,这个内置的A/D可以满足心电信号采样对A/D分辨率的要求,同时A/D的电压与S3C6410的电源电压相匹配,使A/D的位数得到充分的利用。将从信号预处理模块输出的心电信号接入S3C6410的ADC输入引脚,再通过相应的软件处理,就可以将模拟信号转换为数字信号。本设计使用一路A/D,所以将模拟电路输出的信号接入S3C6410的ADCIN0引脚即可。
(3)LCD控制电路,由MAX202E和RS232 DB-9针母座构成串口电路。串口电路的驱动选用MAXIM公司专为苛刻环境下进行RS-232通信设计的MAX202E线驱动/接收器芯片。其中,MAX202E的两个驱动器T1O、T2O分别与RS-232的接收数据端RXD和允许发送端CTS相连;两个接收器R1IN和R2IN分别与发送数据端TXD和请求发送端RTS相连。
(4)以太网口电路,采用Davicom公司生产的10/100 M以太网控制器DM9000芯片,DM9000的SD0~SD15与S3C6410的数据总线DATA0~DATA15相连,DM9000的命令/数据使能端CMD与S3C6410的共同地址线ADDR2相连。
(5)SD卡接口电路,OK6410开发板集成了一个SD卡座CON2。本设计使用SD卡启动S3C6410处理器,将U-boot放入SD卡中,由SD卡启动从而引导加载Linux内核。
2 系统软件设计与实现
2.1 嵌入式Linux系统的移植
嵌入式Linux系统是在Linux系统基础上针对嵌入式系统进行内核裁减和优化后形成的一种小型操作系统[4-5]。本设计采用嵌入式Linux作为操作系统,选用Linux3.01内核在嵌入式S3C6410上移植。具体的移植过程如下:
(1)配置开发环境。使用安装Ubuntu12.10操作系统的PC作为主机,安装GNU Tools跨平台开发工具链以及arm-linux-gcc、arm-linux-ld等交叉编译工具。
(2)建立引导加载程序Boorloader,采用DAND Flash方式启动U-boot。
(3)解压内核源码,然后进到内核源码修改Makefile文件,添加对arm的支持:将“arch=”和“CROSS_COMPILE=”改为“arch=arm”和“CROSS_COMPILE=arm”[6]。
(4)配置内核。通过命令“make menuconfig”进入配置栏进行配置。本设计需针对A/D转换驱动、触摸屏驱动进行配置。
(5)执行“make zImage”命令,进行内核编译。将编译后在“arch/arm/boot/”目录下生成的U-boot格式的内核映像文件“zImage”下载到目标板上。
(6)编译并安装BusyBox,建立根文件系统。执行命令:./mkyaffsimage sdrootfs/rootfs.yaffs2生成yaffs2镜像文件并下载到目标板上。
2.2 应用程序的设计与实现
本系统所实现的应用程序模块有心电采集模块、心率计算模块及GUI用户界面模块。这些应用程序在嵌入式操作系统环境下运行,通过驱动设备程序提供的接口来控制ADC、LCD、蜂鸣器等设备。
(1)心电采集模块。通过控制ADC进行采样,将模拟信号转换得到的数字信号读入数据缓存区,方便后面的模块对数据进行下一步的处理。本设计采用给PWM定时器和A/D采样分别建立一个单独的线程的方法,在需要进行采样时由PWM定时器线程通过pthread_cond_sigal()函数唤醒A/D采样线程。心电监护开始后,由主程序建立PWM定时器和A/D采样线程,在开始采样之前,首先对ADC进行初始化并启动ADC和PWM定时器,PWM功能是由Timer0和Timer提供。为了保证系统工作的实时性和可靠性,本设计采集模块采用两个数据缓存交替存储数据,避免了采集的新数据将其他模块没有处理完的数据覆盖。心电采集模块流程如图3所示。
(2)心率计算模块。心率在标准心电信号中表现为每分钟出现R波的次数。心率计算模块根据采集的心电信号计算出用户的实时心率。式(1)为计算实时心率的公式。
X=(NR-1)/(PLR-PFR)×(60×fs)(1)
其中,X为所求心率;fs为心电信号采集频率;NR为某段时间内心电信号R波的个数;PLR为该段时间内最后一个R波的位置;PFR为该段时间内第一个R波的位置。
因此,只要检测出一分钟里R波的个数就可以算出心率值。目前,较为流行的检测算法是阈值差分算法。这种算法实现简单,检测率高而且速度很快,但缺点是一旦确定了一个阈值后就不再更新阈值,如果阈值在计算过程中出现错误,将导致整个R波检测过程的可靠性下降。为此,本文在该算法基础上提出了一种改进的R波检测差分阈值算法。
该算法涉及了ADC采样问题。本文在A/D采样时,对采样值做了一个滑动平均滤波处理,即利用A/D底层驱动在read函数中进行十次A/D采样并取平均值,这样ADC的采样频率就相当于1 000 Hz。由于正常人的心率范围是60~100次/min,一个心跳周期的采样点为60~100点,取其上限,所以100个采样点至少包含一个心跳周期。若在此期间没有检测到R波,则可判断心率存在问题。在计算阈值时,取4 s内的400个点,以100个点作为一小段,分成4段,根据二阶差分公式(2)计算出4段的最小值平均值,将这个值的0.6倍与当前阈值进行加权求和即可得到阈值的计算公式,如式(3)。
y(n)=x(n+2)-2x(n)+x(n-2)(2)
th2=(1-a)×th2′+0.6a×ymin (3)
式中,x(n)表示原始心电数据序列;y(n)为对应的二阶差分序列;ymin是4段最小值的平均值;th2′是当前二阶差分阈值;th2为更新后的二阶差分阈值;a是加权系数,满足a<1。
计算出阈值后,将这些二阶差分数据每L个作为一组,当连续的四个数据满足前两个数据大于th2,后两个数据小于th2,则建立一个以首个数据为区间起点的长度为5的检测区间。在检测区间对应的原始心电信号数据中找到最大值,这个值所对应的位置即为R波的位置。
这种改进的检测R波差分阈值算法可以避免因为某次二阶差分阈值计算不准确而导致检测结果错误。同时,在阈值计算时取最近4 s的400个点来计算阈值避免了频繁的阈值更新。心率计算模块的软件流程图如图4所示。
(3)GUI用户界面模块。采用宿主机/目标板交叉模式开发基于Qt的嵌入式GUI用户界面[7]。开发的主要流程是:
①把Qt4.8.5移植到宿主机上,并将波形图生成插件QWT(Qt Widgets for Technical Applications)移植到Ubuntu上。
②将Qt源码解压到目标板上,配置“configure”文件,完成Qt的交叉编译。
③在宿主机上的Qt里建立一个名为“ecgdemo”的工程文件,并在该文件中添加一个名为“mainwindow.cpp”的文件,在这里可以对显示界面的字体、调色板、画刷、窗口里的字体颜色进行设置[8]。
④通过panel的构造函数对一些面板内部部件进行初始化,增加Value、Plot、Canvas、Curve和Tools 5个标签,定义信号与槽的连接,实现panel与plot的交互,即实现了面板和绘图组件的交互。
3 测试结果
将心电导联线黏贴在人体左手、右手和左腿的电极上,通过电极采集的心电信号由导联线传送到预处理模块,再经过ARM系统板处理,最后在LCD上显示。使用系统测试一个正常人的实时心电信号及实时心率如图5和图6所示。
经测试,获取的心电信号比较稳定,噪声很小,而且能够实时计算出心率,基本实现了设计要求。
参考文献
[1] 张啸飞,胡大一,丁荣晶,等.中国心脑血管疾病死亡现况及流行趋势[J].中国心血管病杂志,2012,40(3):179-187.
[2] 李奥伟,尚焕亮,夏雪珩.基于AD620的简易心电图仪的设计[J].电子设计技术,2013(10):32-33.
[3] WINTER B B, WEBSTER J G. Driven-right-leg circuit design[J]. IEEE Transactions on Biomedical Engineering, 1983, 30(1):62-66.
[4] 李亚峰,欧文盛.ARM嵌入式Linux系统开发从入门到精通[M].北京,清华大学出版社,2007.
[5] 王小宁,王振臣,张少兵.Linux操作系统在ARM9处理器上的移植[J].化工自动化及仪表,2010,37(2):67-69.
[6] 陈铁军,魏超,贾东明.基于ARM9的心电监护系统[J].中国组织工程研究与临床康复,2011,15(17):3156-3159.
[7] 游燕珍,赵国锋,徐川.基于Qt/E的嵌入式GUI的研究及其移植[J].微计算机信息,2008(5):61-63.
[8] Liu Ting, DASIEWICZ P. Incorporating a contract-based test facility to the GUI framework[C]. IEEE Canadian Conference, Canadian, 2004,1(5),405-408.