无线运动传感器节点设计

  • 题目要求
  • 设计方案分析
  • 心电检测模块方案
  • ADS1292的A/D转换计算
  • 心电信号的处理
  • 体表温度分析计算
  • 运动量分析计算
  • 无线传输模块设计
  • 显示屏的设计
  • 电路设计
  • 温度模块设计
  • 加速度计模块设计
  • 无线传输模块设计
  • PCB布线布局

题目要求

  1. 任务
    基于 TI 模拟前端芯片 ADS1292 和温度传感器 LMT70 设计制作无线运动传
    感器节点,节点采用电池供电,要求能稳定采集和记录使用者的心电信息、体表
    温度和运动信息。
  2. 要求
    (1)基于 ADS1292 模拟前端芯片设计心电检测电路,完成使用者的心电信
    号实时测量,要求: (30 分)
    ①实时采集和记录使用者的心电信号,实现动态心电图的测试与显示;
    ②分析计算使用者的心率,心率测量相对误差不大于 5%。
    (2)基于 LMT70 温度传感器测量使用者体表温度,要求: (20 分)
    ①实时采集和记录使用者的体表温度,温度采样率不低于 10 次/分钟;
    ②体表温度测量误差绝对值不大于 2℃。
    (3)基于加速度计等传感器检测使用者运动信息,实现运动步数和运动距
    离的统计分析,要求: (20 分)
    ①运动距离记录相对误差不大于 10%;
    ②运动步数记录相对误差不大于 5%。
    (4)无线运动传感器节点能通过无线上传使用者的基本心电信号、体表温
    度和运动信息,并在服务器(手机)端实时显示动态心电图、体表温度和运动信
    息,要求传输时延不大于 1 秒。 (25 分)

设计方案分析

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

心电检测模块方案

采用ADS1292芯片构成心电测量电路,采样频率为1000Hz,对通道返回的3个字节进行处理,用相应的公式得到对应的电压,从而画出心电图。
采用TI公司的集成芯片ADS1292, 它是一款适用于生物电信号采集的芯片。其内置2个24 bit模数转换器, 可以实现心电与呼吸信号双通道采集, 单个通道功耗仅为335μW, 且ADS1292R内置右腿驱动降噪电路和电极脱落检测电路 [8-9] 。信号采用差分输入方式, 两个电极右臂RA (负极) 和左臂LA (正极) 。通道1 (IN1N和IN1P) 用于采集呼吸信号, 通道2 (IN2N和IN2P) 用于
采集心电信号。右腿驱动电路连接到通道2上, 形成负反馈以减少心电信号中共模干扰。呼吸信号和心电信号由电极分别引入通道1和通道2后经过ADS1292R内部可编程放大器 (PGA) 放大6倍, 然后分别经过A/D模数转换, 转换后的数字信号由SPI接口输入到单片机中。单片机控制ADS1292R进行信号采集和AD转换。单片机与ADS1292R通过CS、SCLK、DIN、DUT四线实现SPI串行同步协议通讯。通过向ADS1292R内部寄存器写入相应值以配置相关设置, 比如通道放大倍数、测量通道漂移量、工作时钟选择、导联脱落使能等。

ADS1292的A/D转换计算

ADS1292的每一个通道都有一个24位的模数转换器(ADC)。输入信号与输出信号对应关系如下:

每次采样信号经过ADS1292内部的A/D模数转换后变成了一个72位的数据包:1100+LOFF_STAT[4:0]+GPIO[1:0]+13个‘0’+24位呼吸数据+24位心电数据。

心电信号的处理

直接获取原始数据,打印图像

可以看到,该信号有许多噪声,也就是高频信号。采用低通滤波器可将其滤掉。
IIR是无限长单位脉冲响应数字滤波器,其系统对应函数有如下形式:

在知道滤波器相应的系数b[],a[]后可根据相应的差分方程,完成对数据的滤波,而滤波器的系数可以通过MATLAB滤波器设计和分析工具箱Filter Designer求得。
用MATLAB设计IIR低通滤波器

