【《基于STM32F103单片机的心电监测系统设计与实现》10000字(论文)】_第1页
【《基于STM32F103单片机的心电监测系统设计与实现》10000字(论文)】_第2页
【《基于STM32F103单片机的心电监测系统设计与实现》10000字(论文)】_第3页
【《基于STM32F103单片机的心电监测系统设计与实现》10000字(论文)】_第4页
【《基于STM32F103单片机的心电监测系统设计与实现》10000字(论文)】_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于STM32F103单片机的心电监测系统设计与实现目录 第1章绪论 11.1引言 11.1.1研究目的及意义 11.2国内外同类研究概况 11.2.1国外研究概况 11.2.2国内研究概况 21.3具体工作 21.4论文结构 3第2章心电信号的基础知识 42.1心电信号的产生 42.2心电信号的波形分析 42.3心电信号的特征 52.4心电信号测量方式 62.5心电信号的干扰 7第3章系统原理设计 83.1系统原理设计 83.2系统总体框架 8第4章系统硬件设计 104.1系统硬件组成 104.2STM32F103VCT6单片机最小系统 104.2.1STM32F103VCT6简介 104.2.2STM32F103VCT6引脚配置图 104.2.3STM32F103VCT6最小原理系统图 174.3ADS1292R心电采集传感器 184.3.1ADS1292R心电采集传感器简介 184.3.2ADS1292R引脚配置图 184.3.3心电采集原理图 204.4电源电路的设计 214.5TFT-SPFD5408液晶显示模块 224.5.1SPFD5408简介 224.5.2SPFD5408引脚配置图 224.5.3SPFD5408模块原理图 23第5章系统软件设计 245.1总体流程图 245.2ADS1292R传感器的配置 255.3心电信号数据的获取 255.4KeiluVision5开发环境 275.4.1KeiluVision5简介 275.4.2KeiluVision5的使用 275.5STMStudio 33第6章结果和性能分析 346.1心电信号采集调试结果 346.2性能分析 37结论 38参考文献 40附录main.c 41附录SPI.C 52绪论引言研究目的及意义随着科技的发展,人们生活质量的提高,以及我国医学的提升。人们越来越重视身体健康,其中心脏病是人们关注的焦点。根据《2020年中国健康大数据》,平均每30秒,至少有一个人死于心脑血管疾病,中国因疾病而导致生产力丧失,最近10年造成5500亿美元的经济损失。冠心病、原发性高血压、脑梗塞消耗了我国2/3的心脑血管疾病治疗费用。因此怎么减少心脑血管疾病成为大家研究的重点。心脏病有一个特点发作快,抢救时间短,而且心脏疾病早期没有明显的征兆,在常规的心电图中很难检测到心脏疾病。STM32的出现给研究人员提供了一个新的选择。STM32系列是专为要求高性能、低成本、低功耗的嵌入式芯片。主流产品为STM32F0、STM32F1、STM32F3。本次我们使用的是STM32F1,拥有一流的外设包括1μs的双12位ADC,4兆位/秒的UART,18兆位/秒的SPI,18MHz的I/O翻转速度。低功耗包括在72MHz时消耗36mA(所有外设处于工作状态),待机时下降到2μA,ARM32位Cortex-M3CPU,最高工作频率72MHz,1.25DMIPS/MHz。单周期乘法和硬件除法。片上集成32-512KB的Flash存储器。6-64KB的SRAM存储器。心电图是反映心脏跳动时产生的电信号,可以把电信号给记录下来,成为心脏病的诊断和预测的一种方法。病房中的心电监测仪虽然能实时监测心电电波,但是只能监测人们静态下的心脏情况,况且人们不可能一直住在医院,人们需要生活,需要工作。因此人们需要一款便携的,24小时监测的心电监测节点。国内外同类研究概况国外研究概况英国生理学家Einthove在1887年用毛细管静电计记录了心动电流图。为了得到更准确的心电图信息,从1895年开始他展开了对心脏动作电流的研究,并在德•阿森瓦尔氏的镜影电流计基础上,改进了其设计方法,提高了心电图的质量。采用P、Q、R、S、T等字母标出心电图上的各波,这种标记方法一致沿用至今。同时制定了三种标准导联系统。在1912年他深入研究了正常心电图的波动范围后,提出了著名的“爱因托芬三角”理论。此后成为心电图的标准。国内研究概况在进入21世纪后,国内有一些公司已经开始便携式心电监测仪器的开发,类如同心管家公司,其品牌为CheckMe的心电检测仪器,尺寸小,集心电采集,心电上传,心电分析,视频问诊为一体,方便患者的自我检查,只有一个巴掌大,采用AI智能分析心电波,能够在手机APP上看到实时心电情况,手机和心电监测仪器之间采用蓝牙通信。随着嵌入式技术、通信技术和滤波技术的发展,体积小的无线监测节点将会引来一个大的快速发展期,医院老而大的心电监测仪将会慢慢被打败,作为一个积极发展的新兴技术,目前还面临着许多挑战,国内还没有建立起相关的标准,国内产品鱼目混珠,消费者无法辨识出无线心电仪的好坏。如何提高无线心电检测仪的准确度,如何建立起准确和理想的通信信道。这些技术问题都待解决。不过随着STM103F1系列芯片的推出,更准确的前端芯片ADS1292的出世,更准确的无线心电检测仪,将会被推出,期望它应用于家家户户的健康离我们不远了。具体工作在此设计中,我的主要工作内容有:查阅相关资料,了解STM32F103VCT6芯片,ADS1292R心电传感器的有关知识。学习使用KeiluVision5开发环境,并利用这个软件开发STM32。学习使用STMStudio软件,并利用这个软件进行STM32调试。用开发板和ADS1292R心电传感器进行连接,实现心电信号的读取。深入了解各模块功能,结合硬件不断调试,实现心电信号的采集。进行多次数据调试,查看心电信号,记录、整理并分析。总结毕业设计内容,撰写论文。论文结构此篇论文分为以下几个部分:第一部分:绪论。首先描述心电监测系统的研究目的及意义,引出心电监测的重要性。再介绍国内外心电监测系统的发展以及取得的成果,揭露了心电监测系统良好的发展前景。介绍了本次毕业设计的重点工作内容,最后是对论文整体框架的说明。第二部分:心电信号的基础知识。主要介绍心电信号的产生,心电信号的波形分析,心电信号的特征,心电信号测量方式,心电信号的干扰。第三部分:系统原理设计。首先简单说明心电监测系统的设计原理,接着介绍系统总体框图,很直观展示系统的工作流程。第四部分:系统硬件设计:首先介绍系统硬件组成模块,然后说明各模块的基本信息、引脚配置和原理图,最后给出系统总体原理图和实物图。第五部分:系统软件设计。首先是软件的系统流程图,详细展示ADS1292R心电传感器和STM32F103VCT6的工作过程。接着介绍KeiluVision5和STMStudio的使用方法,接着是代码分析,配置ADS1292R心电传感器和软件FIR滤波的程序。第六部分:结果和性能分析。开始先介绍整体调试的结果,再介绍调试中遇到的问题,最后附上调试的心电图信号。最后是本次毕业设计的总结,致谢,并在附录中附上部分主要代码。

