xzezhen 发表于 2013-11-30 21:04:25

【PSoC4】+心电脉搏血氧血压多参数便携式监护仪

本帖最后由 xzezhen 于 2013-11-30 21:03 编辑

    首先,很荣幸能够借助爱板网这个平台,参与PSOC4设计分享心得活动,进一步拉近了与CYPRESS的距离,也很感谢爱板网的工作人员,总能在自己松懈的时候不断督促着我们前进,感谢群里的弟兄和网上朋友们的热情分享PSOC设计,感谢Miss李背后支持,感谢Miss周,Mr.沈和Mr.刘的大力技术支持,让我顺利完成了这一次的PSOC4设计。
PS:由于这一次参加活动比较匆忙,很多地方也许做得还不够完善,还请大家多多指点,谢过了{:soso_e121:}!

心电脉搏血氧血压多参数便携式监护仪
Xzezhen   技术交流Q群293161406摘要
      本设计以可编程片上系统PSOC4微控制器为核心,以简单外围电路为辅助的创意设计,主要完成心电、脉搏血氧和血压模拟信号采集及处理系统的方案设计、并实现了硬件和软件设计。前端采集电路是关键部分,主要完成信号的正确提取。PSOC4完成模拟信号的 A/D 转换、SD卡存储、Bluetooth通信、系统菜单选择Capsense控制及LCD显示等功能。实现了以PSOC4为核心系统的心电波形信号、心率测量显示,血氧脉搏信号测量显示和人体血压测量显示,通过Bluetooth与PC机、Bluetooth与Mobile Telephone通信的多参数便携式监护仪产品设计。      PSOC4具有丰富的片上资源,可视化图形编程模式,可灵活配置,易扩展,功能强大,高可靠性为本产品设计提供了快速开发应用和极大地缩短了本项目研发周期。本设计能比较好地完成了预期的设想,并初步实现了硬件系统和软件系统的设计,完成了系统调试。经测试结果证明,基本达到了产品设计要求。

关键词:可编程片上系统,PSOC4,UART,Capsense,PWM背光,SPI LCD,SARADC,OpAMP,电容触摸,SD卡,Bluetooth,光电Sensor,气压Sensor,气泵控制,气阀控制,LCD显示,打印机,蜂鸣器,串口通信,心电,心率,血氧,脉搏,血压,Protel,Matlab,PSoCCreator。

基于PSoC4的心电脉搏血氧血压多参数便携式监护仪视频演示
http://player.youku.com/player.php/sid/XNjQxODI5NjUy/v.swf


一、硬件系统

1、PSoC4 Pioneer Kit硬件说明,如图(1):

图(1).PSoC4Pioneer Kit   

图(2).多参数便携式监护模块
本设计使用了PSoC4上的硬件资源有:
<1>RGB LED中的P1.6-Red Led,应用于系统工作指示灯;
<2>Capsense中的P1.1,P1.3,P1.5,分别应用于选择触摸按键和确定触摸按键;
<3>I/O P4.0蓝牙串口RXD,P4.1蓝牙串口TXD;
<4>I/O P0.3 LCD液晶显示背光灯PWM控制;
<5>I/O P1.4 蜂鸣器控制引脚;
<6>I/O SPI LCD引脚分配, P0.6-LCD_CLK, P0.7-LCD_CS,P3.0-LCD_MOSI, P3.1-LCD_MISO, P3.4-LCD_DC, P3.6-LCD_RST;<7>I/O 打印机控制引脚,P0.0-Pr_STB,P0.1-Pr_ACK,P0.2-Pr_BUSY,P2.7-Pr_Bit7,P2.6-Pr_Bit6,P2.5-Pr_Bit5,P2.4-   Pr_Bit4,P0.5-Pr_Bit3,P2.2-Pr_Bit2,P0.4-Pr_Bit1,P2.0-Pr_Bit0;
<8>I/O 脉搏血氧红光和红外光控制引脚,P3.5,P3.7;
<9>I/O 心电信号采集ADC模拟输入引脚P2.3;
<10>I/O 脉搏血氧信号采集ADC模拟输入引脚P2.1;
<11>I/O 血压传感器信号采集ADC模拟差分输入引脚P1.0和P1.7;