滤波器阶数N=3,采样频率Fs=1000Hz,截止频率经过大体估算和反复测试得Fc=8Hz。
通过查看Filter Coefficients可得滤波器系数。

响应函数:
H(z)= Gain*(1+2Z-1+Z-2)/(1-a1Z-1-a2*Z-2)
上式是从Z域上分析的,因为具体应用在时域上,所以根据响应函数得到对应时域上的差分方程:
a[0]y[i]=Gain(b[0]*x[i]+b[1]*x[i-1]+b[2]*x[i-2])-a[1]*y[i-1]-a[2]*y(n-2)
其中Gain=0.000616045308738544347866572525873607447,b[]={1,2,1},
a[]={1,-1.948522813110796114699496683897450566292,0.950986994345750180634979642491089180112},
x为输入信号,y为滤波后信号。
根据系数设计C语言程序:
#define a 0.000616045308738544347866572525873607447
#define b 1.948522813110796114699496683897450566292
#define c 0.950986994345750180634979642491089180112

double xx[3]={0,0,0};
double yy[3]={0,0,0};

double iir(double x,double x1,double x2,double y1,double y2)//7hz
{
double y0;
y0=a*(x+2x1+x2)+by1-c*y2;
return y0;
}

double iirfilter(double e)
{
xx[2]=xx[1];
xx[1]=xx[0];
xx[0]=e;

yy[2]=yy[1];
yy[1]=yy[0];
yy[0]=iir(xx[0],xx[1],xx[2],yy[1],yy[2]);return yy[0];

}
心电滤波后,获取数据,打印图像

可以看到噪声已经被清除了,但曲线并不平滑。采用滑动平均滤波法解决这一问题。
滑动平均滤波法(又称递推平均滤波法)
方法: 把连续取N个采样值看成一个队列 ,队列的长度固定为N , 每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则), 把队列中的N个数据进行算术平均运算,就可获得新的滤波。
优点: 对周期性干扰有良好的抑制作用,平滑度高 适用于高频振荡的系统 。
缺点: 灵敏度低 ,对偶然出现的脉冲性干扰的抑制作用较差 ,不易消除由于脉冲干扰所引起的采样值偏差 ,不适用于脉冲干扰比较严重的场合, 比较浪费RAM 。
将低通滤波后的波形放大看:

由图像可以看出,波形波动幅度不大,且没有偶然出现的脉冲性干扰,干扰频率相对于有用信号较高。所以采用滑动平均滤波法。
滑动平均滤波法N的选取:太大浪费RAM,太小效果不好。经过大体估算和反复测试取N=16。
设计C语言程序:
#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;
}
心电滑动平均滤波后,获取数据,打印图像

波形变得光滑很多,心电信号处理完成。
心率的计算
心电波形如下:

心率计算公式为:HR=60*(1/RR)(次/分钟)其中HR为心率,RR为跳动一次的时间,即R波之间的距离。所以要求心率,先求T, 即图上R波之间的距离。
求R波之间的距离:
首先找到一个准确的点。观察整个波形,A点更具有特征性。选取A点作为基准点。

A点的特征:

  1. 两边斜率大小几乎相等,互为相反数。
  2. 两边斜率左边大于0,右边小于0。
  3. 两边斜率大小明显大于波形上的其他点,阈值更好确定。
    心电采样频率Fs=1000Hz,即1ms采一个点,显然,利用相邻两点计算斜率准确率低,为了提高斜率计算的准确性,点与点之间应保持一定距离,但也不能太远,否则会出现错误,如下图所示:

点应始终在R波上,根据采样数据与图形横纵坐标值,取间隔50个点来计算斜率。(备注:这个数据无法百分之百做到准确,大概就好,不会影响心率准确度即可)。
斜率阈值slope的确定:选择自动适应和实时更新的阈值以便更确定不同的检测对象或检测环境的R波位置。根据上述特征3,即要找到恰好能够找到点且不能够找到点的斜率阈值slope。
阈值设定采用二分法的思路。
二分法:
给定精确度ξ,用二分法求函数f(x)零点近似值的步骤如下:
1 确定区间[a,b],验证f(a)·f(b)<0,给定精确度ξ.
2 求区间(a,b)的中点c.

