全国电子设计大赛便携式脉搏测试仪技术文档文档格式.docx
《全国电子设计大赛便携式脉搏测试仪技术文档文档格式.docx》由会员分享,可在线阅读,更多相关《全国电子设计大赛便携式脉搏测试仪技术文档文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
![全国电子设计大赛便携式脉搏测试仪技术文档文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/31/c75e300a-5a16-4ae0-9d72-3265fc402c8e/c75e300a-5a16-4ae0-9d72-3265fc402c8e1.gif)
设计主要由主控单片机MSP430、ADS1115IDGSR、光电探头、放大滤波、信号调理,由光电探头进行光—电的转换,转换结果通过运算放大器OP07和A\D转换芯片ADS1115IDGSR进行传输,单片机的AD口对采集到的数据进行分析与处理,当测量出最后将转换的数字信号LCD液晶显示屏上显示。
1.2.2方案论证与选择
方案一:
以普通单片机为核心,配以外围电路。
采用AT89C52单片机,单片机需通过专用的数字芯片、等,实现脉搏的测量。
再配以LCD屏、数码管、TFT屏、点阵屏等实现控制信息以及数字信息的显示。
由于普通单片机功能有限,因此在使用时外围电路较复杂,所以在较短时间实现与完成稳定性、可靠性较差。
方案二:
以高性能的处理芯片,如ARM、DSP、FPGA等为核心、配以外围电路。
高性能的处理芯片,处理速度比较快,片内资源丰富,库函数丰富,软件编写方便。
但是价格贵。
分析本题,该系统的处理量并不是很大,所以我们不选择此方案。
方案三:
以中高档单片机为核心,配以外围驱动外围芯片组成的系统。
本系统的设计采用MSP430F149单片机,其特点是,处理能力强,运算速度快(在25MHZ的晶体驱动下,可实现4ns的指令周期),超低的功耗,丰富的片内资源,方便高效的开发环境。
看门狗(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控制器等若干外围模块的不同组合。
其中,看门狗可以使程序失控时迅速复位;
模拟比较器进行模拟电压的比较,配合定时器,可设计出A/D转换器;
16位定时器(Timer_A和Timer_B)具有捕获/比较功能,大量的捕获/比较寄存器,可用于事件计数、时序发生、
PWM
等;
有的器件更具有可实现异步、同步及多址访问串行通信接口可方便的实现多机通信等应用;
具有较多的I/O端口,P0、P1、P2端口能够接收外部上升沿或下降沿的中断输入;
10/12位硬件A/D转换器有较高的转换速率,最高可达200kbps,能够满足大多数数据采集应用;
能直接驱动液晶多达160段;
实现两路的12位
D/A
转换;
硬件I2C串行总线接口实现存储器串行扩展;
以及为了增加数据传输速度,而采用的DMA模块。
MSP430系列单片机的这些片内外设为系统的单片解决方案提供了极大的方便。
另外,MSP430系列单片机的中断源较多,并且可以任意嵌套,使用时灵活方便。
当系统处于省电的低功耗状态时,中断唤醒只需5μs。
MSP430F149单片机几乎包含了数据采集和控制中所需的所有单元模块,可称得上一个片上系统。
同时价格不高,掌握较易且满足题目3.6V电源供电要求。
基于这个特点我们选择这个芯片作为我们的控制核心。
1.3MCU控制系统的论证与选择
方案一:
89C52内置8位中央处理单元、256字节内部数据存储器RAM、8k片内程序存储器(ROM)32个双向输入/输出(I/O)口、3个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。
但是定时器过少,并且没有PWM和ADC功能。
方案二:
AVR的MEGA16L是一款高性能、低功耗的8位AVR微处理器,具有高速,还有四通道PWM和8路10位ADC以及两个可编程的串行USART都是本系统所需的重要资源。
MSP430F149拥精密的硬件乘法器、两个16位定时器、一个14路的12位的模数转换器、一个看门狗、6路P口、两路USART通信DCO内部振荡器和、一个端口、一个比较器和两个外部时钟。
通过对系统的综合设计考虑以及外设的要求,我们最终选择了MSP430F149这款功能更完善,速度更高的单片机。
二、理论分析与计算
1、脉搏信号初级放大计算
Aufⅰ=R7/R9=2
Aufⅱ=R6/R8+1=51
初级Auf=Aufⅰ*Aufⅱ=102
如图二所示:
图二:
初级放大电路
2、滤波放大电路理论分析
脉搏放大信号过来后经滤波输出给最后一级放大,使用滑动变阻器调节其放大信号,输出给下一级。
如图三所示:
图三:
滤波放大电路
3、电压比较电路分析
如图四,为同相比较器,调节滑动变阻器可改变基准电压。
当输入信号大于基准电压输出高电平;
当输入信号小于基准电压输出低电平。
故此信号处理输出方波,供下一级核心板识别。
图四:
电压比较电路
三、主要功能电路设计
1、脉搏检测电路设计
使用光电二极管信号接收检测人的脉搏跳动,通过两个OPA2227PA,做出信号的主要放大与滤波放大。
再经过下一级的LM393做出的电压比较电路,使其输出高低电平,供后一级核心板识别。
图五:
脉搏检测电路
2、核心板电路
使用MSP430F149接收LM393电路中输出的高低电平进行处理并驱动LCD液晶显示。
图六:
核心板电路
3、OPA2340跟随AD转换电路设计
图七:
OPA2340跟随AD转换电路
四、系统软件设计
1、程序框图
图八:
程序框图
五、测试方案与测试结果
1、测试仪器及型号
序号
仪器
数量
1
双综示波器
2
直流稳压源
3
函数信号发生器
4
数字万用表
5
恒温烙铁
6
电子实训平台
2、测试方案
给电路通入正负3.6V电压,然后将手指加入脉搏测试仪的传感器中,传感器会自动检测脉搏跳跃,经过放大、滤波、电压比较再传给核心板。
然后通过核心板的识别,从液晶显示器中显示出每分钟的脉搏数。
3、测试结果
图九:
一级放大波形图
图十:
二级放大波形图
图十一:
滤波后波形图
图十二:
滤波放大后波形图
图十三:
整形后波形图
4、测试结果分析
本次测试结果显示我们较好的完成了题目的基本要求及发挥部分,但仍有不足。
其中在脉搏检测电路中,可能是因为电阻值的误差,与外界干扰,使输出波形有所误差。
虽然我们使用OPA2227做的放大与滤波是很不错的,但是最后在LM393的电压比较电路中,基准电压可能是因为之前的误差,导致基准电压不稳,对测试结果会稍有影响,但整体还是比较成功,最后输出波形还是很不错的,不影响后面核心板的识别与使用。
在后期的软件部分,还是很理想的,总体来说,本次设计还是比较成功的!
六、附件
1.程序1:
(ADS1115)
#include<
msp430f149.h>
#include"
I2C.h"
typedefunsignedcharuchar;
typedefunsignedintuint;
externunsignedintInitdata[4];
uintresult_gd=0;
/*******************Config寄存器*********************/
voidConfige_1115(ucharchannel)
{
uchari=0;
switch(channel)
{
case0:
Initdata[2]=0xc2;
break;
case1:
Initdata[2]=0x52;
case2:
Initdata[2]=0x62;
case3:
Initdata[2]=0x72;
}
Initdata[0]=0x90;
//启动配置命令
Initdata[1]=0x01;
//指向配置寄存器
Initdata[3]=0x83;
//配置字低字节
SCL_H;
start();
for(i=0;
i<
4;
i++)
Send1byte(Initdata[i]);
_NOP();
stop();
}
/************指向转换结果寄存器***************/
voidPoint_reg(void)
//地址+写命令
Initdata[1]=0x00;
//指向转换结果寄存器
SDA_Out;
2;
/**************读取转换结果***************/
uintRead_1115(void)
ucharResultL,ResultH;
uintResult;
Send1byte(0x91);
ResultH=Read1byte();
ResultL=Read1byte();
Result=ResultH*256+ResultL;
returnResult;
2.程序2:
(I²
C)
#include"
ADS1115.h"
unsignedintInitdata[4]={0};
/**************起始信号***************/
voidstart()
{
SDA_L;
SCL_Out;
SDA_H;
SCL_L;
/*************终止信号*************/
voidstop()
{SDA_Out;
/*************向I2C总线发送一个字节************/
voidSend1byte(uintbyte)
uinti;
8;
if((byte<
<
i)&
0x80)
SDA_H;
else
SDA_L;
/**************读取一个字节**************/
uintRead1byte()
uinttemp=0,i;
SDA_In;
temp=temp<
1;
SCL_L;
if(P2IN&
0x02)
temp|=0x01;
returntemp;