摘 要:介绍一个基于ARM920T内核的S3C2440A微处理器和CPLD芯片EPM570T144C5N实现的四导心音采集显示系统。系统的模拟电路部分对心音信号进行放大去噪;数字部分通过CPLD控制高速A/D转换并通过模拟SPI接口将数据传给ARM9。选用Linux2.6.30作为操作系统,设计了ARM9的SPI驱动和基于Qt4.7以及Qwt的应用程序。实际运行情况表明,本系统运行流畅,实现了实时采集心音信号、显示波形、储存心音数据。
关键词:心音;采集显示;CPLD;ARM9;Qt4.7
随着我国人口老龄化的加快以及生活水平的提高,预计在今后的20年内,心血管疾病发病率将超过50%,如不加以控制,到2030年我国心血管疾病患者将增加2 000万人以上,与之有关的死亡人数将增加700多万人[1]。心脏听诊往往作为心血管疾病早期诊断的主要手段,但是采用传统的听诊方式存在许多问题,比如难以捕捉和分辨微弱的生理信号,长时间听诊易造成听力疲劳,诊断结果易受听诊者的主观影响。近几年来随着科技的进步兴起了一些电子听诊器,比如美国BIOPAC公司生产的MP150型16通道生理信号记录分析仪、日本OLYMPUS公司生产的单道心音数字录音笔等。前者可以采集多个听诊部位的信号,数据更全面但是价格昂贵,且体积较大;后者的价格便宜,但波形显示效果不好,不能同时提供多瓣膜病例信息。因此,如何通过工程技术手段实现设备的高效率、低成本以及便于使用等成为研究的热点。
随着嵌入式技术的不断发展,特别是处理器运算能力的不断提升以及一些优秀的图形用户界面软件(如国产MiniGUI、Trolltech公司出品的Qt等)的出现,使医疗设备更加小型化,使用也变得更加容易。本文以三星公司生产的基于ARM920T内核的S3C2440A作为主控制器,以Linux为操作系统,开发了四导心音采集显示系统。
1 系统总体设计
系统总体结构如图1所示,包括以下几个模块:
(1)信号采集调理模块,完成对主动脉、肺动脉、二尖瓣、三尖瓣心音信号的采集以及放大与去噪;(2)数字信号处理模块,选用高性能的A/D芯片再配合CPLD的控制进行模/数转换,CPLD通过模拟SPI接口将数据传给ARM9;(3)ARM9核心处理模块,核心模块主要由S3C2440A、64 MB SDRAM以及512 MB Nandflash 组成,完成对数据的接收保存,并通过10英寸液晶屏显示心音波形,在Nandflash中单独划分出400 MB的空间来保存心音文件,通过移植USB Gadget驱动实现当采集板通过USB接口插上电脑后能像U盘一样读取这400 MB空间中的内容。
2 系统硬件设计
2.1 信号调理模块设计
系统使用了美国3M公司生产的Littmann和ClassicIISE听诊头,另外,在听诊头上加入了一种新型的贴膜,不仅有利于粘住身体所测部位,而且能保证采集的音质不变。心音传感器模块能将心脏搏动信号转化为低阻抗音频信号[2]。针对心音信号具有的信号微弱、易受干扰等特点,首先要进行初级放大以满足后面滤波的需求,在经过带通滤波电路滤去不属于心音信号频带的部分后,再经工频陷波电路,最后经过主放大电路。
(1)前置放大电路采用了TI公司生产的一款低功耗、低噪声、高输入阻抗的运算放大器TLC2252。电路如图2所示,C1和R2组成的电路起到两个作用:(1)阻止C1左端的直流电流通过;(2)允许心音传感器输出的交流小信号通过并传递给后面的放大器,C2、R3、R4、R5构成同相放大电路,其具有输入阻抗很高、输出电阻很低的特点,非常适合于前置放大电路。
(2)前置放大电路输出的信号并不是纯粹的心音信号,里面还含有一部分低频信号,比如传感器与皮肤的摩擦、呼吸噪音等[3]。当采集时遇到咳嗽声音、器件掉落的声音可能会引入高频噪声。为了不影响心音信号的分析,必须将其滤除。在此设计了带通滤波器,前面为二阶压控电压源低通滤波器,低通滤波电路主要滤掉信号中高于心音信号频率范围的信号,低通滤波器的上限设为800 Hz。由于心音频率的下线为2~5 Hz,为了不损失低频分量,后面高通滤波器的截止频率设置为2 Hz[4]。采用二阶压控电压源低通滤波器,电路如图3所示。
(3)系统采用电源适配器来供电,不可避免地引入了50 Hz的工频干扰,而它正好落在心音信号的频带范围内,因此需要采用50 Hz工频陷波电路将其滤除。目前广泛使用的对称型双T有源滤波陷波器,但是对称型双T有源陷波器对电路元件的对称性要求较高,如不能满足对称性要求则会极大影响陷波器的中心频率和Q值。因此,本系统采用二阶无限增益多级反馈有源陷波器[5],如图4所示,其中C7=C8=C,中心频率的计算可参考式(1),Q值的计算可参考式(2)。
2.2 数字电路设计
考虑到转化精度和采样频率,没有采用S3C2440自带的A/D,而是选用了Maxim公司的四通道、16位量化精度芯片MAX11044。它具有固定的转换时间,能同时对四个通道采样,采样频率最高可达250 kHz,可保证对心音信号进行无失真采集。MAX11044输入电压范围为-5 V~+5 V,输入阻抗高达1 GΩ,对于适当放大后的心音信号无需电平抬升及外围阻抗匹配电路,可直接进行采用量化,从而简化外围电路。
通过控制MAX11044的CONVST引脚拉低持续时间来达到对采样频率的设置。当CONVST引脚为低时对模拟信号进行捕捉;当CONVST引脚为高时进行转换。由于心音信号的频带范围在20~800 Hz以内,并依据耐奎斯特采样定理和实际的硬件处理能力,A/D的采样率设定为10 kHz。由于MAX11044数据输出为并口,而且还需要多根控制线,在此选用Altera公司的CPLD芯片EPM570T144C5N作为数字电路控制核心,通过编写Verilog程序来控制,主要功能包括:(1)接收ARM9发来的命令控制A/D开启与关闭;(2)设置A/D的采样频率;(3)获取A/D转换的数据;(4)模拟SPI接口将数据通过SPI接口传送给ARM9。
3 系统软件设计
3.1 驱动程序的设计
驱动程序是操作系统与硬件的直接接口,驱动程序屏蔽了硬件的细节,使得应用程序可以像操作普通文件一样对硬件进行操作。在系统中S3C2440利用SPI接口来接收CPLD发来的数据。SPI是一种高速、全双工、同步的通信总线,并且在芯片的管脚上只占用4根线, S3C2440芯片上集成了两个SPI控制器,通过配置相关寄存器可以设置SPI的工作方式、主从关系、接收数据模式等。考虑到接收到的数据量大以及减少CPU的使用率,在此采用了DMA的数据接收方式,CPLD有数据就会自动发送过来,所以选择让ARM9做从设备。
驱动程序的接口用来描述驱动程序与设备的交互,当应用程序操作设备文件时调用open、read、write、close等函数,最终会调用对应的接口函数,这些接口函数封装在file_operations结构中,其结构如下:
static const struct file_operations spi_fops =
{ .owner= THIS_MODULE,//指向拥有该结构的模块
.open= spi_open,//打开设备接口函数
.read= spi_read,//读接口函数
.release=spi_release,//释放设备接口函数
};
(1)spi_open函数主要完成硬件的初始化工作,使用s3c2410_gpio_cfgpin()函数将所用到的引脚设置为SPI功能;开启SPI时钟,并且配置SPI有关的寄存器,主要包括读写模式、工作方式、主从关系等;由于使用了DMA的读写模式,因此需要配置相关的操作,包括设置DMA源和目的物理地址以及所在总线、缓存大小、传输模式;最后开启DMA。
(2)当应用程序调用read时,spi_read函数将被执行,在spi_read函数外,需要初始化等待队列dma_waitq和全局变量ev_dma,在spi_read函数中首先调用wait_event_interruputible(dma_waitq, ev_dma)函数。ev_dma为等待条件,当它为0时进程将休眠;当它为1时函数返回0,不休眠。当DMA的缓存达到了设定的值时,将产生DMA中断进入中断处理函数irqreturn_t DMA_irq(int irq,void *devid),在中断函数中将全局变量ev_dma设置为1,并且调用wake_up_interruptible(&dma_waitq)函数,它将唤醒dma_waitq等待队列上休眠的进程,然后在 spi_read函数中调用copy_to_user()函数把DMA缓存的数据拷贝到用户空间。
(3)当应用程序调用close函数时,相当于调用驱动程序中的spi_release函数,主要是关闭DMA通道。
3.2 Qt程序的设计
Qt是一个跨平台的C++图形用户界面程序开发框架,Qt开发的软件移植性非常好,编写好的代码只需使用不同平台的编译器编译,而不用修改代码,即可运行在不同的平台。软件使用了Qt/Embeded4.7以及扩展库Qwt来开发的,Qwt是一个基于Qt的扩展类库,包含了大量用于工程开发编程的GUI部件和辅助工具。除了二维绘图控件类外,它还提供了诸如刻度、滑块、转盘等控件类供开发使用[6]。采用的Qwt版本是qwt-6.0.1。程序流程如图6所示。
系统以Qt Creator为IDE,首先将Qwt导入Qt Creator中,利用交叉编译工具进行编译生成ARM版本的动态链接库,将这些链接库拷贝到采集板文件系统的“/lib”目录下。
3.2.1 界面布局及设置坐标轴及背景网格
在布局界面中使用了Qt中的布局管理器生成一个.ui的文件,通过拖拉左边的控件进行布局,非常方便。
网格主要是描述画布中X和Y轴的刻度划分和网格线的颜色,用到了类库中的QwtPlotGrid类;坐标轴的设置主要是对横轴、纵轴的刻度及其所代表的意思进行设置。使用到的相关函数如下:
void QwtPlot::setAxisTitle(int axisTd, const QwtTex &);
void QwtPlot::setAxisScale(int axisId, double min,
double max, double step=0);
void QwtPlot::setBackgroundRole(QPalette::colorRole);
3.2.2 绘制波形
首先使用类库中的QwtPlotCurve类生成4个绘图工具,然后设置这4个绘图工具的画笔颜色以及依附的画布,相关函数如下:
void QwtPlotCurve::setPen(const Qpen &);
void QwtPlotCurve::attach(QwtPlot *plot);
在点击开始按钮后就启动了一个定时器,每过5 ms就会自动触发一次timerEvent事件,在事件中通过调用read函数接收CPLD传来的数据。由于一次接收到的数据是4个通道的64位二进制数,因此需要将它提取出来,对应于每个通道转换为十进制,然后存放到yData数组中。有了绘图数据,就可以通过调用QwtPlotCurve类的绘图函数实现绘图,关键函数是:void QwtPlotCurve::setRawSamples(const double *xData, const double *yData, int size);函数中xData和yData指针分别指向一个一维数组,size表示要在画布上画多少个点。在没有外部中断的情况下将循环画图,屏幕上会出现连续的波形。
3.2.3 按键事件
在本系统中有3个按键,分别是开始、停止、保存。当点击开始按钮时将通过open函数打开spi_slave设备文件代码为:fd = ::open(“/dev/spi_slave”, O_RDWR); O_RDWR表示以只读方式打开文件,fd为open函数返回的文件描述符。点击停止按钮时将调用close函数停止接收数据并对屏幕清屏。当点击屏幕上的保存按钮时将弹出一个软件盘,提示输入要保存文件的名字,点击确认之后文件将以txt格式被保存在“/mnt/udisk”目录中,最后将接收到的全部数据写入刚才创建的文件中。
本文设计了四导心音采集显示系统,采用4个听诊头同时检测临床4个听诊部位(主动脉瓣、肺动脉瓣、三尖瓣和二尖瓣)的心音信号。从硬软两方面详细阐述了系统的设计流程。通过触摸屏来操作硬件非常方便,性价比高。本设计为后续的心音分析提供了可靠的数据。
参考文献
[1] 周婷玉,施元雪.新华网.我国成立“国家心血管病中心” [N/OL].(2010-08-13)[2013-4-20].http://news.xinhuanet. com/2010-08/13/c_13444113.htm.
[2] 周红标,蒋鼎国,柯永斌,等.基于STC单片机和LabVIEW的心音信号检测系统[J].电子技术应用,2012,38(1):31-33.
[3] 王晓燕,曾庆宁,栗秀尹.基于FPGA的心音信号采集[J].微型机与应用,2012,31(11):28-30.
[4] 邢素霞,陈天华.基于DSP的心音信号采集与分析[J].生物医学工程学杂志,2011,28(2):273-276.
[5] 史志怀,万遂人.脑电信号采集中工频陷波电路的设计[J]. 医疗装备,2009,22(11):12-13.
[6] 卢华伟.基于Qt/Qwt的操作监控系统的设计与实现[J].微计算机信息,2010,26(1):72-74.