3 计算f©.
(1) 若f©=0,则c就是函数的零点;
(2) 若f(a)·f©<0,则令b=c;
(3) 若f©·f(b)<0,则令a=c.
(4) 判断是否达到精确度ξ:即若|a-b|<ξ,则得到零点近似值a(或b),否则重复(2)-(4).
具体应用方式如下:

  1. 先根据数据大致估算一个斜率阈值的初始值slope=K0,根据上述特征2设计程序:if((k[49]-k[0])*20>slope && (k[50]-k[99])*20>slope)
    其中k为采集到的点,(k[49]-k[0])*20与(k[50]-k[99])*20为两边的斜率,如果满足上if中的条件计算心率,否则不计算心率。先不管心率是否准确。情况一,如果能计算心率,则代表找到了点,但不一定是A点,则此时令斜率阈值为a;情况二,如果不能计算心率,则表示没有找到任何点,则此时令斜率阈值为b。如果是情况一,下一次斜率阈值为上一次斜率阈值的2倍,再进行判断能否计算心率;如果是情况二,下一次斜率阈值为上一次斜率阈值的1/2倍,再进行判断能否计算心率。反复进行上述步骤,直到确定a,b的值。
    2.然后求区间(a,b)的中点c,再进行判断能否计算心率,情况一,如果能计算心率,则代表找到了点,则此时a=c,;情况二,如果不能计算心率,则表示没有找到任何点,则此时b=c。反复进行上述步骤,直到|b-a|<ξ。则确定斜率阈值slope=a。
    C语言设计程序如下:
    //slope为斜率阈值 key为是否找到斜率阈值标志位 ξ=1

unsigned char aaa=0,bbb=0,ccc=0,slope=10,key=0;
void counter_slope(double e)
{
unsigned char t=0;

for(t=0;t<99;t++)
{k[t]=k[t+1];
}
k[99]=filter(e);//获取心电滤波后的数据if(key==0)
{if((k[49]-k[0])*20>slope && (k[50]-k[99])*20>slope)//找到点{aaa=slope;     if(bbb==0) slope=2*slope;else{ccc=(aaa+bbb)/2;slope=ccc;}}else           //没找到点{bbb=slope;if(aaa==0) slope=slope/2;else{ccc=(aaa+bbb)/2;slope=ccc;}}
}if((bbb-aaa)<1)
{slope=aaa;key=1;      //设置斜率阈值slope
}

}
采用定时器计时,每T时间后将找斜率阈值标志位key置0,即可做到斜率阈值的自动适应和实时更新。
提高A点的准确性:根据A点特征1可进一步提高A点的准确性。两边斜率大小几乎相等,即|K1-K2|<ξ,采用ξ=0.1(备注:这个数据无法百分之百做到准确,大概就好,不会影响心率准确度即可)。
C语言设计程序如下:
if(((k[49]-k[0])-(k[50]-k[99]))<0.1 && ((k[49]-k[0])-(k[50]-k[99]))>-0.1)
综上所述,测量心率C语言设计程序如下:
double k[100];//心电滤波后的数据
unsigned int counter_time=0,time=1;//counter_time计数 time为RR之间距离
unsigned char b=0;//找到点开始计数标志位
unsigned int count_rate(double e)
{
unsigned char t=0;
if(b1) counter_time++;
for(t=0;t<99;t++)
{
k[t]=k[t+1];
}
k[99]=filter(e);//心电滤波后的数据
if((k[49]-k[0])*20>slope && (k[50]-k[99])*20>slope)
{
if(((k[49]-k[0])-(k[50]-k[99]))<0.1 && ((k[49]-k[0])-(k[50]-k[99]))>-0.1)
{
if(b0) b=1;
else
{
time= counter_time;
counter_time=0;
}
}
}
if(time==1) return 0; //不合理心率
else return 60000/time;//计算心率
}
验证上述理论能否测出心率。
利用心电信号发生器产生心电信号输入设备。
心电信号发生器产生心电信号频率为60,即心率为60。
获取数据,打印图像如下