心电信号的基础知识心电信号的产生当心脏正常工作时,窦房结发出专有的信号,传向心房和心室,让整个心脏处于兴奋状态。在每个心动周期中,心脏所有部分出现的电信号的参数,例如时间、方向、途径和次序都是特定的。当皮肤上收到体液作为导体传过来的特定电信号,让我们可以从皮肤上观察到心电信号的变化,即心电位。从生理学上来说,可以把心脏看成一个放电组织,每一个细胞都能放电和传导电(但不同部位和不同细胞会有差异)。把每个心肌细胞的电冲动可以看成矢量-向量,人体是个导体,心电图是所有细胞电冲动的矢量和。图STYLEREF1\s2SEQ图\*ARABIC\s11心脏结构心电信号的波形分析心电图反映心脏跳动的情况,是一组有规律和有节奏的周期性电信号变化曲线,心电信号的每个波段代表心脏某一特定组织结构的健康活动状况。在医学诊断上具有诊断值。图STYLEREF1\s2SEQ图\*ARABIC\s12一个标准的心电周期波形P波:最早出现的波,心房除极波。P-R段:心房开始复极到心室开始除极。P-R间期:心房开始除极到心室开始除极的时间。QRS波群:左、右心室除极的全过程,幅值最大,参考价值最高的波。S-T段:QRS波群到T波起点的一条直线,代表心室缓慢复极的过程。T波:心室快速复极的过程。QT间期:心室开始除极到复极完毕全过程的时间。心电信号的特征心脏是身体中极其重要的组织器官,人的生命健康和心脏的情况息息相关。人体血液的循环流动是靠心脏不间隔地收缩和舒张来实现的,生物电信号会在这个过程中产生,本文所利用的心电信号只是其中的一种,体表可以展现心肌细胞所发出的电信号,特征微小,而且信号到体表的这一路径中会伴随意想不到的干扰。心电信号一般情况下具有以下几种基本特征。不稳定性主要是由于个体的差异性和环境的差异性导致,心电信号的不稳定性有可能来自外界环境的干扰,也可能来自患者自己的干扰。无论这种不稳定性来自哪里,都将导致最后采集到的心电信号存在干扰,如果不能去除将导致误诊。微弱性心电信号是一种弱信号,很容易被干扰信号掩盖,幅值一般低于5毫伏,有的干扰信号幅值超过3V,使得完全看不出心电信号的各个波群,因此需要放大器去除大干扰信号和放大心电信号。低频性心电信号的频带比较窄,在0.5HZ~100HZ以内,而且一个标准的心电周期内,90%的能量集中在0.25HZ~35HZ之间,而且主要是QRS波群中。心电信号测量方式心电信号的测量原理是将电极贴片放在皮肤表面任意两个非等势面上,分别和采集前端的正负极相连,记录两个电极贴片的电位差变化。在心电信号测量中,这种电极贴片放置位置不同称为导联。我们这里用的是I型导联方式。I型导联是标准导联的一种。标准导联是两肢体导联线直接放在采集前端的正负极。基于三点假设而近似成立,指人体的心脏到左上肢、右上肢体、臀部三个点距离相等构成等边三角形图STYLEREF1\s2SEQ图\*ARABIC\s13标准I型导联心电信号的干扰心电信号很微弱,同时它的幅值也比较小,容易收到各种不确定因素的干扰,我们实际使用时无法完全避免干扰,只能尽量降低,常见的干扰一般有以下几种。(1)50HZ工频干扰50HZ的工频干扰由于心电采集仪器的电源和外界的电磁干扰引起,我们国家的市电电压交流频率为50HZ,市电和我们使用的电子设备会产生电磁场,电磁场在我们身上产生的干扰频率是50HZ。这个干扰的幅值比较大,不处理掉会掩盖我们的心电信号。(2)基线漂移心脏产生的心电信号基本上都会出现基线漂移,造成的后果是心电信号会上下移动,无法呈现在一条基准直线上,导致异常信号很难被我们识别出来。产生基线漂移的原因很多,比如人的运动,电极和皮肤接触不良等。肌电干扰肌电信号伴随着肌肉细胞的收缩产生,它的幅值比心电信号低很多,但是它产生的干扰是不容忽视的,肌电信号和心电信号一起被采集,但是肌电信号的带宽比较大,5HZ-2000HZ之间,完全覆盖心电信号,给心电信号的识别带来巨大的影响,一般通过滤波处理。系统原理设计系统原理设计本次毕业论文的目的是用STM32F103单片机组成一套心电监测系统,能够实时采集人体的心电信号。所设计的心电监测系统的组成部分为传感器,显示模块,单片机模块。所设计的心电监测系统以STM32F103VCT6单片机为主要的部件,心电信号由心电采集传感器ADS1292R电路部分采集,ADS1292R和STM32F103VCT6之间的数据交互通过SPI通信接口实现,采用TFT-SPFD5408液晶显示模块显示心电图。系统总体框架图STYLEREF1\s3SEQ图\*ARABIC\s11心电监测系统总体框架图图STYLEREF1\s3SEQ图\*ARABIC\s12ADS1292R传感器组成本文的设计是一套基于STM32单片机的心电监测系统,实现实时采集心电信号。该系统的主要组成部分包括:STM32F103VCT6单片机,心电采集传感器ADS129R,液晶显示TFT-SPFD5408,上机位STMStudio。STM32F103VCT6具有极高的性价比。心电采集传感器ADS1292R内部集成右腿驱动电路,放大和滤波电路,ADC电路把输出信号转化为数字信号,不用再进行模数转换,不用额外设计电路,简单实用。具体工作过程;ADS1292R通过三导联电极采集心电信号,经过芯片内部的右腿驱动电路和放大滤波电路后,再把心电信号送入ADC电路,转化为数字信号,数字信号通过SPI通信协议传给STM32F103VCT6单片机,在单片机内部进行软件FIR滤波,过滤工频信号,再通过TFT-SPFD5408显示出图形,可以通过上机位STMStudio显示出ADC后数字信号和软件FIR滤波后的数字信号,方便我们直观地观察心电监测系统的工作。系统硬件设计系统硬件组成本次论文设计的心电监测系统的硬件部分由STM32F103VCT6最小系统,ADS1292R心电采集模块,系统电源供电模块和TFT-SPFD5408显示模块。STM32F103VCT6单片机最小系统STM32F103VCT6简介STM32F103VCT6是意法半导体公司生产的32位单片机,有可靠性高和性价比高等特点。主要特点如下:内核用高性能的ARM®Cortex™-M332位的RISC内核,工作频率为72MHz。存储器闪存:256K,SARM:48K。通信接口SPI(I2S):3个(SPI1、SPI2、SPI3),其中SPI2和SPI3可作为I2S通信。I2C:2个(I2C1、I2C2)。USART/UART:5个(USART1、USART2、USART3、UART4、UART5)。USB:1个(USB2.0全速)。CAN:1个(2.0B主动)。SDIO:1个。GPIO端口:80。CPU频率和工作电压:72MHz,2.0V-3.6V。STM32F103VCT6引脚配置图STM32F103VCT6引脚配置如REF_Ref71294514\h图41STM32F103VCT6引脚配置图所示。各引脚详细说明如表4.1,4.2,4.3,4.4,4.5所示。图STYLEREF1\s4SEQ图\*ARABIC\s11STM32F103VCT6引脚配置图脚位(LQFP100)管脚名称类型I/O电平主功能(复位后)默认复位功能1PE2I/OFTPE2TRACECK/FSMC_A232PE3I/OFTPE3TRACECK/FSMC_A193PE4I/OFTPE4TRACECK/FSMC_A204PE5I/OFTPE5TRACECK/FSMC_A215PE6I/OFTPE6TRACECK/FSMC_A226VBATSVBAT7PC13-TAMPER-RTCI/OPC13TAMPER-RTC8PC14-OSC32_INI/OPC14OSC32_IN9PC15-OSC32_OUTI/OPC15OSC32_OUT10VSS_5SVSS_511VDD_5SVDD_512OSC_INIOSC_IN13OSC_OUTOOSC_OUT14NRSTI/ONRST15PC0I/OPC0ADC123_IN1016PC1I/OPC1ADC123_IN1117PC2I/OPC2ADC123_IN1218PC3I/OPC3ADC123_IN1319VSSASVSSA20VREF-SVREF-21VREF+SVREF+22VDDASVDDA23PA0-WKUPI/OPA0ADC123_IN0WKUP/USART2_CTSTIM2_CH1_ETRTIM5_CH1/TIM8_ETR24PA1I/OPA1PA1USART2_RTSADC123_IN1TIM5_CH2/TIM2_CH2表STYLEREF1\s4SEQ表\*ARABIC\s11引脚表脚位(LQFP100)管脚名称类型I/O电平主功能(复位后)默认复位功能25PA2I/OI/OPA2USART2_TXTIM5_CH3ADC123_IN2TIM2_CH326PA3I/OPA3USART2_RXTIM5_CH4ADC123_IN3TIM2_CH427VSS_4SVSS_428VDD_4SVDD_429PA4I/OPA4SPI1_NSSUSART2_CKDAC_OUT1ADC12_IN430PA5I/OPA5SPI1_SCKDAC_OUT2ADC12_IN531PA6I/OPA6SPI1_MISOTIM8_BKINADC12_IN6TIM3_CH132PA7I/OPA7SPI1_MOSITIM8_CH1NADC12_IN7TIM3_CH233PC4I/OPC4ADC12_IN1434PC5I/OPC5ADC12_IN1535PB0I/OPB0ADC12_IN8TIM3_CH3TIM8_CH2N36PB1I/OPB1ADC12_IN9TIM3_CH4TIM8_CH3N37PB2I/OFTPB2/BOOT138PE7I/OFTPE7FSMC_D439PE8I/OFTPE8FSMC_D5表STYLEREF1\s4SEQ表\*ARABIC\s12引脚表脚位(LQFP100)管脚名称类型I/O电平主功能(复位后)默认复位功能40PE9I/OFTPE9FSMC_D641PE10I/OFTPE10FSMC_D742PE11I/OFTPE11FSMC_D843PE12I/OFTPE12FSMC_D944PE13I/OFTPE13FSMC_D1045PE14I/OFTPE14FSMC_D1146PE15I/OFTPE15FSMC_D1247PB10I/OFTPB10I2C2_SCLUSART3_TX48PB11I/OFTPB11I2C2_SDAUSART3_RX49VSS_1SVSS_150VDD_1SVDD_151PB12I/OFTPB12SPI2_NSSI2S2_WSI2C2_SMBAUSART3_CKTIM1_BKIN52PB13I/OFTPB13SPI2_SCK/I2S2_CKUSART3_CTSTIM1_CH1N53PB14I/OFTPB14SPI2_MISOTIM1_CH2NUSART3_RTS54PB15I/OFTPB15SPI2_MOSII2S2_SDTIM1_CH3N55PD8I/OFTPD8FSMC_D1356PD9I/OFTPD9FSMC_D14表STYLEREF1\s4SEQ表\*ARABIC\s13引脚表脚位(LQFP100)管脚名称类型I/O电平主功能(复位后)默认复位功能57PD10I/OFTPD10FSMC_D1558PD11I/OFTPD11FSMC_A1659PD12I/OFTPD12FSMC_A1760PD13I/OFTPD13FSMC_A1861PD14I/OFTPD14FSMC_D062PD15I/OFTPD15FSMC_D163PC6I/OFTPC6I2S2_MCKTIM8_CH1SDIO_D664PC7I/OFTPC7I2S3_MCKTIM8_CH2SDIO_D765PC8I/OFTPC8TIM8_CH3SDIO_D066PC9I/OFTPC9TIM8_CH4SDIO_D167PA8I/OFTPA8USART1_CKTIM1_CH1MCO68PA9I/OFTPA9USART1_TXTIM1_CH269PA10I/OFTPA10USART1_RXTIM1_CH370PA11I/OFTPA11USART1_CTSUSBDMCAN_RXTIM1_CH471PA12I/OFTPA12USART1_RTSUSBDPCAN_TXTIM1_ETR72PA13I/OFTJTMSSWDIO表STYLEREF1\s4SEQ表\*ARABIC\s14引脚表脚位(LQFP100)管脚名称类型I/O电平主功能(复位后)默认复位功能73未连接74VSS_2SVSS_275VDD_2SVDD_276PA14I/OFTJTCKSWCLK77PA15I/OFTJTDISPI3_NSS/I2S3_WS78PC10I/OFTPC10USART4_TX/SDIO_D279PC11I/OFTPC11USART4_RX/SDIO_D380PC12I/OFTPC12USART5_TX/SDIO_CK81PD0I/OFTOSC_INFSMC_D282PD1I/OFTOSC_OUTFSMC_D383PD2I/OFTPD2TIM3_ETRUSART5_RX/SDIO_CMD84PD3I/OFTPD3FSMC_CLK85PD4I/OFTPD4FSMC_NOE86PD5I/OFTPD5FSMC_NWE87PD6I/OFTPD6FSMC_NWAIT88PD7I/OFTPD7FSMC_NE1/FSMC_NCE289PB3I/OFTJTDOSPI3_SCK/I2S3_CK90PB4I/OFTNJTRSTSPI3_MISO91PB5I/OPB5I2C1_SMBA/SPI3_MOSII2S3_SD92PB6I/OFTPB6I2C1_SCL/TIM4_CH193PB7I/OFTPB7I2C1_SDA/FSMC_NADVTIM4_CH294BOOT0IBOOT095PB8I/OFTPB8TIM4_CH3/SDIO_D496PB9I/OFTPB9TIM4_CH4/SDIO_D597PE0I/OFTPE0TIM4_ETR/FSMC_NBL098PE1I/OFTPE1FSMC_NBL199VSS_3SVSS_3100VDD_3SVDD_3表STYLEREF1\s4SEQ表\*ARABIC\s15引脚表STM32F103VCT6最小原理系统图图STYLEREF1\s4SEQ图\*ARABIC\s12最小系统图工作过程:VDD_1(50),VDD_2,VDD_3,VDD_4,VDD_5接+3.3V电源,VSS_1,VSS_2,VSS_3,VSS_4,VSS_5接地。复位引脚(14脚)是低电平有效。在设计的电路中,按键RESET未按下时,NRST为高电平,按下按键RESET,NRST为低电平,实现复位。ADS1292R心电采集传感器ADS1292R心电采集传感器简介ADS1292R是多通道同步采样24位Δ-Σ模数转换器(ADC),它们具有内置的可编程增益放大器(PGA)、内部基准和板载振荡器。ADS1292R包含便携式低功耗医疗心电图(ECG)、体育和健身应用通常所需的所有功能。两个低噪声PGA和两个高分辨率ADC,数据速率:125SPS至8kSPS,CMRR:120dB,可编程增益:1、2、3、4、6、8或12,电源:单极或者双极模拟:2.7V至5.25V,数字:1.7V至3.6V。内置右腿驱动放大器、持续断线检测、测试信号。SPI™兼容串行接口。ADS1292R引脚配置图ADS1292R心电采集传感器引脚如REF_Ref71297458\h图43ADS1292R引脚图所示,各引脚详细说明如REF_Ref72408841\h表46引脚说明所示。图STYLEREF1\s4SEQ图\*ARABIC\s13ADS1292R引脚图编号引脚名称类型说明1PGA1N模拟输出PGA1反相输出2PGA1P模拟输出PGA1同相输出3IN1N模拟输入差分模拟负输入14IN1P模拟输入差分模拟正输入15IN2N模拟输入差分模拟负输入26IN2P模拟输入差分模拟正输入27PGA2N模拟输出PGA2反相输出8PGA2P模拟输出PGA2同相输出9VREFP模拟输入/输出正基准输入/输出电压10VREFN模拟输入负参考电压11VCAP1-模拟旁路电容器12AVDD电源模拟电源13AVSS电源模拟接地14CLKSEL数字输入主时钟选择15EQ\*jc2\*hps12\o\ad(\s\up11(——————),PWDN)/EQ\*jc2\*hps12\o\ad(\s\up11(——————),RESET)数字输入断电或复位16START数字输入开始转换17CLK数字输入主时钟输入18EQ\*jc2\*hps12\o\ad(\s\up11(————),CS)数字输入SPI芯片选择19DIN数字输入SPI数据输入20SCLK数字输入SPI时钟21DOUT数字输出SPI数据输出22EQ\*jc2\*hps12\o\ad(\s\up11(——————),DRDY)数字输出数据收发准备23DVDD电源数字电源24DGND电源数字接地25GPIO2/RCLK2数字输入/输出通用IO或应答时钟226GPIO1/RCLK1数字输入/输出通用IO或应答时钟127VCAP2-模拟旁路电容器28RLDINV模拟输入右腿驱动反相输入29RLDIN/RLDREF模拟输入右腿驱动输入30RLDOUT模拟输出右腿驱动输出31RESP_MODP/IN3P模拟输入/输出呼吸测量,正极侧32RESP_MODN/IN3N模拟输入/输出呼吸测量,负极侧表STYLEREF1\s4SEQ表\*ARABIC\s16引脚说明心电采集原理图图STYLEREF1\s4SEQ图\*ARABIC\s14ADS1292R传感器原理图开始工作时:三个导联线通过音频接口输入,音频接口的使用可以大大方便我们统一采集心电信号,心电信号RA和LA先通过一个低通RL滤波器,根据,算出截止频率为861HZ,可以过滤掉一部分高频信号。我们需要对IN2P和IN2N所接入的PGA2进行设置,我们设置增益为6,我们通过PGA2P和PGA2N接入47nF组成RL滤波器,实际上是一个抗混叠滤波器,我们ADC的采样频率应该是256HZ,根据公式,截止频率=采样频率/2.56,计算得出截至频率为100HZ,采用47nF的电容,截至频率为84HZ,方便ADC采样,我们所采用的是第二个ADC通道,我们需要设置最重要的两个参数,标准采样电压和采样速率,在这里把采样电压设置为内部标准电压,采样速率设置为256SPS,ADS1292R芯片设置为连续读取模式,当完成一个ADC周期,DRDY被拉低,ADS1292R通过CS,SCLK,DIN和DOUT和STM32F103VCT6进行SPI通信,通过SPI协议传输DRDY的状态给STMF103VCT6,DADY被拉低,触发STMF103VCT6的外部中断,把ADC转换后的数据存储到数组,再进行FIR软件滤波。电源电路的设计心电信号的工频干扰一部分来自于电源,因此电源的设计十分重要。AMS1117-3.3能将+5V的电压正向降压成+3.3v输出。图STYLEREF1\s4SEQ图\*ARABIC\s15AMS1117-3.3引脚图表STYLEREF1\s4SEQ表\*ARABIC\s17引脚定义图STYLEREF1\s4SEQ图\*ARABIC\s16电源转换电路TFT-SPFD5408液晶显示模块SPFD5408简介SPFD5408是一款彩色LCD显示屏,能够显示中英文、字符串、绘制简单图型以及显示小图片。SPFD5408引脚配置图引脚说明1,15地2,163.3V电压。7,9,11,13,17,19,23,25,6,8,10,12,14,18,24,26数据总线。3时钟线引脚:SPI1_CLK5主出从入引脚:SPI1_MOSI21液晶复位:LCD_RST27触摸中断引脚:PENIRQ29读操作:LCD_NOE31,32SD卡片选引脚:SD_CS4主入从出引脚:SPI1_MISO20主出从入引脚:SPI1_MOSI28触摸屏片选引脚:TP_CS30写操作:LCD_NWE表STYLEREF1\s4SEQ表\*ARABIC\s18SPFD5408引脚SPFD5408模块原理图图STYLEREF1\s4SEQ图\*ARABIC\s17SPFE5408显示模块原理图系统软件设计总体流程图图STYLEREF1\s5SEQ图\*ARABIC\s11软件总体流程图一但上电,STM32F103VCT6将从main.c函数开始执行,我们需要初始化我们使用到的外设,在本次设计中我们将会使用ADS1292R心电传感器,串口,SPI1,液晶显示屏,ADS1292R有两种模式的数据发送,一个是单个数据发送,一个是根据DARY的状态连续发送数据,为了简化我们的操作,我们选用连续数据发送模式,我们通过SPI1向ADS1292R发送RDATAC命令启动。我们使用外部中断来实现数据的自动读取,ADS1292R有一个特点,当ADC完成一次数据的转换,DARY会被拉低,然后触发外部中断,进入外部中断处理函数处理,数据进入数组,软件FIR滤波以数组为单位进行滤波。滤波后的数据发送到显示屏上显示出来,整个过程完成。ADS1292R传感器的配置图STYLEREF1\s5SEQ图\*ARABIC\s12ADS1292R的配置通过本次论文第二章的心电信号基础部分我们知道,心电信号的频率是5HZ-100HZ,根据奈奎斯特定理,在进行模数转换的时候,当采样频率大于信号中最高频率的两倍时,采样之后的数字信号完整保留原始信号中信息。所以我们这里设置ADS1292R的ADC采样速率为250SPS。还有配置PGA(可编程增益放大器)的增益倍数,当增益为6时,干扰最小。心电信号数据的获取图STYLEREF1\s5SEQ图\*ARABIC\s13PA3的中断设置我们通过PA3作为ADS1292R的DARY中断入口,设置中断为下降沿触发,因为ADC转换完成时,DARY被拉低,也就是数据转换完成,直接触发STM32F103VCT6的外部中断。图STYLEREF1\s5SEQ图\*ARABIC\s14中断处理图STYLEREF1\s5SEQ图\*ARABIC\s15ADC输出数据格式根据REF_Ref71310518\h图55ADC输出数据格式的说明,我们可以看出从ADC输出的数据一共是72位,也就是9个字节。因此我们在通过SPI读取数据时要注意,要读取9次,才是一个完整的ADC输出数据。而且第二个要注意的是,ADC输出数据是高位在前,我们的心电xinh1的CH2,也就是下标位6,7,8的数组,通过左移来获取CH2的数据,下标为6的数组是最高位。KeiluVision5开发环境KeiluVision5简介KeiluVision5是专门为ARM内核系列单片机开发的集成编译环境,操作简单,容易上手。KeiluVision5的使用图STYLEREF1\s5SEQ图\*ARABIC\s16KeiluVision5图标首先去官网下载KeiluVision5软件,安装教程的步骤安装和注册。去KEIL的官网下载STM32F10X系列的芯片包,去STM32官网下载标准外设库函数包。打开KeiluVision5软件图STYLEREF1\s5SEQ图\*ARABIC\s17步骤一在任何一文件夹下面添加如下文件图STYLEREF1\s5SEQ图\*ARABIC\s18步骤二新建一个工程,Project,并选择之前的Project文件夹。选择工程名字和所使用的STM32具体型号,并把标准外设库的文件复制到这些文件夹中。图STYLEREF1\s5SEQ图\*ARABIC\s19步骤四图STYLEREF1\s5SEQ图\*ARABIC\s110步骤五在ManageProjectItems中添加如下文件夹,加入外设库的函数。图STYLEREF1\s5SEQ图\*ARABIC\s111步骤六点击Target1的C/C++项目,在IncludePaths中把之前文件的路径加进去。把全局宏定义也加进去。图STYLEREF1\s5SEQ图\*ARABIC\s112步骤七图STYLEREF1\s5SEQ图\*ARABIC\s113步骤八新建main函数,并加入USER文件夹中。图STYLEREF1\s5SEQ图\*ARABIC\s114步骤九图STYLEREF1\s5SEQ图\*ARABIC\s115步骤十编译无错误下载,下载之前的调试。图STYLEREF1\s5SEQ图\*ARABIC\s116步骤十一图STYLEREF1\s5SEQ图\*ARABIC\s117步骤十二图STYLEREF1\s5SEQ图\*ARABIC\s118步骤十四STMStudioSTMStudio是STM公司开发的图形用户界面,比串口助手更好用,运行采样和可视化STM32运行中的变量。省去了开发上位机的复杂过程。图STYLEREF1\s5SEQ图\*ARABIC\s119STMStudio界面结果和性能分析心电信号采集调试结果由于存在工频信号的巨大干扰我们直接测量心电信号根本无法发现标准的心电图。频率在50HZ,幅值在720mv,远远大于心电信号的10mv。图STYLEREF1\s6SEQ图\*ARABIC\s11工频干扰图STYLEREF1\s6SEQ图\*ARABIC\s12幅度值心电信号ADC后的心电数据如图所示。存在很大基线漂移,很难在一条直线上。图STYLEREF1\s6SEQ图\*ARABIC\s13ADC后的心电信号经过软件FIR滤波后的心电信号,明显有了质的提升。图STYLEREF1\s6SEQ图\*ARABIC\s14FIR后心电信号图STYLEREF1\s6SEQ图\*ARABIC\s15ECG电极图STYLEREF1\s6SEQ图\*ARABIC\s16STM32F103VCT6主板图STYLEREF1\s6SEQ图\*ARABIC\s17LCD上校准的波形性能分析经过医用级别的ADS1292R心电采集传感器和STM32F103VCT6单片机的处理,我们基本上以及能够看到一个标准的心电图周期。QRS波段很清晰。结论心电监测系统技术已经变得很成熟,人们有希望能用上小巧、精确、廉价的心电监测仪器。但是将超高性价比的STM32F103系列单片机作为核心,并采用高精度的医用级别的ADS1292R心电采集传感器实现集成化测量心电信号是本系统的一个亮点。此次设计以STM32F103VCT6单片机作为核心,采样心电采集传感器ADS1292R电路采集心电信号。并通过右腿驱动电路,PGA电路,24位高精度ADC模块处理带有很多干扰的心电信号,并通过TFT-SPFD5408液晶显示器显示出来。通过上机位显示过程中的数据,便于我们发现问题,解决问题。到目前为止,经过2个月的学习与研究,本次毕业设计已经完成了预期的目标,成功地从众多干扰信号中采集出心电信号,并计算出心率。在整个设计过程中,我学习到了嵌入式技术,通信技术,C语言等方面的各种知识。总的来说,心电监测系统的原始设计目标已经全部完成,但是由于人体的差异性,导致心电图会有些差异性,还有由于使用排线导致信号的传输不太稳定,带来了一些新的干扰,未来可以把ADS1292R心电采集传感器和STM32F103VCT6放在一块PCB板上。

