无线运动传感器节点设计

实验目的

基于 TI 模拟前端芯片 ADS1292 和温度传感器 LMT70 设计制作无线运动传感器节点,节点采用电池供电,要求能稳定采集和记录使用者的心电信息、体表温度和运动信息。

设计方案分析

本设计基于TI模拟前端芯片ADS1292、温度传感器LMT70以及MPU9250设计制作无线运动传感器节点,节点采用电池供电。使用ADS1292设计心电检测电路,实时采集和记录使用者的心电信号,实现动态心电图的测试与显示。LMT70用于实时采集和记录使用者体表温度。MPU9250实现运动步数和运动距离的统计分析。将各模块获取数据输入STM32F407单片机进行分析处理,并通过串口屏显示。该装置能通过串口上传使用者的基本心电信号、体表温度和运动信息,并在服务器端实时显示动态心电图、体表温度和运动信息。

心电检测模块方案

方案描述

利用两块电极片,分别采集手臂与胸部的心电信号,将信号传入ADS1292,经过ADS1292数据处理后将数据传入MCU并显示在显示屏上。如图:
9dd78e636a776fa711d975864ccf844.png
TI模拟前端芯片ADS1292具有以下特性:
1、两个低噪声可编程增益放大器(PGA)和和两个高分别率模数转换器(ADC),集成了心电采集所需要的部件,方便设备小型化。
2、低功耗:每通道335μW,使得可以作为长时间监控成为可能。
3、输入参考噪音::8μVPP(150HzBW,G=6),共模抑制比比(CMRR):–105dB。这个参数足以进行心电采集。
所以,采用ADS1292芯片构成心电测量电路,采样频率为1000Hz,读取ADS1292R的数据使用SPI连续读的方式,一次读取9个字节。其中前3个字节包含了电极状态,后面3+3个字节分别表示两个通道的数据。对每个通道返回的3个字节进行处理,用相应的公式得到对应的电压,从而画出心电图。
ADS1292的每一个通道都有一个24位的模数转换器(ADC)。输入信号与输出信号对应关系如下:
微信图片_20221130165811.png
每次采样信号经过ADS1292内部的A/D模数转换后变成了一个72位的数据包:1100+LOFF_STAT[4:0]+GPIO[1:0]+13个'0'+24位呼吸数据+24位心电数据。

心电信号处理

根据上面心电检测方案,直接获取原始数据,打印图像:
untitled.jpg
可以看到,该信号有许多噪声,也就是高频信号。采用低通滤波器进行滤波。这里采用IIR数字滤波器,其系统对应函数如下:
$\mathit{H(z)=\frac{\sum_{k=0}^M b[k]z-k}{1+\sum_{k=1}N a[k]z^-k}}$
在知道滤波器相应的系数b[],a[]后可根据相应的差分方程,完成对数据的滤波。通过MATLAB滤波器设计和分析工具箱Filter Designer可以求得滤波器的系数:
b[]={1,2,1},
a[]={1,-1.948522813110796114699496683897450566292,0.950986994345750180634979642491089180112}
由此可以进行滤波操作,心电滤波后,获取数据,打印图像:
低通滤波.png
可以看到噪声已经被清除了,但曲线并不平滑。采用滑动平均滤波法解决这一问题。
代码如下:

#define N 16
unsigned char n=N;
double medianfilter(double*p)
{
	double sum=0;
	unsigned char count=0;
	for(count=0;count<N;count++)
{
	sum+=*p;
	p++;
}
	return sum/N;
}

心电滑动平均滤波后,获取数据,打印图像:

Quicker_20221202_161430.png

对此,心电信号处理完毕。

心率的计算

aa4f1ca2d1ccd92682932e03ee552d7.jpg
心率计算公式为:
HR=60/RR(次/分钟)
其中:
HR为心率。
RR为跳动一次的时间,即R波之间的距离。
选择最高点为基准点,因为其有以下特征:

  1. 两边斜率左边大于0,右边小于0。
  2. 两边斜率大小几乎相等,互为相反数。
  3. 两边斜率大小明显大于波形上的其他点。

所以用其斜率作为阈值更具好。
如此,可以设计出如下方法计算其阈值:

  1. 先根据数据大致估算一个斜率阈值的初始值slope=K0,选择间隔为50两个数据点计算其斜率。将数据点放入一组矩阵中,用k表示为采集到的点,则(k[49]-k[0])20与(k[50]-k[99])20为两边的斜率,如果满足其斜率大于K0则计算心率,否则不计算心率。情况一,如果能计算心率,则代表找到了点,但不一定是基准点,则此时令斜率阈值为a;情况二,如果不能计算心率,则表示没有找到任何点,则此时令斜率阈值为b。根据二分法原理,如果是情况一,下一次斜率阈值为上一次斜率阈值的2倍,再进行判断能否计算心率;如果是情况二,下一次斜率阈值为上一次斜率阈值的1/2倍,再进行判断能否计算心率。反复进行上述步骤,验证当f(a)·f(b)<0时,确定a,b的值。
  2. 然后求区间(a,b)的中点c,再进行判断能否计算心率,情况一,如果能计算心率,则代表找到了点,则此时a=c,;情况二,如果不能计算心率,则表示没有找到任何点,则此时b=c。反复进行上述步骤,直到|b-a|<ξ。则确定斜率阈值slope=a。