1、多参数便携式监护仪硬件说明,如图(2):
<1> LCD显示屏,Driver IC ILI9341,Size 2.2 inch,Color Depth 262K/65K,Resolution 240(RGB) x 320,Interface 4-Wire SPI, Viewing Direction 6 o’clock,LCM (W x H x D) (mm) 40.10x55.20x2.35,Active Area(mm) 33.84x45.12,LED Numbers 4 LEDs。<2> 蓝牙通信接口,连接蓝牙无线模块,与PC机,手机实时数据传输,波形显示存储等。
<3> 血压气泵和气阀控制接口,输出两路电压分别控制气泵打气和气阀放气。
<4> 气压传感器,主要采集充气气压和人体脉搏跳动压力变化信号。
<5>脉搏血氧传感器探头接口,连接光电传感器。
<6>心电信号采集接口,连接心电导联线。
<7>打印机接口,用于控制打印机实时打印心电波形和脉搏血氧波形。
2、气泵和气阀模块,如图(3):

图(2).多参数便携式监护模块
    气泵和气阀模块组成和控制方式都比较简单,直接控制电机正转就可以充气,气阀则是根据血压传感器采集到的压力信号大小来逐级放气过程。
二、软件系统

1、原理图和PCB设计软件,Altium Designer Summer 09,如图(4)。

   图(4).Schematic和PCB设计
                     
图(5).Matlab算法设计
    原理图和PCB设计也相对比较简单,因为PSOC4已经集成了好多片上模拟和数字资源,使得外部电路设计变得更加简洁,扩展也非常灵活,效率得到了提高。
2、数字信号处理和算法设计平台:Matlab,如图(5)。外围电路设计得相对简单,但要想产品功能和性能得到更大提高,软件设计是关键,特别是一些算法的设计处理,跟产品设计的成功有密切关系。本设计所用到算法有:心电信号低通滤波,高通滤波,带通滤波,带阻滤波,平衡滤波,抗基线漂移滤波算法,抗肌电干扰滤波算法,心率计算处理算法等。借助Matlab数学软件来进行数字信号处理和算法设计是一种高效率的方法。
3、PSoC4软件设计平台:PSoC Creator 3.0,如图(6)。

图(6).PSoCCreater软件设计平台
    从刚开始使用PSoC Creator2.0到2.1,2.2到3.0,这一路试用过来,特别是PSoC Creator3.0,颇有感触。PSoC Creator 3.0显著改善了集成固件编辑器,并允许导出到主要的ARM IDE。这样就可以在IAR和KeilMDK中进行二次开发,PSoC Creator 3.0拓充了PSoC解决方案的功能,简化了软硬件协同设计的流程,如采用新引入的通用数字模块(UDB)编辑器,还具有定制PSoC Components的能力。总的来说,PSoC Creator 3.0在各个功能进行了全面升级,使得设计者在开发过程中应用得更加灵活!
    现在来分析一下软件设计,找到项目工作空间,双击并打开,打开“TopDesign.cysch”顶层设计原理图,即可看到如图(6)的界面,软件的文件结构如图(7),图(8)是PSoC4 Pioneer Kit的引脚分布情况,结合硬件来设计原理图和软件感觉比较直观。

图(7).项目文件结构图               

图(8).PSo4 Pioneer Kit 引脚分布
    PSoC Creator顶层原理图设计是其它IDE无法媲美的,可视化编程和灵活的引脚分配让每一个设计者都可以轻松完成每一个项目设计。设计好原理图即可调用相应API函数实现功能应用,而本项目正是在这基础上让项目设计的更加完美。顶层设计由7大模块组成,如图(9)分别是:
<1>串口蓝牙模块,应用了“UART (SCB mode)”组件,实现跟蓝牙模块连接通信。
<2>Capsense是Creater组件中最强大的模块之一,不但好用而且很容易入手,通过右击即可打开其Datasheet,说明也很详细,应用起来非常方便,可以实现很多自己想要的功能。
<3>3通道ADC模块,PSOC4集成的序列逐次逼近SAR ADC功能更是强大,双击SAR ADC组件即可配置自己想要的功能,无论是采样时间,ADC参考电压,多通道采样还是单端输入或是差分输入都可以灵活配置。最好用的就是ADC差分输入,在项目设计中可以替代了一个差分放大电路,好多应用都可以进行界面设置。这一次采样了两个单端ADC输入和一个差分输入,差分输入主要是连接气压传感器,再加上PSOC4内部的两个运放跟随,气压传感器直接挂在IO口上面了。这模块里面应用到了一个PWM组件,主要是用来触发ADC采样的。
<4>PWM主要完成了LCD背光灯控制,让液晶显示效果更加人性化,利用PWM控制背光灯也可以降低产品功耗带来的问题。
<5>LCD显示模块,采用6线SPI模式的LCD控制节省了PSOC4的IO口开销,这也得益于PSOC集成有高速的SPI组件,液晶界面显示也比较令人满意。
<6>打印模块使用了PSOC上的ControlReg数字组件,这一组件比较简单,有数字电路基础的都可以直接应用了。
<7>系统工作指示灯和蜂鸣器没什么难度,指示灯工作直接调用SystemTick相关函数配置一下即可,蜂鸣器则是让IO口直接输出高低电平驱动。

图(9).顶层设计原理图

4、软件文件结构说明:由于源文件代码比较多,现贴出部分函数,其它代码可在工程项目中看到。
<1>main函数模块,程序执行的开始。程序如下:
#include <project.h>
#include "LCD\LCD.h"
#include "Micro_SDCard\Micro_SD.h"
#include "Printer\Printer.h"
#include "ECGWavePro\ECGWavePro.h"
#include "UartMaster\UartMaster.h"
#include "SPo2WavePro\SPo2WavePro.h"
#include "PSystemFlash\PSystemFlash.h"
#include "ButtonMenu\ButtonMenu.h"
int main(void)
{       
CyGlobalIntEnable; //打开全局中断       
SPI_Start();      //启动SPI组件   
UART_Start();       //启动串口组件   
CapSense_Start();   //启动电容触摸组件   
PWM_LCD_Start();    //启动PWM组件   
MyPWM_Init();         //初始化,配置TCPWM和启动TCPWM520bytes   
//SD_Init();          //SD卡初始化   
LCD_Initialize();       //LCD初始化,并清屏为黑色 568bytes   
LCD_MainDisplayInit();//开机界面      898bytes   
UartMaster_Init();      //串口初始化,发送命令跟上位机建立连接 6bytes   
PSystemFlash_Init();    //系统闪烁LED,systick初始化 176bytes   
ButtonMenu_Init();      //显示菜单界面 6bytes    //通过扫描所有的传感器,加载含初始值的CapSense_SensorBaseline[]数组。   
CapSense_InitializeAllBaselines();    
for(;;)
{      
       ButtonMenu_MainLoop();    //进入菜单界面   
}
}

<2>“ButtonMenu”按键菜单选择模块,完成电容触摸按键消息检查和传递。模块内部函数仅供内部调用,全局函数如下:      
extern uint16 ButtonValue; //电容按键消息全局变量      
extern uint8ButtonMenu_Value(void); //获得电容按键按下的键值      
extern voidButtonMenu_Init(void); //主界面初始化      
extern voidButtonMenu_MainLoop(void); //按键主循环      
extern void SPo2MenuSelect(void); //血氧界面菜单

<3>“ECGWavePro”模块是处理SAR ADC采集到的心电信号,全局函数如下:      
extern uint16 ECGData;      
extern voidECGWaveProInit(void); //心电波形处理初始化      
extern uint16 ECG_ADC_Conversion(void); //心电波形ADC转换      
extern voidECGWaveDraw( uint16 DrawData ); //画心电波形      
extern voidECGWavePrint( uint16 PrintData ); //开始打印心电波形      
extern void ECGWaveSendToPC( uint16 SendData ); //把心电波形数据发送到PC以下是心率计算算法:
extern int QRSDet(int datum);// Qrsdetection main function
extern int Peak( int datum );// Peak detection
extern int NewPeak(int aPeak); // Make sure if it is true QRS value
extern int DetThresh(int qmean, int nmean);    // Detectthreshhold value
extern double mean(int *arr, int LENGTH); //mean of anarray
extern void Datamove(int *pBuffer, int *arr, int Length);