参考文献许克诚.临床心电图学教程[M].北京:人民卫生出版社,1999:139-149.李建林.基于STM32的便携式心电监测系统设计[D].西安工业大学,2016.刘博,郭君岩,刘伟,邵丽艳,刘强.基于STM32F103RCT6的数据采集显示系统设计[J].电子世界,2018(02):146-147.陈嘉绪,周颖.基于AD8232的心电实时监测及分析系统设计[J].计算机测量与控制,2017,,25(2):26~31.陈爽,姜帅臣,张晨.基于STM32便携式心电图仪的设计[J].物联网技术,2016(6):26~27.谢顺,张斌.基于STM32心电采集仪设计[J].电子科技,2014(4):108~110.王大雄.嵌入式便携心电监护仪的功耗降低方法研究[J].工程设计学报,2004,4:99-102.王永虹,徐炜等.STM32系列ARMCortex-M3微控制器原理与实践[M].2008:26-40.曾宇.高噪声背景下的信号检测和估计方法研究[J].浙江大学硕士学位论文.2006:52-52.M.J.Shensha.NonWinnersolutionsoftheadaptivenoisewithanosiyreference.IEEETransAeoust.SpeeehSignalProcess[J].1980:PP28~468.ARMLimited.ARMCortex-M3TechnicalReferenceManual,2006[Z].STMicroelectronics.STM32F10xxApplicationNote(EN),2008[Z].杨猛.广播中继系统与心电监护系统设计[D].天津大学,2014.武利珍.基于STM32的便携式心电图仪的设计与实现[D].杭州电子科技大学,2009.朱检兵.基于STM32便携式心电监护系统的设计[D].南昌大学,2019.吴正平.无线多参数生理电信号采集系统设计与实现[D].东南大学,2016.赵彦峰.手持式多生理参数采集系统的研究与设计[D].天津工业大学,2018.ChenNanKai,WangYaonan,LiuXiaoqing.Designandimplementatioofaportableintelligentelectrocardiograph[C].IEEE会议论文,2014.附录main.c#include"stm32f10x.h"#include"Delay.h"#include"LED.h"#include"lze_lcd.h"#include"usart.h" #include"ADS1292.h" #include"spi.h"#include"EXTInterrupt.h"#include"PeripheralInit.h"#include"arm_math.h"////主程序//#defineDraw_Number 320 //绘制点数#defineSamples_Number30 //采样点数#defineBlock_Size30 //调用一次arm_fir_f32处理的采样点个数#defineNumTaps 129 //滤波器系数个数uint32_tblockSize=Block_Size; //调用一次arm_fir_f32处理的采样点个数uint32_tnumBlocks=Samples_Number/Block_Size;//需要调用arm_fir_f32的次数float32_tInput_data[Samples_Number]; //输入缓冲区float32_tOutput_data[Samples_Number]; //输出缓冲区float32_tfirState[Block_Size+NumTaps-1]; //状态缓存,大小numTaps+blockSize-1u16i;u32ch2_data; //通道二的数据u8flog; //触发中断标志位u16point_cnt; //两个峰值之间的采集点数,用于计算心率u32Cache_data[30]; //ADS1292采集数据缓存u32Draw_data[Draw_Number]; //绘制波形数据u8t;u8len;//带通滤波器系数:采样频率为250Hz,截止频率为5Hz~40Hz通过filterDesigner获取constfloat32_tBPF_5Hz_40Hz[NumTaps]={3.523997657e-05,0.0002562592272,0.0005757701583,0.0008397826459,0.000908970891,0.0007304374012,0.0003793779761,4.222582356e-05,-6.521392788e-05,0.0001839015895,0.0007320778677,0.001328663086,0.001635892317,0.001413777587,0.0006883906899,-0.0002056905651,-0.0007648666506,-0.0005919140531,0.0003351111372,0.001569915912,0.002375603188,0.002117323689,0.0006689901347,-0.001414557919,-0.003109993879,-0.003462586319,-0.00217742566,8.629632794e-05,0.001947802957,0.002011778764,-0.0002987752669,-0.004264956806,-0.00809297245,-0.009811084718,-0.008411717601,-0.004596390296,-0.0006214127061,0.0007985962438,-0.001978532877,-0.008395017125,-0.01568987407,-0.02018531598,-0.01929843985,-0.01321159769,-0.005181713495,-0.0001112028476,-0.001950757345,-0.01125541423,-0.0243169684,-0.03460548073,-0.03605531529,-0.02662901953,-0.01020727865,0.004513713531,0.008002913557,-0.004921500571,-0.03125274926,-0.05950148031,-0.07363011688,-0.05986980721,-0.01351031102,0.05752891302,0.1343045086,0.1933406889,0.2154731899,0.1933406889,0.1343045086,0.05752891302,-0.01351031102,-0.05986980721,-0.07363011688,-0.05950148031,-0.03125274926,-0.004921500571,0.008002913557,0.004513713531,-0.01020727865,-0.02662901953,-0.03605531529,-0.03460548073,-0.0243169684,-0.01125541423,-0.001950757345,-0.0001112028476,-0.005181713495,-0.01321159769,-0.01929843985,-0.02018531598,-0.01568987407,-0.008395017125,-0.001978532877,0.0007985962438,-0.0006214127061,-0.004596390296,-0.008411717601,-0.009811084718,-0.00809297245,-0.004264956806,-0.0002987752669,0.002011778764,0.001947802957,8.629632794e-05,-0.00217742566,-0.003462586319,-0.003109993879,-0.001414557919,0.0006689901347,0.002117323689,0.002375603188,0.001569915912,0.0003351111372,-0.0005919140531,-0.0007648666506,-0.0002056905651,0.0006883906899,0.001413777587,0.001635892317,0.001328663086,0.0007320778677,0.0001839015895,-6.521392788e-05,4.222582356e-05,0.0003793779761,0.0007304374012,0.000908970891,0.0008397826459,0.0005757701583,0.0002562592272,3.523997657e-05 };//界面voidDrawinterface(void){ u16k; LCD_Line_H(0,161,320,LCD_COLOR_BLACK); //画一条实横线 for(k=0;k<7;k++) LCD_DotLine_H(0,(k+1)*20,320,LCD_COLOR_BLACK,LCD_COLOR_WHITE); //画虚横线 for(k=0;k<15;k++) LCD_DotLine_V((k+1)*20,0,160,LCD_COLOR_BLACK,LCD_COLOR_WHITE); //画虚竖线} intmain(void){ arm_fir_instance_f32S; u16j=0,k=0; u8but[64]; u16c1,c2,Draw_H; //点对应的液晶位置,与两点之间的距离 u32p_num=0; //用于刷新最大值和最小值 u32min[2]={0xFFFFFFFF,0xFFFFFFFF}; u32max[2]={0,0}; u32Peak; //峰峰值 u32BPM_LH[3]; //用于判断波峰 u16multiple=250; //液晶屏显示时波形的衰减倍数,模拟器衰减80倍,人体衰减250倍 floatBPM; //心率 flog=0; i=0; PeripheralInit();//外设初始化 Drawinterface(); LCD_WriteString(100,200,LCD_COLOR_BLACK,LCD_COLOR_WHITE,(uint8_t*)"HR:BPM"); //初始化结构体S arm_fir_init_f32(&S,NumTaps,(float32_t*)BPF_5Hz_40Hz,firState,blockSize); printf("\r\nPLEASEALEARYINPUT\r\n"); CS_L; Delay_1us(10);SPI1_ReadWriteByte(RDATAC); //发送启动连续读取数据命令Delay_1us(10); CS_H; START_H; //启动转换 CS_L; //显示波形前先获取最大值和最小值 while(k<1000) { if(i==0) { for(j=0;j<Samples_Number;j++) Input_data[j]=(float32_t)Cache_data[j]; //FIR滤波 arm_fir_f32(&S,Input_data,Output_data,blockSize); //比较大小 for(j=0;j<Samples_Number;j++) { if(min[1]>Output_data[j]) min[1]=Output_data[j]; if(max[1]<Output_data[j]) max[1]=Output_data[j]; } //刷新显示数据 for(j=0;j<Draw_Number-Samples_Number;j++) Draw_data[j]=Draw_data[j+Samples_Number]; for(j=0;j<Samples_Number;j++) Draw_data[Draw_Number-Samples_Number+j]=(u32)Output_data[j]; //每隔500个点重新测量一次最大最小值 if(p_num>4000) { min[0]=min[1]; max[0]=max[1]; min[1]=0xFFFFFFFF; max[1]=0; Peak=max[0]-min[0]; multiple=Peak/120; p_num=0; } p_num+=Samples_Number; k+=Samples_Number; } } while(1){ if(USART_RX_STA&0x8000) { printf("\r\nPLEASEALEARYINPUT\r\n"); len=USART_RX_STA&0X3f; printf("\r\nPLEASEALEARYINPUT"); for(t=0;t<len;t++) { USART_SendData(USART1,USART_RX_BUF[t]); while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET); } printf("\r\n\r\n"); USART_RX_STA=0; }else { printf("error\r\n"); } if(i==0) { for(j=0;j<Samples_Number;j++) Input_data[j]=(float32_t)Cache_data[j]; //实现FIR滤波 arm_fir_f32(&S,Input_data,Output_data,blockSize); //比较大小 for(j=0;j<Samples_Number;j++) { if(min[1]>Output_data[j]) min[1]=Output_data[j]; if(max[1]<Output_data[j]) max[1]=Output_data[j]; } //寻找峰值,并计算心率 for(j=0;j<Samples_Number;j++) { BPM_LH[0]=BPM_LH[1]; BPM_LH[1]=BPM_LH[2]; BPM_LH[2]=Output_data[j]; if((BPM_LH[0]<BPM_LH[1])&(BPM_LH[1]>max[0]-Peak/3)&(BPM_LH[2]<BPM_LH[1])) { BPM=(float)60000.0/(float)((point_cnt+j-Samples_Number)*4); if(BPM<200) { sprintf((char*)but,"%8.3f",BPM); LCD_WriteString(124,200,LCD_COLOR_RED,LCD_COLOR_WHITE,(uint8_t*)but); } point_cnt=Samples_Number-j-1; } } //消除上一次显示的点 for(j=0;j<Draw_Number-1;j++) { c1=160-((Draw_data[j])-min[0]+1000)/multiple; c2=160-((Draw_data[j+1])-min[0]+1000)/multiple; if(c1>=160) c1=159; if(c2>=160) c2=159; if(c1>c2) { Draw_H=c1-c2; LCD_Line_V(j,c2,Draw_H,LCD_COLOR_WHITE); } elseif(c1<c2) { Draw_H=c2-c1; LCD_Line_V(j,c1,Draw_H,LCD_COLOR_WHITE); } else { LCD_SetPoint(j,c1,LCD_COLOR_WHITE); } } //重新画网格 Drawinterface(); //刷新显示数据 for(j=0;j<Draw_Number-Samples_Number;j++) Draw_data[j]=Draw_data[j+Samples_Number]; for(j=0;j<Samples_Number;j++) Draw_data[Draw_Number-Samples_Number+j]=(u32)Output_data[j]; //每隔2000个点重新测量一次最大最小值 if(p_num>2000) { min[0]=min[1]; max[0]=max[1]; min[1]=0xFFFFFFFF; max[1]=0; Peak=max[0]-min[0]; multiple=Peak/120; p_num=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论