张峻豪 尹鑫 贡振琦 张文杰
摘 要 本次设计是基于Cortex-M3内核的信号采集与数据处理的系统以实现人体生理信号的实时监控。通过Agcl电极片采集到人体肢体导联电压波形,利用模拟预先抗混叠处理滤除奈奎斯特区间以外的频率,再经过模拟前端将信号放大1000倍,得到放大后的波形。利用STM32单片机实现IIR实时滤波消除50HZ的工频干扰与基线漂移,通过LMT70和MPU6050测得人体实时的体温和运动状态,再通过串口透传将数据传输到PC端上位机,PC端进行数据分析与信息反馈到电脑中,实现医生对病人的情况进行实时监控。
关键词 心电图 IIR滤波 健康监测 运动检测
中图分类号:R1 文献标识码:A 文章编号:1007-0745(2020)02-0024-04
1 研究目的
本设计达成了对人体心率、体温和运动状态的实时监控,通过无线传输将数据传输到上位机加以处理和显示。通过对单个方案的改进,来实现以下特点:
(1)具有低功耗和便携性,以方便长时间的穿戴。
(2)達到高精度的心率和温度测量,具有很好的抗干扰能力。
(3)实现低延时高功率的无线传输,已实现实时显示的目的。
2 实施方案
2.1 总体流程图(如图1)
2.2 电源设计方案
方案所需的温度采集芯片、心电信号采集芯片以及运动传感监测都需要3.3v的电压保障其正常工作,所以我们通过LM2596稳压芯片将12v的电池输入调节成稳定的3.3v输出电压,用来供给整个系统。
同时注意到由于本设计采用的温度采集芯片为TI公司的LMT70,其特点是高精度的16位AD采样。为避免LM2596产生的电压波动影响温度的精准性,需使用3.3v的基准电压给LMT70以实现温度补偿,达到测量人体体温高精度的目的。
2.3 模拟前端放大器
采用AgCl电极片,减小基线漂移。心电信号通过二级放大,放大倍数1000倍以上,第一级采用仪表放大器AD620进行放大,二级电路用LM358和OP07构成放大。通过ebyte串口透传,用于STM32与电脑串口通信,附加MPU6050用于测步和测距以及跌倒检测。心电部分采用右腿驱动,减小工频干扰。通过RC与运算放大器构成有源带通滤波器,0.3HZ-106Hz的频率可以通过。电源部分采用AMS11175.0V和7660s构成一对正负5的电压为运放供电。通过AMS11173.3V稳压到3.3V为STM32进行供电。[1]
2.4 单片机部分
2.4.1 主控单元选取
由于心电采集芯片使用了TI公司的ADS1292芯片,具有24位的高精度AD采样。STM32系列的单片机具有片内的AD转换器和多个外设接口,具有很好的扩展和移植性,因此适合完成IIR实施滤波和应用扩展。
2.4.2 配置关键的ads1292芯片的寄存器
ADS1292_REG[CONFIG1] =0x00;//连续转换模式
ADS1292_REG[CONFIG1] |=Ads1292_Config1.Data_Rate;// 设置采样率125HZ
ADS1292_REG[CONFIG2] =0x00;//设置测试信号
ADS1292_REG[CONFIG2] |=Ads1292_Config2.Pdb_Loff_Comp<<6;//是否脱落
ADS1292_REG[CONFIG2] |=Ads1292_Config2.Pdb_Refbuf<<5;//缓冲器是否掉电ADS1292_REG[CONFIG2] |=Ads1292_Config2.Vref<<4;//参考电压2.4v
ADS1292_REG[CONFIG2] |=Ads1292_Config2.Clk_EN<< 3;//时钟脉冲
ADS1292_REG[CONFIG2] |=Ads1292_Config2.Int_Test<< 1;//是否打开测试信号
ADS1292_REG[CONFIG2] |=0x81;//默认位
2.4.3 配置关键的MPU6050寄存器
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);//复位MPU6050
MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);//唤醒MPU6050
MPU_Set_Gyro_Fsr(3);//陀螺仪传感器,±2000dps
MPU_Set_Accel_Fsr(0);//加速度传感器,±2g
MPU_Set_Rate(50);//设置采样率50Hz
MPU_Write_Byte(MPU_INT_EN_REG,0X00);//关闭所有中断
MPU_Write_Byte(MPU_USER_CTRL_REG,0X00);//I2C主模式关闭
MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);//关闭FIFO
MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80);//INT引脚低电平有效
2.5 信号干扰
2.5.1 干扰来源
通常由于电源线产生的50hz的工频干扰以及被测对象人体产生的热噪声干扰。[2]
工频干扰多数是因为空间辐射、电源、电路与外界的接触所产生的50hz信号,一般采用屏蔽、滤波、使用差分信号(提高共模抑制)来减低其对信号的影响。人体干扰常见的是肌肉震颤,其产生是因为人体肌肉颤动所造成的噪声信号(寒冷导致的战栗以及紧张引起的肌肉抽搐)。
2.5.2 基于MATLB的数字陷波
用陷波器来过滤50hz信号,高通滤波器来过滤人体产生的0.5hz以下的频率干扰。通常在设计中使用IIR或FIR滤波器,其中FIR虽然具有良好的线性相位,但是其运算量和阶数都比IIR更大,因此无论是陷波器还是高通滤波都采用IIR来设计。[3]
借助MATLAB可以帮助我们快速的生成相关的参数。再将其翻译成c语音形式即可直接应用于单片机平台。
导出滤波系数得到转移函数:[4]
再根据滤波器直接II型实现框图,翻译成c语言代码并烧录到主控芯片中运行。
c语言响应代码:
w4 = (float)p_Temp[1] - (-1.53589)*w2 - 0.898466*w3;
cannle[1]= (u32)(0.94923 * w4 + (-1.53589)*w2+0.949 23*w3);
w3 = w2;
w2 = w4;
2.5.3 基于MATLAB的高通濾波器
同样采用MTLAB生成的IIR的II阶高通滤波器来过滤掉人体产生的0.5hz以下的频率干扰,我们配置好相应参数后即可导出滤波系数。
得到响应函数:[5]
s32IIR_I_Filter(s32 InData,float *x,float *y,float *b,float nb, float *a,float na)
{
s32 z1,z2;
u8 i;
s32 OutData;
for (i=nb-1;i>0;i--) {x[i]=x[i-1];}
x[0]=InData;
for (z1=0,i=0;i for (i=na-1;i>0;i--) {y[i]=y[i-1];} for (z2=0,i=1;i y[0]=z1-z2; OutData=y[0]; return (s32)OutData; } 2.6 运动状态监测 2.6.1基于MPU6050六轴模块设计运动状态监测 通过读取MPU6050内置的x、y、z轴上的加速度,通过高斯滤波将其3个方向的数值合一得到一个预算的峰值,一个峰值变换对应一步数,同时将所得加速度经过积分得到速度,即可计算出运动步伐。 由于产品佩戴于胸前,所以选取X轴方笔直朝下,使用I2C通讯协议,提取MPU6050各轴数据,消除零点漂移之后,对加速度计的数据进行均值滤波,通过加速度计数据得到x轴与重力加速度方向的角度,然后通过卡尔曼滤波融合陀螺仪的加速度,得到修正之后X轴与重力加速度方向的倾角,实际实验测试出临界阈值。 2.6.2加速度的C语言计算代码 mpu6050_get_data(&gx,&gy,&gz,&ax,&ay,&az,&temperature); acc_filter(); ax-=AX_OFFSET; ay-=AY_OFFSET; az-=AZ_OFFSET; gx-=GX_OFFSET; gy-=GY_OFFSET; gz-=GZ_OFFSET; angle_dot = gz * GZRO_SCALE; angle =atan(sqrt(ax * ax + ay * ay )/az ); angle =angle * 57.295780; kalman_filter(angle, angle_dot, &f_angle, &f_angle_dot); 2.7 体温监测 TI公司的LMT70是低功耗高精度的模拟温度传感器。其16位精度的AD采样使其工作在20°C-42°C范围时,误差为±0.05°C。由于人体温度刚好囊括在这一范围,因此在确保其基准电压的精准时,能准确的返回所需的数据。 由于LMT70电压传递函数不是标准的线性,所以采用三阶传递函数方程来确保其工作在所需的最佳拟合中。 三阶传递函数C语言如下: double a= -1.064200E-09; double f= -5.759725E-06; double c= -1.789883E-01; double m= 2.048570E+02; temp=a*(temp)*(temp)*(temp)+f*(temp)*(temp)+c*(temp)+m; //temp初始温度值 3 传输方式 3.1 方案选择 方案一:使用蓝牙3.0模块搭建单片机--手机或者单片机---单片机通讯,完成数据传输。 方案二:使用nrf24L-01模块搭建单片机--手机或者单片机---单片机通讯,完成数据传输。 方案三:使用串口无线透传完成单片机---电脑的无线通讯,使用串口传输发送与接收数据。 由于蓝牙模块传输速率为24Mb/s,而ECG要求传输数据大,所以使用蓝牙传输会有一定的延时接收,同时由于蓝牙的传输距离有限,无法实现远距离的传输,因此不采用。Nrf模块在传输速率上达到了1ms一包,一包大概32字节,完全能满足ECG庞大的数据量。但是Nrf需要与单片机搭配才能接收数据,提高了成本和电路复杂性,不予考虑。 而ebyte公司的串口透传具有自动调频功能,抗干扰能力强,传输效率高,传输距离远。且减少了接收端的电路复杂性(只需要将usb插上电脑即可)和发送端的操作难度(只需将数据通过printf传输即可)。 3.2 理论分析 设计通过NRF24L01无线串口透传来实现人机无线传输。搭建的系统由下位机与上位机人机界面2部分组成:先使下位机主机板STM32控制芯片将采集的人体信息发送给无线透传模块,然后无线传送到下位机从机板无线接收模块,无线接收系统结合串行通信接口,把数据送往上位机PC端实现数据的显示并在上位机界面上实现无线视屏监控,并且不需要无线路由器构建的局域网环境进行通讯,摆脱了传统有线传输的束缚,实现了无线实时监测数据和人机互动功能。 系统流程图:(如图2) 4 上位机 采用QT对上位机进行开发,通过串口读取数据。由于使用的是串口透传模块进行单片机与PC端的通信,所以只需要区分每段数据的数据类型即可。 传输的数据格式如下:printf("<%d,%d,%d,%d,%d,%d,%d,%d>", nrfSendData.bytes.heartRate, nrfSendData.bytes.stepNum, nrfSendData.bytes.tempture, nrfSendData.bytes.adsData[0],nrfSendData.bytes.adsData[1], nrfSendData.bytes.adsData[2], nrfSendData.bytes.adsData[3], nrfSendData.bytes.adsData[4], nrfSendData.bytes.adsData[5]); 一個数据包有32Byte的大小,传输顺序按照心率、步数、温度、和ECG,大小分别为2Byte、2Byte、4Byte以及24Byte。当数据传输到上位机后,PC端上位机按照传输方式提取数据,并把数据转换为十进制显示到QT编写的页面中。 5 测量结果 5.1 测试数据 距离显示:(如表1) 温度显示:(如表2) 心率显示:(如表3) 5.2 测试结论 (1)心率精度高,误差不超过1%; (2)温度精度受基准电源影响,在±2℃内; (3)距离显示受摆动加速度影响,误差不大于10%; 在完成简易穿戴和低功耗要求前提下,保证了低延迟的传输。同时完成了人体运动的监测、体温和心率的实时显示,已达到测试要求。 参考文献: [1] 邓海涛,张桂珊,邹秋云, 等.基于STM32处理器的心电信号系统[C].//中国计算机学会.第五届全国可穿戴计算学术会议暨2015可穿戴与医学变革研讨会论文集.2015:1-10. [2] 同[1]. [3] 邓海涛,张桂珊,邹秋云, 等.基于STM32处理器的手机监控心电的设计[J].集成技术,2015(05):78-86. [4] 同[1]. [5] 孙迎,宋健.基于Android的远程心电检测系统[J].计算机应用与软件,2013,30(04):326-329. 西华大学,四川 成都