<4>“Filter”是心电信号处理算法设计模块,实现数字信号处理。全局函数如下:
extern double IIR_HP_Filter(const double *pTable, double *pBuffer, int Xn);
extern double IIR_LP_Filter(const double *pTable, double *pBuffer, int Xn);
extern double IIR_Bandstop(const double *pTable, double *pBuffer, int Xn);
extern intLead_I_DriftFilter(int datum); // 去基线漂移滤波器extern int DNFilter(int datum, int Dstep, int Nlen, int *pBuffer, int InCnt);
extern intLead_II_DriftFilter(int datum);
extern intLead_III_DriftFilter(int datum);
extern int NotchFlter(int datum, int *xBuffer); // 去工频滤波器(运用卷积)
extern int deriv(int datum); // 差分extern int mvwint(int datum); // 移动窗口
extern void Shift2Left(int *array, int Length); // 移位函数
<5>“LCD”模块相对比较简单,主要是把液晶模块初始化好,写好画点等函数就可以了,函数如下:      extern void LCD_Show3216Char(unsigned int x,unsigned int y );      extern void LCD_Show6432Char(unsigned int x,unsigned int y );      extern void LCD_ShowCypressLogoPicture( unsigned int x0,unsigned int x1, unsigned int y0,unsigned int y1 );       extern voidLCD_ShowCypressLogoASCII(unsigned int x,unsigned int y );       extern voidLCD_Show4832Number(unsigned int x,unsigned int y,unsigned int num );       extern voidLCD_Show_Loading_Char(unsigned int x,unsigned int y );       extern voidLCD_Show3216xindian(unsigned int x,unsigned int y );       extern voidLCD_Show3216xuayang(unsigned int x,unsigned int y );       extern voidLCD_Show3216xuaya(unsigned int x,unsigned int y );      extern void LCD_Show_Picture(void);      extern void showimage(void);      extern void LCD_MainDisplayInit(void);       extern voidLCDBackLightControl_Bright(void);       extern voidLCDBackLightControl_Dark(void);      extern void Display_Grid(void);       extern voidLCD_DrawFrame(void);<6>“Printer”打印机模块应用于心电,脉搏波形打印,全局函数如下:      extern void Printer_Init(void); //打印机初始化      extern void MCU_SendCMD( unsigned char CMD ); //把数据发送给打印机      extern void ECGWavePrint_Stop(void); //停止打印       extern void DelayUs( unsigned int Cunter );<7>“PSystemFlash”系统滴答工作指示灯,全局函数如下:       extern void PSystemFlash_Init(void); //系统工作指示灯初始化<8>“NIBPPro”血压测量模块,气泵和气阀控制,气压传感器信号采集处理等,软件设计扩展中,全局函数如下:      extern void NIBPProInit(void);

<9>“Micro_SDCard”SD卡存储模块,心电数据,脉搏血氧数据,血压数据等存储,软件设计扩展中,全局函数如下:      extern void SPI_WriteData( unsigned char Data8 );      extern unsigned char SPI_ReadData( void );      extern unsigned char SD_Response(void);      extern void SD_CMD( unsigned char CMD, unsigned long Argument, unsigned char CRC );      extern unsigned char SD_Init(void);      extern unsigned char SD_Block_Write( unsigned char *Block, unsigned long address, unsigned int len );       extern unsigned char*SD_Block_Read( unsigned long address, unsigned int len );
<10>“SPo2WavePro”脉搏血氧饱和度信号处理模块,全局函数如下:      extern void MyPWM_Init(void); //PWM初始化      extern void SPo2WaveProInit(void); //血氧波形处理初始化      extern void SPo2WavePrint(void); //开始打印SPo2波形       extern voidSPo2WaveSendToPC(void); //把血氧波形数据发送到PC       extern void SPo2WaveDraw(void); //血氧电波形<11>“UartMster”串口蓝牙模块,实现心电,脉搏血氧,血氧信息无线传输功能,全局函数如下:      extern void WaveProc_EcgWaveSned( uint16 ecgData ); //根据协议发送心电数据包      extern void WaveProc_SPo2WaveSned( uint16 SPo2Data ); //根据协议发送血氧数据包       extern void UartMaster_Init(void); //Uart初始化<10>剩下的文件就是PSOC系统自生成的源代码了,相关的API函数和宏定义等都可以到里面找。
图(10).系统生成源码
三、作品展示



