ξ为给定精度,这里设定为0.1
利用定时器记时,每T时间后将找斜率阈值标志位key置0,即可做到斜率阈值的自动适应和实时更新。
利用如上设计方法,获得原始数据进行分析,可以绘制如下图像:
28cf8d63bd57c8b399c137e677d2b22.png
可以看到心率测量比较准确,心率测量相对误差不大于 5%。

体表温度分析计算

温度传感器模块方案:使用LMT70芯片组成温度检测电路,依据LMT70芯片数据手册,根据返回的值计算出对应的温度。
LMT70输出的电压传递函数可以使用一阶、二阶或者三阶传递函数方程描述,因为LMT70的输出电压是非线性的。这里采用一阶传递函数,在软件上使用了平滑滤波使得温度测量更加的稳定准确。一阶传递函数的计算公式为:
T = p1V (mV) + p2
其中:
p1 = -0.1913
p2 = 209.6
:_ T是温度值;_
V 是AD采集TAO端口的电压,单位mV。
Electrical Characteristics Temperature Lookup Table (LUT)
applies for VDD of 2.7V
363b2e4b3a1d082348e8fde37916aa8.png

运动信息检测模块方案

测量运动信息模块方案:采用MPU9250芯片测量运动信息,分别检测人在步行中三个方向的加速度变化,根据其数据变化,再结合相应的算法,算出其运动步数和距离。
MPU9250是Invensense的一颗9轴运动传感器(Motion Tracking)。这里的9轴是指3颗3轴传感器(加速度计–Accelerator, 陀螺仪–Gyroscope,磁力计–Magnetometer)的合体,本方案只需采集其数据传输中的加速度计–Accelerator的数据。(该数据是经过ADC转换之后的模拟信号)
屏幕截图 2022-12-05 213530.png
假设读到的数据为data,由于是模拟信号,需要将其转换为相应的电压值,每个ADC模块都有一个参考电压VREF,要将一个16位的ADC值转成电压值,使用公式:VoltsRx = AdcRx * VREF / (2^16-1).
每个加速度计都有一个零加速度的电压值VzeroG,可以在它的说明书中找到,这个电压值对应于加速度为0g。通过计算相对0g电压的偏移量可以得到一个有符号的电压值。由此可以得到每个轴的偏移量:DeltaVoltsRx = VoltsRx - VzeroG.
最后将所得的偏移量转换为加速度,引入加速度计的灵敏度(Sensitivity),单位通常是 mV/g。灵敏度值可以在加速度计说明书中找到。要获得最后的单位为g的加速度,使用下列公式计算:RX = DeltaVoltsRx/Sensitivity.
公式整合可得:
$\mathit{Rx= \frac{\frac{AdcRx*VREF} {65535}- VzeroG}{Sensitivity}}$
步数参数:
系统每次采集50个样本并存入线性移位寄存器中,在样本中不断更新3轴加速度的最大值和最小值。平均值(Max + Min)/ 2表示,其被称为动态阈值水平。对于这50个样本,此阈值水平用于确定是否已采取步骤。由于线性移位寄存器包含两个寄存器,一个sample_new寄存器和一个sample_old寄存器。则将这些数据分别称为sample_new和sample_old。当采集到新的数据样本时,sample_new数据将无条件地移至sample_old寄存器。但是,是否将sample_result数据移入sample_new寄存器取决于以下条件:如果加速度的变化大于预定义的精度,则将最新的采样结果sample_result,移到sample_new寄存器;否则,sample_new寄存器将保持不变。
步伐判断:
判断为一步的条件是,先找到最活跃轴(变化量最大的维度),然后最活跃轴的old_sample > 动态阈值new_sample < 动态阈值。满足上述条件,认为走了一步。在运动过程中,可以认为连续运动大于5步才认为是走步,这样可以过滤一些不必要的错误步数,最快大约每秒5步,相当于200ms一步。
距离参数:
根据如上算法计算出步数之后,利用公式:距离=步数x每步距离。计算出所以移动的距离。但由于每步距离取决于用户的速度和身高,因此,本方案使用每两秒计数的步长来判断当前的步幅长度。

电路设计

心电电路设计

屏幕截图 2022-12-04 135617.png

温度模块设计

屏幕截图 2022-12-04 135640.png

运动模块设计

74db16fc98c7c53044ed4538e43a587.png

posted @   无言北上  阅读(185)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示