基于MPX4115的数字压力测量仪器设计.docx
《基于MPX4115的数字压力测量仪器设计.docx》由会员分享,可在线阅读,更多相关《基于MPX4115的数字压力测量仪器设计.docx(17页珍藏版)》请在冰豆网上搜索。
基于MPX4115的数字压力测量仪器设计
大作业说明书
基于MPX4115的数字压力测量仪器设计
学生姓名:
xxx
学生学号:
08372
专业:
测控技术与仪器
指导教师:
程xx
(一)系统总体设计
1:
设计整体思想
基于MPX4115的数字气压计包括软硬件的设计与调试。
软件部分通过对C语言的学习和对单片机知识的了解,根据系统的特点编写出单片机程序。
硬件部分分为四大块,包括非电信号数据的采集、转换、处理以及显示:
。
通过对设计的了解,选择适合的器件,画出原理图。
2:
系统总体框图
硬件部分由四部分构成,它们分别是:
信息采集模块,数据转换模块,信息处理模块和数据显示模块。
(二)硬件电路设计及描述
1:
数字压力测量仪设计意义
压力测量仪被广泛应用于国防领域、工业领域、医疗领域以及我们日常家庭生活中。
其中的核心元件就是压力传感器,它在监视压力大小、控制压力变化以及物理参量的测量等方面起着重要作用。
本系统设计的数字压力测量仪采用单片机控制,具有使用方便、精度高、显示简单和灵活性等优点,而且可以大幅提高被控气压的技术指标,从而能够大大提高产品的质量
2:
数据采集模块的芯片选择
压力传感器对于系统至关重要,需要综合实际的需求和各类压力传感器的性能参数加以选择。
一般要选用有温度补偿作用的压力传感器,因为温度补偿特性可以克服半导体压力传感器件存在的温度漂移问题。
本设计要实现的数字气压计显示的是绝对气压值,同时为了简化电路,提高稳定性和抗干扰能力,要求使用具有温度补偿能力的压力传感器。
经过综合考虑,本设计选用美国摩托罗拉公司的集成压力传感器。
MPX4115可以产生高精度模拟输出电压。
数据采集模块由压力传感器MPX4115构成。
其中1脚是输出信号端,输出的是与气压值相对应的模拟电压信号。
数据采集模块的原理如图、
数据采集模块原理图MPX4115的实物图
气压传感器MPX4115的原理
MPX4115系列压电电阻传感器是一个硅压力传感器。
这个传感器结合了高级的微电机技术,薄膜镀金属。
还能为高水准模拟输出信号提供一个均衡压力。
在0℃-85℃的温度下误差不超过1.5%,温度补偿是-40℃-125℃。
3:
单片机控制模块
由AT89C51单片机、时钟电路、复位电路组成AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。
AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除100次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。
AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
4:
A/D转换模块
ADC0832是美国国家半导体公司生产的一种8位分辨率、双通道A/D转换芯片。
由于它体积小,兼容性,性价比高而深受单片机爱好者及企业欢迎,其目前已经有很高的普及率。
学习并使用ADC0832可是使我们了解A/D转换器的原理,有助于我们单片机技术水平的提高。
8位分辨率双通道A/D转换输入输出电平与TTL/CMOS相兼容5V电源供电时输入电压在0~5V之间工作频率为250KHZ,转换时间为32μS
ADC0832为8位分辨率A/D转换芯片,其最高分辨可达256级,可以适应一般的模拟量转换要求。
其内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。
芯片转换时间仅为32μS,据有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。
独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。
通过DI数据输入端,可以轻易的实现通道功能的选择。
正常情况下ADC0832与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。
但由于DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将DO和DI并联在一根数据线上使用。
当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK和DO/DI的电平可任意。
当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束。
此时芯片开始转换工作,同时由处理器向芯片时钟输入端CLK输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。
在第1个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号。
在第2、3个脉冲下沉之前DI端应输入2位数据用于选择通道功能,其功能项见官方资料。
如资料所示,当此2位数据为“1”、“0”时,只对CH0进行单通道转换。
当2位数据为“1”、“1”时,只对CH1进行单通道转换。
当2位数据为“0”、“0”时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。
当2位数据为“0”、“1”时,将CH0作为负输入端IN-,CH1作为正输入端IN+进行
输入。
到第3个脉冲的下沉之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。
从第4个脉冲下沉开始由DO端输出转换数据最高位DATA7,随后每一个脉冲下沉DO端输出下一位数据。
直到第11个脉冲时发出最低位数据DATA0,一个字节的数据输出完成。
也正是从此位开始输出下一个相反字节的数据,即从第11个字节的下沉输出DATA0。
随后输出8位数据,到第19个脉冲时数据输出完成,也标志着一次A/D转换的结束。
最后将CS置高电平禁用芯片,直接将转换后的数据进行处理就可以了。
作为单通道模拟信号输入时ADC0832的输入电压是0~5V且8位分辨率时的电压精度为19.53mV。
如果作为由IN+与IN-输入的输入时,可是将电压值设定在某一个较大范围之内,从而提高转换的宽度。
但值得注意的是,在进行IN+与IN-的输入时,如果IN-的电压大于IN+的电压则转换后的数据结果始终为00H。
5:
显示模块
采用LED动态扫描显示原理如下:
(1)P23、P22、P21、P20输出高电平,关闭所有数码管;
(2)显示个位——把要显示的数据送到P10~P17,P23送低电平,延时5豪秒(时间不能太长,否则数码管会闪烁),P23送高电平;
(3)显示十位——把要显示的数据送到P10~P17,P22送低电平,延时5豪秒(时间不能太长,否则数码管会闪烁),P22送高电平;
(4)显示百位——把要显示的数据送到P10~P17,P21送低电平,延时5豪秒(时间不能太长,否则数码管会闪烁),P21送高电平;
(5)显示千位——把要显示的数据送到P10~P17,P20送低电平,延时5豪秒(时间不能太长,否则数码管会闪烁),P20送高电平。
(6)以此顺序循环,把它做成子程序,在主循环中调用。
现已DS8为个位来讨论,十、百、千为分别为DS7、DS6、DS5。
1、首先要了解的是此数码管为共阴极数码管,即三极管Q16、Q15、Q14、Q13导通时数码管才能点亮,亦即相应的单片机P23、P22、P21、P20为低电平。
2、动态扫描显示原理如下:
(1)P23、P22、P21、P20输出高电平,关闭所有数码管;
(2)显示个位——把要显示的数据送到P10~P17,P23送低电平,延时5豪秒(时间不能太长,否则数码管会闪烁),P23送高电平;
(3)显示十位——把要显示的数据送到P10~P17,P22送低电平,延时5豪秒(时间不能太长,否则数码管会闪烁),P22送高电平;
(4)显示百位——把要显示的数据送到P10~P17,P21送低电平,延时5豪秒(时间不能太长,否则数码管会闪烁),P21送高电平;
(5)显示千位——把要显示的数据送到P10~P17,P20送低电平,延时5豪秒(时间不能太长,否则数码管会闪烁),P20送高电平。
(6)以此顺序循环,把它做成子程序,在主循环中调用
6:
系统总体电路图
(三)软件设计
流程图
系统总流程图A/D转换程序流程图
显示流程图主函数流程图
主程序
voidmain(void)
{
while
(1)
{unsignedinttemp;
floatpress;
getdata=Adc0832(0);
if(14{
intvary=getdata;//y=(115-15)/(243-13)*X+15kpa
press=((10.0/23.0)*vary)+9.3;//测试时补偿值为9.3
temp=(int)(press*10);//放大10倍,便于后面的计算
dispbuf[3]=temp/1000;//取压力值百位
dispbuf[2]=(temp%1000)/100;//取压力值十位
dispbuf[1]=((temp%1000)%100)/10;//取压力值个位
dispbuf[0]=((temp%1000)%100)%10;//取压力值十分位
display();
}
LED显示程序
#defineuintunsignedint
#defineucharunsignedchar
//ADC0832的引脚
sbitADCS=P2^0;//ADC0832chipseclect
sbitADDI=P3^7;//ADC0832kin
sbitADDO=P3^7;//ADC0832kout
sbitADCLK=P3^6;//ADC0832clocksignal
unsignedchardispbitcode[8]={0xf7,0xfb,0xfd,0xfe,0xef,0xdf,0xbf,0x7f};//位扫描
unsignedchardispcode[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0803072080x82,0xF8,0x80,0x90,0xff};//共阳数码管字段码
unsignedchardispbuf[4];
uinttemp;
uchargetdata;//获取ADC转换回来的值
voiddelay_1ms(void)//12mhzdelay1.01ms
{
unsignedcharx,y;
x=3;
while(x--)
{
y=40;
while(y--);
}
}
voiddisplay(void)//数码管显示函数
{
chark;
for(k=0;k<4;k++)
{
P1=dispbitcode[k];
P0=dispcode[dispbuf[k]];
if(k==1)//加上数码管的dp小数点
P0&=0x7f;
delay_1ms();
}
}
A/D转换程序
unsignedintAdc0832(unsignedcharchannel)//AD转换,返回结果
{
uchari=0;
ucharj;
uintdat=0;
ucharndat=0;
if(channel==0)channel=2;
if(channel==1)channel=3;
ADDI=1;
_nop_();
_nop_();
ADCS=0;//拉低CS端
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿1
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=channel&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿2
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=(channel>>1)&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿3
ADDI=1;//控制命令结束
_nop_();
_nop_();
dat=0;
for(i=0;i<8;i++)
{
dat|=ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
dat<<=1;
if(i==7)dat|=ADDO;
}
for(i=0;i<8;i++)
{
j=0;
j=j|ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
j=j<<7;
ndat=ndat|j;
if(i<7)ndat>>=1;
}
ADCS=1;//拉低CS端
ADCLK=0;//拉低CLK端
ADDO=1;//拉高数据端,回到初始状态
dat<<=8;
dat|=ndat;
return(dat);//returnad
5.源程序代码:
压力测试仪
系统描述;输入15--115kPA压力信号
输出00h--ffh数字信号(adc0832)080307208
在LED上显示实际的压力值,如果超限则报警
#include
#include"intrins.h"
#defineuintunsignedint
#defineucharunsignedchar
//ADC0832的引脚
sbitADCS=P2^0;//ADC0832chipseclect
sbitADDI=P3^7;//ADC0832kin
sbitADDO=P3^7;//ADC0832kout
sbitADCLK=P3^6;//ADC0832clocksignal080307208
unsignedchardispbitcode[8]={0xf7,0xfb,0xfd,0xfe,0xef,0xdf,0xbf,0x7f};//位扫描
unsignedchardispcode[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};//共阳数码管字段码
unsignedchardispbuf[4];
uinttemp;
uchargetdata;//获取ADC转换回来的值
voiddelay_1ms(void)//12mhzdelay1.01ms
{
unsignedcharx,y;
x=3;
while(x--)
{
y=40;
while(y--);
}
}
voiddisplay(void)//数码管显示函数
{
chark;
for(k=0;k<4;k++)
{
P1=dispbitcode[k];
P0=dispcode[dispbuf[k]];
if(k==1)//加上数码管的dp小数点
P0&=0x7f;
delay_1ms();
}
}
/************
读ADC0832函数
************/
//采集并返回
unsignedintAdc0832(unsignedcharchannel)//AD转换,返回结果
{
uchari=0;
ucharj;
uintdat=0;
ucharndat=0;
if(channel==0)channel=2;
if(channel==1)channel=3;
ADDI=1;
_nop_();
_nop_();
ADCS=0;//拉低CS端
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿1
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=channel&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿2
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=(channel>>1)&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿3
ADDI=1;//控制命令结束
_nop_();
_nop_();
dat=0;
for(i=0;i<8;i++)
{
dat|=ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
dat<<=1;
if(i==7)dat|=ADDO;
}
for(i=0;i<8;i++)
{
j=0;
j=j|ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
j=j<<7;
ndat=ndat|j;
if(i<7)ndat>>=1;
}
ADCS=1;//拉低CS端
ADCLK=0;//拉低CLK端
ADDO=1;//拉高数据端,回到初始状态
dat<<=8;
dat|=ndat;
return(dat);//returnadk
}
voidmain(void)
{
while
(1)
{unsignedinttemp;
floatpress;
getdata=Adc0832(0);
if(14{
intvary=getdata;//y=(115-15)/(243-13)*X+15kpa
press=((10.0/23.0)*vary)+9.3;//测试时补偿值为9.3
temp=(int)(press*10);//放大10倍,便于后面的计算
dispbuf[3]=temp/1000;//取压力值百位
dispbuf[2]=(temp%1000)/100;//取压力值十位
dispbuf[1]=((temp%1000)%100)/10;//取压力值个位
dispbuf[0]=((temp%1000)%100)%10;//取压力值十分位
display();
}
}
}
黄继鹏080307208
于2011/12/13