可以看到只有部分数据为60,其它情况为0,并且数据具有明显的周期性,所以可以判断误差不是随机误差,而是可以避免的系统误差。
分析原因:因为心率与RR的值有关,而要RR的值准确,则必须A点找准确,但实际上无论如何精确,都无法精确找到那一点。现实中,只能找到A点及其附近尽可能少的点,如下图

其中画红线的就是系统找到的A点,在红线段内,两A点相距为1,根据计算公式算出来为60000,显然这个数据不合理,自然系统得出的心率为0,只有在本红线的最后一点与下一红线第一点之间,相距不为0,且理论上会导致心率测量偏大,但通过数据分析,该误差较小可以不管,也说明A点找得比较精确。
解决方法:对计数counter_time设置阈值。可以知道人的心跳不可能超过600次/秒,所以time=counter_time应大于100。
重新设计程序:
unsigned int count_rate(double e)
{
unsigned char t=0;

if(b==1) counter_time++;for(t=0;t<99;t++)
{k[t]=k[t+1];
}
k[99]=filter(e);//心电滤波后的数据if((k[49]-k[0])*20>slope && (k[50]-k[99])*20>slope)
{if(((k[49]-k[0])-(k[50]-k[99]))<0.1 && ((k[49]-k[0])-(k[50]-k[99]))>-0.1){if(b==0) b=1;else { if(counter_time>100)     //时间阈值{ time=  counter_time;            counter_time=0;}}}
}
if(time==1) return 0;
else return 60000/time;//计算心率

}
再次验证上述理论能否测出心率。
获取数据,打印图像如下

可以看到心率比较准确,满足要求。
为了避免数据的偶然性等因数,设置心电信号发生器产生心电信号频率分别为44,77,99,111再次验证。
获取数据,打印图像,结果如下:


可以看到心率测量比较准确,误差较小,心率测量相对误差不大于 5%。

体表温度分析计算

温度传感器模块方案:采用LMT70芯片构成温度测量电路,按照芯片手册上的对应比例,根据返回的值算出对应的温度。
LMT70输出电压传递函数不是线性的,可以用一阶,二阶或三阶传递函数方程描述。在实践中发现一阶传递函数最为准确,因此采用一阶传递函数。为使温度测量更加稳定准确,软件配置增加了平滑滤波。一阶传递函数计算公式:
Temp = p1VTAO (mV) + p2
p1 = -0.1913
p2 = 209.6
Temp时温度值;
VTAO 是AD采集TAO端口的电压,单位mV。
平滑滤波代码如下:
unsigned short SmoothProcess(unsigned short
array,int point)
{
unsigned short temp;
char i,j;
float ret=0;

for(i=0;i<point;i++)
{for(j=point-1;j>i;j--){if(array[j-1]>array[j])//smaller one at the front{temp=array[j-1];array[j-1]=array[j];array[j]=temp;}}
}
for(i=0;i<point;i++)printf("%d\t",array[i]);ret=(array[point/2]+array[point/2+1])/2;
return (unsigned short)ret;

}

运动量分析计算

测量运动信息模块方案:采用MPU9250芯片测量运动信息,分别用以检测人步行中三个方向的加速度变化,根据其数据变化,再结合相应的算法,算出其运动步数和距离。
步数参数:
系统每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寄存器将保持不变。因此,移位寄存器组可以消除高频噪声并使决策更加精确。

步伐判断:由图1可知,判断为一步的条件是,先找到最活跃轴,然后最活跃轴的old_sample > 动态阈值,new_sample < 动态阈值。满足上述条件,认为走了一步。在运动过程中,可以认为连续运动大于5步才认为是走步,这样可以过滤一些不必要的错误步数,最快大约每秒5步,相当于200ms一步。
距离参数
在根据上述算法计算了步数参数之后,我们可以如下公式来获得距离参数。
距离=步数×每步距离
每步距离取决于用户的速度和身高。如果用户较高或以较高速度跑步,则步长会更长。该参考设计每两秒钟更新一次距离,速度和卡路里参数。因此,我们使用每两秒计数的步长来判断当前的步幅长度。

无线传输模块设计

方案一:采用蓝牙模块来上传基本心电信号,单片机与蓝牙模块进行串行异步通讯, 这种通讯方式实现简单 。只需要配置相应的输出和输入管脚、串口时钟、以及波特率即可。为保证心电及呼吸数据能高速无延时地传输, 波特率选择115 200。体表温度和运动的信息,并在服务器端实时显示动态心电图,体表温度和运动信息。但它的缺点就是速度非常慢且距离信号受限,传输距离大约为10米。
方案二:采用wifi模块(ESP8266 ESP-01S)来实现无线传输实时动态的信息,所支持的速度最高54Mbps,通过互联网连接上安装访问点来创建,传输距离大概为300英尺。只要手头有支持WiFi连接的设备,在热点覆盖的区域即可随时联网。在传输距离和速率方面,wifi比蓝牙会有较大的优势。
经过综合考虑,决定采用方案二芯片型号ESP8266 ESP-01S。

显示屏的设计

采用TFT_LCD显示屏 尺寸为240*320的显示屏来显示使用者心电图,体表温度与运动的信息。但是不能持续显示心电图,且操作的难度很大 ,对于显示汉字的能力较差。采用USART_HMI 串口屏来显示使用者心电图,体表温度与运动的信息。它的使用比较方便,通过绘图的方式来搭建界面,且可以连续显示心电图信号.

电路设计

心电测量模块设计
利用ADS1292R和TXS0108EPWR来采样心电信号与数据分析,利用SPI与STM32F4进行通信,最后发生到串口屏。

温度模块设计

通过LMT70采样温度数据,在计算出精确温度,基于LMT70的温度采样电路如下:

加速度计模块设计

基于MPU9250测量使用者的加速度的电路:

无线传输模块设计

无线传输模块基于ESP8266芯片
电路如下图:

PCB布线布局

由于心电信号很微弱, 典型幅值约为1 m V, 易受到干扰, 所以在硬件设计上除了需要右腿驱动电路消除共模干扰外, 在PCB的布线布局上也应注意以下几点: (1) 由于心电及呼吸信号是差分信号, 所以在布线正负输入信号线时, 尽量保持靠近和对称走线, 以减少共模干扰; (2)为减少外界对输入信号线的干扰, 用地线将输入信号线包裹起来; (3) 电源数字电源单独供电, 模拟地和数字地单独地, 在一点处连接, 避免模拟电路和数字电路之间相互干扰。

2020年电赛省赛题目A——无线运动传感器节点设计相关推荐

  1. 2020年TI杯大学生电子设计大赛 无线运动传感器节点 备赛、参赛实录(历时一个月)

    转载请标明转载自:https://blog.csdn.net/weixin_44578655/article/details/109020022 9.5 清单已经出了一段时间了.买的少部分元器件也到了 ...

  2. 2020年TI杯大学生电子设计大赛 无线运动传感器节点 作品开源( PCB、设备/服务器工程、文档、测试视频、设计报告)

    2021.5.1更新: 需要焊接晶振,程序默认使用的是外部晶振 2021.4.22更新: 正值毕业设计季,近期有不少毕设题目是本作品的学长学姐私信询问,由于博主备考,无法及时回复. 本作品还有不少待优 ...

  3. 电赛A题无线运动传感节点总结(一)

    @Loole 系统概述 基于前端芯片心率传感器ADS1292,温度传感器LMT70,加速度传感器mpu6050,蓝牙通信模块和stm32f103ZET6设计制作无线运动传感节点,能够稳定采集使用者的心 ...

  4. 2020 电赛陕西省赛

    题目: 无线运动传感器节点设计(A 题) 基于 ADS1292 模拟前端芯片设计心电检测电路,完成使用者的心电信号实时测量: ①实时采集和记录使用者的心电信号,实现动态心电图的测试与显示: ②分析计算 ...

  5. 2020年电赛题目,命题专家们怎么看?

    关注.星标公众号,直达精彩内容 赛题解析概要 01 A题: 无线运动传感器节点设计 一.命题背景说明 二.题目涉及关键知识点介绍: ①  共模抑制的概念 ②  高精度ADC设计与应用 ③  生物信号. ...

  6. 2020年电赛题目,命题专家权威解析!

    关注.星标公众号,直达精彩内容 来源:德州仪器TI校园计划.大学生电子设计竞赛培训网 上次发了关于电赛题目前三道题目解析的视频:2020年电赛题目,命题专家们怎么看?,这篇带来剩余的四道赛题. 04 ...

  7. 2020年数学建模国赛B题题目和解题思路

    2020年数学建模国赛B题题目: 考虑如下的小游戏:玩家凭借一张地图,利用初始资金购买一定数量的水和食物(包括食品和其他日常用品),从起点出发,在沙漠中行走.途中会遇到不同的天气,也可在矿山.村庄补充 ...

  8. 计蒜客 2020 蓝桥杯大学 A 组省赛模拟赛 (一)题目及解析

    新手,欢迎交流,剩下D题不知如何下手,望大佬指教. 计蒜客 2020 蓝桥杯大学 B 组省赛模拟赛 (一)题目及解析 文章目录 A. 结果填空:计算周长 B. 结果填空:七巧板 C. 结果填空:苹果 ...

  9. 2020年数学建模国赛C题题目和解题思路

    2020年数学建模国赛C题题目: 在实际中,由于中小微企业规模相对较小,也缺少抵押资产,因此银行通常是依据信贷政策.企业的交易票据信息和上下游企业的影响力,向实力强.供求关系稳定的企业提供贷款,并可以 ...

最新文章

  1. [CF314C](Sereja and Subsequences)
  2. php 设置时区_为什么没有 Asia/Beijing 时区?
  3. 无法初始化插件目录(can't initialize plug-ins directory)
  4. 深度学习笔记第三门课 结构化机器学习项目 第一周 机器学习(ML)策略(1)...
  5. html 首行缩进2个汉字
  6. 武术与软件设计 - 简单即是最好
  7. 牛客网暑期ACM多校训练营(第五场): A. gpa(01分数规划)
  8. 使用ImageIO.write上传二维码文件时候,提示系统找不到指定路径
  9. apache 支持apk下载安装
  10. 参考文献格式字号字体_参考文献用什么字体字号 参考文献标准格式字体
  11. pyqt项目——测温仪数据采集软件
  12. 捷联惯导速度更新_划桨效应补偿算法推导(双子样)
  13. Linux系统异常夯死或宕机分析
  14. 2022.1.25复盘
  15. 10-Excel数据透视表
  16. python多进程和进程池
  17. hfs支持php文件系统,HFS+文件系统的发展及特点介绍
  18. mysql导入pet表
  19. 基于Tiny-51操作系统的51单片机温度测控系统设计
  20. 用dreamweaver打开asp网页出现乱码怎么办

热门文章

  1. 实现 图片由远及近的效果
  2. nordic 52832添加HID服务实现手机蓝牙自拍杆功能 附遇到的问题和解决方法
  3. 新iPhone在中国卖不动!苹果认怂了,股价暴跌8%
  4. 将本地代码上传到gitlab
  5. 【渝粤题库】广东开放大学 秘书实务21 形成性考核
  6. unity+PHOTON+同步实例
  7. L1-016 查验身份证 (15 分)
  8. 营业额翻倍利用数组定义且打印输出
  9. rs485特性、传输距离、接口防雷击、终端匹配电阻等分析
  10. Windows XP 安装使用的序列号