脉搏测试仪.docx
- 文档编号:29138202
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:32
- 大小:469.63KB
脉搏测试仪.docx
《脉搏测试仪.docx》由会员分享,可在线阅读,更多相关《脉搏测试仪.docx(32页珍藏版)》请在冰豆网上搜索。
脉搏测试仪
锦电杯作品报告
基于的脉搏测试仪
队长:
袁子惟
队员:
邓秋爽、陈美英
基于的脉搏测试仪
简介
本系统能进行简单的脉搏计数功能,并通过蓝牙将采集到的脉搏数传送到中,再通过开发软件,将收集到的数据显示出来。
系统硬件部分包括最小系统,信号采集与处理,传送和显示三大部分。
其中信号的采集和处理部分主要由红外二级对管传感器,运算放大器LM348N,比较器LM393等组成;单片机选用M430F169,用于脉搏计数和连接蓝牙;最后通过编程将蓝牙传送来的数据显示在屏幕上,为了证明显示的正确性,我们又添加了一个显示屏,和同步显示数据。
系统的软件部分应用单片机C语言实现了单片机计数,JAVA编程实现了对蓝牙数据的提取,转码和显示。
一.信号的采集与处理
〔一〕信号采取部分
信号采取我们选用直径为5mm的红外发射管和相应的接收管。
如下图,浅色的为发射管,深色的为接收管。
其电路如下图:
红外发射管上所接的电阻不易太大,因为红外的发光大小与它两端的电压大小成正比,一般选在50欧到2K欧的大小,我们经过试验调试,这个红外二极管采用100欧的大小已经合适,超过了120欧红外不能发光,小于5欧很容易烧掉管子。
而红外接收管的电阻应该选的大一些,因为二极管感应光强与通过的电流有关,所以,电阻应选在1.5K到20K左右,经过测试,12K是一个合适的电阻阻值。
制作电子脉搏计最重要的就在于选用哪种传感器。
在选用红外传感之前,我们试过使用压电传感器来测试脉搏,但发现,只使用压电应变片,由于脉搏跳动太过微弱,这个效果并不是很好,要想得到一个比较好的脉搏波形,就必须借助于听诊器听筒,这个还是稍稍有些麻烦,后来改用麦克风,发现效果也不是特别明显,所以最后我们还是决定选用红外传感。
用示波器显示得出的波形如下图:
试验中我们发现,使用红外二极管测手指,效果还是很明显的,其中,它的峰峰值在1mV到10mV左右,测出的频率在一点几赫兹左右。
但是测出的脉搏信号还是很微弱,峰值仅在毫伏级,并且还存在很多高频噪声,所以还需要放大和滤波。
〔二〕前级放大
我们使用的运算放大器都为LM358N。
其管脚如下图:
前级放大我们使用了一个简单的同相放大电路:
理论的放大倍数应该为A=R/R1=200K/2K=100倍,但测试中我们发现实际放大倍数只有八十倍左右。
但是,通过实验我们发现,假设直接将得到的脉搏信号与放大电路的输入端相接,会出现阻抗不匹配的问题,为了解决这个问题,我们在王大电路输入端接入了电压跟随器,增强了阻抗匹配能力。
解决了数据放大问题。
如图:
〔三〕滤波电路
放大电路在放大信号的同时也放大了高频噪声,所以需要通过一个低通滤波器来滤掉高频噪声。
人的脉搏跳动次数在每分钟60到120次左右,频率在1到2Hz左右,
设计的滤波电路为
设置f0=10Hz,
则截止频率fp=0.37f0=3.7Hz,
又f0=1/2*3.14RC,取c=0.1u,
所以取R=160k
实验中,我们得到截止频率大概在5Hz左右,还是满足要求的。
加入滤波电路后的波形为:
效果还是很不错的。
〔四〕后级放大
通过放大和滤波的信号峰值还是在毫伏级,所以还是需要放大。
后级放大的电路和前级放大的电路相同,也为同相放大电路,理论放大十五倍,实际放大在12倍左右。
两级放大后的信号能放大到1100倍左右,放大后的信号超过7v以后会有失真的现象,但并不影响后面的转换和计数,所以我们就没有更改电路。
信号提取和处理部分电路图
信号提取和处理部分PCB板
〔五〕、波形转换电路
提取出信号后我们还要将其转化为方波,方便单片机计数。
我们最开始选用了74HC14斯密特反相触发器集成电路。
斯密特触发器属于电平触发器件,当输入信号到达某一定电压值时,电路的阀值电压分别是正向阀值电压〔VT+〕和负阀值电压〔VT-〕。
当输入信号在变化的过程中到达了阀值电压,其输出电压降产生跳变。
以反相斯密特触发器为例,以下是其传输特性曲线和工作波形:
斯密特触发器具有波形变换和消除干扰信号的功能,当放大后的脉搏信号增
加到超过其上限阈值电压时,由上图可知,输出会出现一个低电平信号VOL;当
脉搏信号减小到下限阈值电压时输出又变为高电平VOH。
我们在其后又加了一个反
向器,就使得一个脉搏信号对应一个高电平的方波,这就是波形转换功能。
同时,
由于放大后的噪声信号与脉搏信号相比而言较小,它就无法超过斯密特触发器的
上限阈值电压而转换为方波,这就是消除干扰信号的功能。
集成的反向斯密特触发器74HC14,在外加电压为5V,温度为25°C时,上限阈值电压为:
3V,下限阈值电压为1.40V。
但使用后发现,集成的斯密特触发器会影响前面的输出波形,并且不能喝前级电路共电源,比较麻烦,所以最后我们放弃了这个方案。
最后,我们用比较器LM393搭成了一个简单的比较电路。
由于脉搏频率过低,所以出来的波形不能到达预想的方波效果,但是我们实际只需要下降沿触发单片机,所以也没有多大的影响。
在开始调试滤波电路的时候,并没有添加20K的上拉电阻,所以出现了阻抗不匹配的现象,在加上之后,信号转换成功。
二.单片机计数
我们采用的M430F169单片机来进行脉搏计数。
MSP430系列单片机是一个16位的单片机,采用了精简指令集〔RISC〕结构,具有丰富的寻址方式〔7种源操作数寻址、4种目的操作数寻址〕、简洁的27条内核指令以及大量的模拟指令;大量的寄存器以及片内数据存储器都可参加多种运算;还有高效的查表处理指令.MSP430系列单片机的各系列都集成了较丰富的片内外设。
它们分别是看门狗〔WDT〕、模拟比较器A、定时器A0〔Timer_A0〕、定时器A1〔Timer_A1〕、定时器B0〔Timer_B0〕、UART、SPI、I2C、硬件乘法器、液晶驱动器、10位/12位ADC、16位Σ-ΔADC、DMA、I/O端口、基本定时器〔BasicTimer〕、实时时钟〔RTC〕和USB控制器等假设干外围模块的不同组合。
P0、P1、P2端口能够接收外部上升沿或下降沿的中断输入。
P34、P35用来串口传送数据和接收数据,P1的任意一个口用来接收数据,外接1602液晶显示屏,P2,P6为LCD控制引脚。
程序通过P1口信号的下降沿触发产生中断,进行计数,并和定时器配合使用。
将中断计数分别传送到LCD显示屏和串口〔P34〕输出处进行数据显示和蓝牙传送,60秒后计数停止,传送最终数据至显示屏,数据不再变化,等待复位重新计数。
由于蓝牙的波特率为9600,只有和蓝牙波特率保持一致才能正常传送数据,所以我们通过编程将单片机传送波特率改为9600。
软件部分主代码:
#include"MSP430X14X.h"
#include"cry1602.h"
#include"cry1602.c"
ucharsf1=0,mb=0,number=0,ci;
voiddis(void)//LCD显示
{
DispNChar(0,0,10,"thembis:
");//第一行显示每分钟的脉搏数
if(mb>9)
{
Disp1Char(11,0,(mb%100/10+48));
Disp1Char(12,0,(mb%10+48));
}
else
{
Disp1Char(11,0,(0+48));
Disp1Char(12,0,(mb%10+48));
}
}
voiddis1(void)//LCD显示
{
DispNChar(0,1,16,"");
if(number>9)
{
Disp1Char(11,1,(number%100/10+48));//第二行随着脉搏信号〔下面用P3模拟〕下降沿的发生而变化
Disp1Char(12,1,(number%10+48));
}
else
{
Disp1Char(11,1,(0+48));//第二行随着脉搏信号〔下面用P3模拟〕下降沿的发生而变化
Disp1Char(12,1,(number%10+48));
}
}
voiduartinit(void)
ME1|=UTXE0+URXE0;//使能USART0的发送和接受
UCTL0|=CHAR;//选择8位字符
UTCTL0|=SSEL0;//UCLK=ACLK
UBR00=0x03;//波特率9600
UBR10=0x00;//
UMCTL0=0x4A;//Modulation
UCTL0&=~SWRST;//初始化UART状态机
}
voidmain(void)
{
/*下面六行程序关闭所有的IO口*/
P1DIR=0XFF;P1OUT=0XFF;
P2DIR=0XFF;P2OUT=0XFF;
P3DIR=0XFF;P3OUT=0XFF;
P4DIR=0XFF;P4OUT=0XFF;
P5DIR=0XFF;P5OUT=0XFF;
P6DIR=0XFF;P6OUT=0XFF;
WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
CCR0=32768-1;//设置定时器A的中断时间为1S
TACTL=TASSEL_1+MC_1;//计数时钟ACLK,增计数模式
CCTL0|=CCIE;//使能CCR0比较中断
_EINT();//打开全局中断
P1DIR=0X00;//将P1设置为下降沿中断,每次中断会执行__interruptvoidmb_int(void)
P1SEL=0X00;
P1IES=0X00;
P1IE=0XFF;
uartinit();
LcdReset();
DispNChar(0,0,10,"thembis:
");
/*将P1引脚上接脉搏信号,因为P1用作测量脉搏脉冲,P2,P6为LCD控制引脚,故不要
将这些引脚做他用,以免程序出错
MSP430控制引脚高低电平变化方法:
P3DIR=0XFF;//控制引脚作为输出引脚
P3OUT=tmp;//将需要的电平tmp输出
P4DIR=0X00;//控制引脚作为输入引脚
tmp=P4IN;//读取读入的数据
*/
while
(1){
}
}
#pragmavector=PORT1_VECTOR
__interruptvoidmb_int(void)
{
P1IFG=0X00;
if(sf1<=60)
number++;
dis1();
while(!
(IFG1&UTXIFG0));//等待以前的字符发送完毕
TXBUF0=number-1;
}
#pragmavector=TIMERA0_VECTOR
__interruptvoidTimerA_ISR(void)
{
sf1++;
if(sf1>=60)
{
//sf1=0;
mb=number;
//number=0;
dis();
}
}
三.蓝牙传送及接收显示
〔一〕蓝牙
由于自带蓝牙功能,所以我们觉得通过蓝牙传送数据更好一些。
关于蓝牙设备我们选用了一块已经集成好的从机蓝牙无线串口模块,使用时可以直接当做一个串口线使用。
使用方法:
把模块的通信线RXDTXD连接到单片机的TXD,RXD口〔P34,P35〕,然后用或者电脑搜索蓝牙设备,并配对连接。
蓝牙模块有两个电源接口,可接3.3V电压,也可接5V电压,它自带电压转换芯片,接了5V之后可以转化为蓝牙所需的3.3V电压。
蓝牙连接电源后,指示灯会出现闪烁现象,这时我们就可以打开,搜索蓝牙设备,蓝牙设备的默认名字为HC-07,默认密码为1234,连接上后,蓝牙的指示灯就会显示为常亮状态。
〔二〕接收和显示
我们使用串口调试助手,通过单片机向蓝牙传送数据,查看是否能收到。
实验中我们发现串口助手能够检测到蓝牙传送过来的数据但却不能进行正确的显示。
显示屏上显示的数据和上显示的数据的比照。
然后我们猜想它应该是接收到了正确的数据,只是进行了转换,所以转换成了一种字符。
最后我们通过JAVA平台调出它的源代码,发现它接收的为INT类型,要显示正确的数据就需把它转换成CHAR型。
由于我们对软件编程还不太熟悉,对蓝牙协议也不是特别清楚,所以我们只是在原有的程序上做了一定的修改,使它能够显示正确的数据,并对软件外观等做了一些美化。
经过测试后,软件运行成功。
程序主代码〔主要修改部分用中文注释〕:
/*
*Copyright(C)2009TheAndroidOpenSourceProject
*
*LicensedundertheApacheLicense,Version2.0(the"License");
*youmaynotusethisfileexceptincompliancewiththeLicense.
*YoumayobtainacopyoftheLicenseat
*
*
*Unlessrequiredbyapplicablelaworagreedtoinwriting,software
*distributedundertheLicenseisdistributedonan"ASIS"BASIS,
*WITHOUTWARRANTIESORCONDITIONSOFANYKIND,eitherexpressorimplied.
*SeetheLicenseforthespecificlanguagegoverningpermissionsand
*limitationsundertheLicense.
*/
packagecom.example.android.BluetoothChat;
importcom.example.android.BluetoothChat.R;
importandroid.app.Activity;
importandroid.bluetooth.BluetoothAdapter;
importandroid.bluetooth.BluetoothDevice;
importandroid.content.Intent;
importandroid.graphics.Color;
importandroid.graphics.Typeface;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.text.Spannable;
importandroid.text.SpannableString;
importandroid.text.style.AbsoluteSizeSpan;
importandroid.text.style.StyleSpan;
importandroid.util.Log;
importandroid.view.KeyEvent;
importandroid.view.Menu;
importandroid.view.MenuInflater;
importandroid.view.MenuItem;
importandroid.view.View;
importandroid.view.Window;
importandroid.view.View.OnClickListener;
importandroid.view.inputmethod.EditorInfo;
importandroid.widget.ArrayAdapter;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.ListView;
importandroid.widget.TextView;
importandroid.widget.Toast;
/**
*ThisisthemainActivitythatdisplaysthecurrentchatsession.
*/
publicclassBluetoothChatextendsActivity{
//Debugging
privatestaticfinalStringTAG="BluetoothChat";
privatestaticfinalbooleanD=true;
//MessagetypessentfromtheBluetoothChatServiceHandler
publicstaticfinalintMESSAGE_STATE_CHANGE=1;
publicstaticfinalintMESSAGE_READ=2;
publicstaticfinalintMESSAGE_WRITE=3;
publicstaticfinalintMESSAGE_DEVICE_NAME=4;
publicstaticfinalintMESSAGE_TOAST=5;
//KeynamesreceivedfromtheBluetoothChatServiceHandler
publicstaticfinalStringDEVICE_NAME="device_name";
publicstaticfinalStringTOAST="toast";
//Intentrequestcodes
privatestaticfinalintREQUEST_CONNECT_DEVICE=1;
privatestaticfinalintREQUEST_ENABLE_BT=2;
//LayoutViews
privateTextViewmTitle;
privateListViewmConversationView;
//privateEditTextmOutEditText;
//privateButtonmSendButton;
//Nameoftheconnecteddevice
privateStringmConnectedDeviceName=null;
//Arrayadapterfortheconversationthread
//privateArrayAdapter
//Stringbufferforoutgoingmessages
privateStringBuffermOutStringBuffer;
//LocalBluetoothadapter
privateBluetoothAdaptermBluetoothAdapter=null;
//Memberobjectforthechatservices
privateBluetoothChatServicemChatService=null;
TextViewtextview_1;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
if(D)Log.e(TAG,"+++ONCREATE+++");
//Setupthewindowlayout
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.main);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.custom_title);
//Setupthecustomtitle
mTitle=(TextView)findViewById(R.id.title_left_text);
mTitle.setText(R.string.app_name);
mTitle=(TextView)findViewById(R.id.title_right_text);
//GetlocalBluetoothadapter
mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
textview_1=(TextView)findViewById(R.id.textview_1);
//Iftheadapterisnull,thenBluetoothisnotsupported
if(mBluetoothAdapter==null){
Toast.makeText(this,"Bluetoothisnotavailable",Toast.LENGTH_LONG).show();
finish();
return;
}
}
@Override
publicvoidonStart(){
super.onStart();
if(D)Log.e(TAG,"++ONSTART++");
//IfBTisnoton,requestthatitbeenabled.
//setupChat()willthenbecalledduringonActivityResult
if(!
mBluetoothAdapter.isEnabled()){
IntentenableIntent=newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableIntent,REQUEST_ENABLE_BT);
//Otherwise,setupthechatsession
}else{
if(mChatService==n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 脉搏 测试仪
![提示](https://static.bdocx.com/images/bang_tan.gif)