单片机学习小组
直播中

李艳

7年用户 1456经验值
私信 关注

如何实现pulse sensor模块基于51单片机程序设计?

如何实现pulse sensor模块基于51单片机程序设计?

回帖(1)

刘婷婷

2022-2-7 14:06:57
脉搏传感器本质上是一个光电容积描记器,用于无创心率监测的医疗设备。有时,光电容积描记器可以测量血氧水平,有时却不能。来自光电容积描记器的心脏脉搏信号是电压的模拟波动,它具有可预测的波形,如图所示。脉搏波的描绘被称为光电容积描记图,或PPG。我们最新的硬件版本,脉冲传感器安培,放大了以前的脉冲传感器的原始信号,并规范了在V/2(电压中点)左右的脉搏波。脉冲传感器安培响应光强度的相对变化。如果入射到传感器上的光量保持不变,信号值将保持在(或接近)512(模数转换器范围的中点)。光线越强,信号就越强。光线越少,情况就越相反。在每个脉冲期间,从绿色发光二极管反射回传感器的光发生变化。
找到瞬时心跳的连续时刻,并测量它们之间的时间间隔,称为国际心跳间隔(IBI)

波形随时间T 变化,当脉搏波通过传感器下方时,信号值迅速上升,然后信号回落到正常点。有时,双极性陷波(向下尖峰)比其他信号更明显,但通常在下一个脉冲波通过之前,信号会稳定在背景噪声中。由于波是重复的和可预测的,我们可以选择几乎任何可识别的特征作为参考点,如峰值,通过计算每个峰值之间的时间来测量心率。
有些心脏研究人员说当信号达到振幅的25%时,一些人说当信号达到振幅的50%时,一些人说这是上升过程中斜率最大的点。这种1.1版本的脉冲传感器代码设计用于通过信号在快速上升期间穿过50%的波振幅的时刻之间的计时来测量心搏间隔(IBI)
检测心率的方式:测出两个ADC峰值间的时长,假设这个时长为T,单位是毫秒,那么1分钟的心率假设为S,则 S = 60000/T 次/秒
实物图:

程序的流程图:


pulse sensor模块基于51单片机程序设计:


ADC初始化:


void ADC_init(unsigned char channel)//ADC初始化
{
P1ASF=ADC_MASK< ADC_RES=0; //清除以前的模数转换器结果
ADC_RESL=0; //清除以前的模数转换器结果
ADC_CONTR=channel|ADC_POWER|ADC_SPEEDLL|ADC_START; //开启模数转换器并开始转换


模拟读取:


unsigned int analogRead(unsigned char channel)//无符号整数模拟读取
{
unsigned int result;
ADC_CONTR &=!ADC_FLAG; //清除模数转换器标志
result=ADC_RES;
result=result<<8;
result+=ADC_RESL;
ADC_CONTR|=channel|ADC_POWER|ADC_SPEEDLL|ADC_START;
return result;
}


定时器中断:


void T0_init(void){     
  // 初始化定时器0,每隔2毫秒引发一次中断。
TMOD |= 0x01;
TL0=T0MS;
TH0=T0MS>>8;
TR0=1;
ET0=1;
  EA=1;                 
}


void Timer0_rountine(void) interrupt 1
{                       
  int N;
unsigned char i;
// 保持最近10个IBI值的累计
  unsigned int runningTotal = 0;                    
EA=0;                                 
TL0=T0MS;
TH0=T0MS>>8;    //重载16位定时器0
  Signal = analogRead(PulsePin);              // 读取 Pulse Sensor
  sampleCounter += 2;                         // 使用此变量跟踪时间(以毫秒为单位)
  N = sampleCounter - lastBeatTime;       // 监控自上一拍开始的时间以避免噪音
举报

更多回帖

发帖
×
20
完善资料,
赚取积分