查看: 63|回复: 0

基于麒麟座mini开发板的心率检测器

[复制链接]

主题

好友

4840

积分

状元

  • TA的每日心情
    奋斗
    昨天 14:17
  • 签到天数: 1003 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2017-9-20 08:48:59 |显示全部楼层
    心率是一项重要的生理指标,通过心率传感器的使用我们能够较好地获取心率信息。PulseSensor 就是一款光电反射式的脉搏心率传感器,其输出信号为模拟信号。使用时,可将其佩戴于手指、耳垂等处。借助麒麟座mini开发板内部的模数转换器,可将采集到的心率模拟信号由模拟转换为数值量,以便于计算出相应的心率参数。此外,还可将脉搏数据通过串口上传到电脑,并通过专用程序显示出波形,其主要构成如图1所示。

    图1  心率检测整体构成
    该设计供提供3种使用方式:
    方式一:使用TFT屏显示心率波形

    方式二:使用通讯串口1向PC发送心率数据

    方式三:使用通讯串口2向蓝牙发送心率数据,进而供手机或PC接收。

           心率传感器的外观如图2所示,它共有 3 个引脚,其中标有 S 的为模拟信号输出线(最左边);标有+的为电源输入线(中间);标有-的为地线(最右边)。
    在使用时,是将S端连接到开发板的PA0引脚。电源输入可连接5V 或 3 .3V。

    图2  心率传感器外观
           在使用TFT屏绘制心率波形前,可以下载器将串口1所发送的心率数据传送到PC,并以串行助手进行查看,其执行效果如图3所示。
    串口所输出的心率数据均为 ASCII 码格式,因数据量较大,故所用的通讯波特率为 115200。
    在传送的数据中,供含3种数据,其中以“S”为前缀的,是表示脉搏的数据(脉象图的数
    值化表示);以“B”为前缀的,是表示 BPM 数值(心率值);以“Q”为前缀的,是表示 IBI 数值(相邻两个心跳之间的时间)。这3种数据若发给上位机 Processing 软件,就会在窗口中显示出来。 数据S 的发送频率为20ms 一次,数据量较大;数据B 和 Q 只在检测到有效脉搏后,才在每一次心跳后发送一次,数据量较小。其效果如图4和图5所示。

    图3  串口接收心率数据

    图4  心率检测初始时段效果

    图5  长时段心率检测效果
           在接入TFT显示屏的情况下,其心率波形显示效果如图6所示。界面所显示的汉字由字模提取软件PCtoLCD2002来制备,所设置的字模生成格式如图7和图8所示。

    图6  心率波形显示效果

    图7生成格式设置

    图8专用字模提取
    绘制波形所用的画线函数其内容如下:
    void LCD_DrawLine(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2){        unsigned int t;         int xerr=0,yerr=0,delta_x,delta_y,distance;         int incx,incy,uRow,uCol;         delta_x=x2-x1;          delta_y=y2-y1;         uRow=x1;         uCol=y1;         if(delta_x>0)incx=1;          else if(delta_x==0)incx=0;         else {incx=-1;delta_x=-delta_x;}         if(delta_y>0)incy=1;         else if(delta_y==0)incy=0;         else{incy=-1;delta_y=-delta_y;}         if( delta_x>delta_y)distance=delta_x;         else distance=delta_y;         for(t=0;t<=distance+1;t++ )         {                  LCD_DrawPoint(uRow,uCol);                 xerr+=delta_x ;                 yerr+=delta_y ;                 if(xerr>distance)                 {                         xerr-=distance;                         uRow+=incx;                 }                 if(yerr>distance)                 {                         yerr-=distance;                         uCol+=incy;                 }         }  }实现心率曲线绘制的主函数程序如下:
    int main(void){  int16_t sj,sp,j;  HAL_Init();  SystemClock_Config();  SPI_CONFIG();          Lcd_Init();  LCD_Clear(RED);   BACK_COLOR=RED;   POINT_COLOR=WHITE;    showhanzi16h(40,120,5,0);  showhanzi16h(40,140,4,0);  showhanzi16h(40,160,3,0);  showhanzi16h(40,180,2,0);  showhanzi16h(40,200,1,0);  showhanzi16h(40,220,0,0);          showhanzi16h(200,120,9,0);  showhanzi16h(200,140,8,0);  showhanzi16h(200,160,7,0);  showhanzi16h(200,180,9,0);                          showhanzi16h(200,260,6,0);          showhanzi16h(200,280,1,0);  showhanzi16h(200,300,0,0);  POINT_COLOR=WHITE;    LCD_DrawLine(10, 300, 190, 300);  LCD_DrawLine(190, 10, 190, 300);   sp=0;  MX_GPIO_Init();  MX_ADC1_Init();  MX_TIM3_Init();  MX_USART2_UART_Init();  HAL_TIM_Base_Start_IT(&htim3);  j=0;  while (1)  {                sendDataToProcessing('S', Signal);                     j++;                POINT_COLOR=YELLOW;                 sj=Signal/5;                 LCD_DrawLine(190-sp, 300-3*(j-1), 190-sj, 300-3*(j));                  sp=sj;                if(j>86 )                {                LCD_ClearQ(RED);                        j=0;                POINT_COLOR=WHITE;                  showhanzi16h(40,120,5,0);                showhanzi16h(40,140,4,0);                showhanzi16h(40,160,3,0);                showhanzi16h(40,180,2,0);                showhanzi16h(40,200,1,0);                showhanzi16h(40,220,0,0);                                        showhanzi16h(200,120,9,0);                showhanzi16h(200,140,8,0);                 showhanzi16h(200,160,7,0);                showhanzi16h(200,180,9,0);                                        showhanzi16h(200,260,6,0);                        showhanzi16h(200,280,1,0);                showhanzi16h(200,300,0,0);                                POINT_COLOR=WHITE;                  LCD_DrawLine(10, 300, 190, 300);                LCD_DrawLine(190, 10, 190, 300);                }                          if (QS == true)                {                sendDataToProcessing('B',BPM);                   sendDataToProcessing('Q',IBI);                  LCD_ShowCharh(200,100,':',0);                LCD_ShowCharh(200 ,240,':',0);                LCD_ShowCharh(200,230,BPM/100+0x30,0);                LCD_ShowCharh(200,220,BPM0/10+0x30,0);                LCD_ShowCharh(200,210,BPM+0x30,0);                LCD_ShowCharh(200,90,IBI/1000+0x30,0);                LCD_ShowCharh(200,80,IBI00/100+0x30,0);                LCD_ShowCharh(200,70,IBI0/10+0x30,0);                LCD_ShowCharh(200,60,IBI+0x30,0);                QS = false;                                      }                                HAL_Delay(20);  }}
    回复

    使用道具 举报

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

    关闭

    站长推荐上一条 /6 下一条

    手机版|电路城

    GMT+8, 2019-6-27 01:05 , Processed in 0.114757 second(s), 14 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz!

    返回顶部