3630|2

659

帖子

1

TA的资源

纯净的硅(中级)

楼主
 

万利LPC54102开发板的心率计Heartrate应用笔记例程移植分析 [复制链接]

万利LPC54102开发板的心率计Heartrate应用笔记例程移植分析
AN11608_Heart-rate Monitor using the Low Power LPC5410x演示了使用LPC54102PulseSensorAMped!作为心率计的应用。
由于万里开发板的不同设置,以及没有PulseSensor传感器,需要做一定的修改移植,使用万利开发板上的AIN1作为模拟输入,电位器的来回旋转代表心跳的变化。
1、代码修改
由于万利开发板使用PIO1_4/AIN7作为电位器输入,因此在初始化代码中,做了如下修改:
其中在board.h中,取消了BOARD_NXP_LPCXPRESSO_54102的定义,而是重新定义了BOARD_MANLEY_LPC54102。
并在各个初始化代码中,增加了针对万利开发板的初始化代码。
#if defined(BOARD_NXP_LPCXPRESSO_54102)
/* SEQ_A enables channels 0, 3 and 4; Uses software trigger; doesn't use BURST */
#define ADC_SEQ_A_CONFIG  \
        TRIG_SOFT |                /* Software trigger for SEQ_A */ \
        TRIG_POL_POS |        /* UM recommends this for S/W trigger */ \
        MODE_EOS |                /* Event generated after Sequence done */ \
        ENABLE_CH(3)        /* Associate channels 3 to SEQ_A */
#elif defined(BOARD_MANLEY_LPC54102)
#define ADC_SEQ_A_CONFIG  \
        TRIG_SOFT |                /* Software trigger for SEQ_A */ \
        TRIG_POL_POS |        /* UM recommends this for S/W trigger */ \
        MODE_EOS |                /* Event generated after Sequence done */ \
        ENABLE_CH(7)        /* Associate channels 7 to SEQ_A */
#endif // #if defined(BOARD_xxx)
static void ADC_PinMuxSetup(void)
{
#if defined(BOARD_NXP_LPCXPRESSO_54102)
        /* All pins to inactive, neither pull-up nor pull-down. */
        Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 0, IOCON_MODE_INACT | IOCON_FUNC1 | IOCON_ANALOG_EN);
       
#elif defined(BOARD_MANLEY_LPC54102)
        /* All pins to inactive, neither pull-up nor pull-down. */
        Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 4, IOCON_MODE_INACT | IOCON_FUNC1 | IOCON_ANALOG_EN);
       
#endif
}
2、运行
其余基本不变,下载后,将电位器来回旋转,可以看到串口输出了心跳数据。
3、代码分析
该应用基本采用CM4初始化后即进入休眠。
CM0+核初始化ADCTimer之后,进入休眠。
每秒20次唤醒后,采样ADC,当采样过半时,调用Compute_Heartrate算法计算是否产生心跳以及心跳间隔IBI。当发现后即输出串口信息。
关键在于Compute_Heartrate算法,该算法采用PulseSensor官方的算法,基本是通过判断ADC模拟量发现峰值、过半点等运算。


  1. void Compute_Heartrate(void)
  2. {
  3.         int i, N, Signal, runningTotal, current_sample = 0;
  4.        
  5.         while(current_sample < SAMPLE_FREQUENCY/2){
  6.                 Signal = temp_data[current_sample];
  7.                
  8.                 /* Keep track of time in milliseconds with sampleCounter variable */
  9.                 sampleCounter = sampleCounter + 50;
  10.                
  11.                 /* Monitor the time since last beat to avoid noise */
  12.                 N = sampleCounter - lastBeatTime;   

  13.                 /* Find the peak and trough of the pulse wave, avoid dichrotic noise by waiting 3/5 of last IBI */
  14.                 if(Signal < thresh && N > (IBI/5)*3){  
  15.                         if (Signal < T){               
  16.                                 /* Keep track of lowest point in pulse wave in the T variable */
  17.                                 T = Signal;                  
  18.                         }
  19.                 }
  20.                
  21.                 /* Use threshold condition to filter out noise, store peak in P */
  22.                 if(Signal > thresh && Signal > P){         
  23.                         P = Signal;                             
  24.                 }                                       

  25.                 /* Analyze the data to find heartbeat */
  26.                 if (N > 500){                                   
  27.                         /* Avoid high frequency noise */
  28.                         if ( (Signal > thresh) && (Pulse == 0) && (N > (IBI/5)*3) ){        
  29.                                 Pulse = 1;                              
  30.                                 IBI = sampleCounter - lastBeatTime;         
  31.                                 lastBeatTime = sampleCounter;               
  32.                                
  33.                                 if(secondBeat){                     
  34.                                         secondBeat = 0;                  
  35.                                         for(i=0; i<=9; i++){            
  36.                                                 rate[i] = IBI;                     
  37.                                         }
  38.                                 }
  39.                                 if(firstBeat){                        
  40.                                         firstBeat = 0;           
  41.                                         secondBeat = 1;               
  42.                                         continue;
  43.                                 }   

  44.                                 /* Keep a running total of the last 10 IBI values */
  45.                                 runningTotal = 0;                  

  46.                                 for(i=0; i<=8; i++){               
  47.                                         rate[i] = rate[i+1];                  
  48.                                         runningTotal += rate[i];            
  49.                                 }
  50.                                
  51.                                 /* Average the latest IBI values and calculate the BPM */
  52.                                 rate[9] = IBI;                          
  53.                                 runningTotal += rate[9];               
  54.                                 runningTotal /= 10;                     
  55.                                 BPM = 60000/runningTotal;              
  56.                                 QS = 1;  
  57.                         }                       
  58.                 }
  59.                 /* Once the beat is over, reset values */
  60.                 if (Signal < thresh && Pulse == 1){   
  61.                         Pulse = 0;                        
  62.                         amp = P - T;                           
  63.                         thresh = amp/2 + T;                  
  64.                         P = thresh;                           
  65.                         T = thresh;
  66.                 }
  67.                 /* If we do not detect a heart beat in 2.5 seconds, reset all values */
  68.                 if (N > 2500){                     
  69.                         thresh = 2548;                          
  70.                         P = 2548;                              
  71.                         T = 2548;                              
  72.                         lastBeatTime = sampleCounter;            
  73.                         firstBeat = 1;                     
  74.                         secondBeat = 0;               
  75.                 }
  76.                 current_sample++;
  77.         }
  78. }
复制代码


此帖出自NXP MCU论坛

最新回复

for(i=0; i  详情 回复 发表于 2016-5-10 22:09

赞赏

1

查看全部赞赏

点赞 关注
 

回复
举报

3

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
请问firstbeat和sencondbeat的功能是什么
此帖出自NXP MCU论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
for(i=0; i<=9; i++){     rate[i] = IBI}rate【0】到rate【9】都是一个数
此帖出自NXP MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表