四、结束        从PSOC3到PSOC5LP可编程片上系统项目应用,再到PSOC4开发工具的申请试用。这一路走来,经历多少风风雨雨,最终总会在风雨过后看到阳光的喜悦。从此,PSOC在脑海中留下了深刻的印象。PSOC具有丰富的片上资源,特别是PSOC Creator可视化图形编程模式,灵活的配置,非常容易扩展,功能也很强大,以零基础就可以快速入门进行工程设计,极大地提高了项目开发效率。       很荣幸在爱板网上申请到CYPRESS的PSOC4 PioneerKit开发工具,参加PSOC4试用活动。在这百忙之中能抽出时间完成PSOC4分享心得,也是得益于PSOC本身具有的快速开发效率,让大家在短时间内设计出自己的作品。       从PSOC4 Pioneer Kit开发工具回来之初,CYPRESS官网已成为常登陆网站,官网提供了很多相关资料,特别是100天100个项目设计和PSOC Creator上提高的例程,更是让我们无障碍进入产品开发之路。PSoC Creator IDE包含了超过110个PSoC组件,用户可以将这些组件拖放到设计中,并将其进行配置,使之适用于各种各样的应用需求。      本设计相对比较复杂,代码量也很大,特别融入了很多信号处理算法, PSOC4内设高达48MHz,43 DMIPS 的32位Cortex-M0 CPU能在这样复杂环境下发挥出色的处理功能。12 位1Msps 的逐次比较型模数转换器(SAR ADC), 图形功能配置,支持差分和单端输入,这样一个高性能的ADC模数转换,不再需要仪表放大器的另外开销,就可以实现差分电路和高精度ADC数模转换。强大的电容感应CapSense,可灵活配置,无需外接机械按键,即可实现环保的触摸感应带来的喜悦。总之,PSOC可视化的图形编程模式将会是未来的趋势!

PSOC Creator项目工程,多参数便携式监护仪模块原理图,Android APK文件和PC机上位机软件,文档说明等都在以下附件中了!欢迎大家下载指点!



mengyun2801 发表于 2013-11-30 21:24:34

顶一下,专业人员~~~~~~~~~~~~~~

pandyele 发表于 2013-11-30 21:59:56

设计的项目很详细,主次分明,涉及到的知识点很多,亮点多多,特别是还能把测量信息可以传输到手机上显示,给学习PSOC4提供一个很好的开发例程,很经典,给力,顶起!
楼主应该花了不少心思,辛苦了,谢谢分享!!

乔哥 发表于 2013-12-1 11:49:16

顶顶:):):):):):):):):):):):):):):)

xzezhen 发表于 2013-12-1 13:09:24

mengyun2801 发表于 2013-11-30 21:24 static/image/common/back.gif
顶一下,专业人员~~~~~~~~~~~~~~

哈哈...........:lol这没什么专业的了,只是把毕设近一步完善了而已:lol

xzezhen 发表于 2013-12-1 13:11:19

fuwen0202 发表于 2013-11-30 22:05 static/image/common/back.gif
呃,这个我也做过,但杂波太多,最后是换了传感器的传输线才好了,lz这个波形好,传感器的线却不咋样,滤波 ...

以前在学校做心电时候用的都是硬件滤波,效果没有数字滤波好啊,这一次的算法比较给力;P

xzezhen 发表于 2013-12-1 13:12:41

pandy 发表于 2013-11-30 21:59 static/image/common/back.gif
设计的项目很详细,主次分明,涉及到的知识点很多,亮点多多,特别是还能把测量信息可以传输到手机上显示, ...

小弟在此谢过了,希望能互相学习探讨呀:D

jlj8315292 发表于 2013-12-1 19:03:24

好贴!!!:lol:lol

xzezhen 发表于 2013-12-1 21:05:39

fuwen0202 发表于 2013-12-1 16:17 static/image/common/back.gif
不过你这个通频带是不是太窄了,心电的其他波形都看不到了,而且,这个波形最好有个能有个电平上移下,。 ...

学习应用看效果,滤波处理还是要狠一点波形才好哦:lol

xzezhen 发表于 2013-12-1 21:07:01

fuwen0202 发表于 2013-12-1 16:22 static/image/common/back.gif
目测,我和lz你应该是同一个专业的了。。。。。

好啊,同一个行业才有更多机会好好交流交流呀:handshake
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 【PSoC4】+心电脉搏血氧血压多参数便携式监护仪