数字压力计的仿真设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
1. 概述
1.1 压力传感器简介————————————————2
1.2 总体设计方案—————————————————2
2.硬件电路的设计
2.1 传感器的选型—————————————————3
2.2 传感器接口电路设计——————————————3
2.3 最小系统设计—————————————————4
2.4模数转换电路设计———————————————5
2.5 显示电路设计—————————————————6
2.6 电源电路设计—————————————————7
3.软件部分的设计
3.1 程序设计及分析————————————————7
4.仿真及结果
4.1 仿真图————————————————————12
5.设计小结—————————————————————14
6.参考文献—————————————————————15
1.概述
1.1 压力传感器简介
压力传感器是工业实践中最为常用的一种传感器,其广泛应用于各种工业自控环境,涉及水利水电、铁路交通、智能建筑、生产自控、航空航天、军工、石化、油井、电力、船舶、机床、管道等众多行业,而我们通常使用的压力传感器主要是利用压电效应制造而成的,这样的传感器也称为压电传感器。
压电传感器中主要使用的压电材料包括有石英、酒石酸钾钠和磷酸二氢胺。
其中石英(二氧化硅)是一种天然晶体,压电效应就是在这种晶体中发现的,在一定的温度范围之内,压电性质一直存在,但温度超过这个范围之后,压电性质完全消失(这个高温就是所谓的“居里点”)。
由于随着应力的变化电场变化微小(也就说压电系数比较低),所以石英逐渐被其他的压电晶体所替代。
而酒石酸钾钠具有很大的压电灵敏度和压电系数,但是它只能在室温和湿度比较低的环境下才能够应用。
磷酸二氢胺属于人造晶体,能够承受高温和相当高的湿度,所以已经得到了广泛的应用。
压电效应是压电传感器的主要工作原理,压电传感器不能用于静态测量,因为经过外力作用后的电荷,只有在回路具有无限大的输入阻抗时才得到保存。
现在压电效应也应用在多晶体上,比如现在的压电陶瓷,包括钛酸钡压电陶瓷、PZT、铌酸盐系压电陶瓷、铌镁酸铅压电陶瓷等等。
1.2 总体设计方案
压力传感器主要是用来测量压力并将相应的压力值转换为可直接读取的值,因此,需要一个能智能显示的压力计,本设计方案本着低碳、绿色的理念设计,将成本缩减到最小。
压力传感器主要由压力传感器,AD转换器,单片机AT89C51,LED 显示器构成,分别对应着信息采集,数据转换,信息处理和数据显示四个模块。
其间关系与操作流程如下两图所示:
2.硬件电路的设计
2.1传感器的选型
MPX4115系列压电电阻传感器是一个硅压力传感器。
这个传感器结合了高级的微电机技术,薄膜镀金属。
还能为高水准模拟输出信号提供一个均衡压力。
在
0℃-85℃的温度下误差不超过1.5%,温度补偿是-40℃-125℃。
MPX4115压力传感器检测的范围是15KPA-115KPA,输出电压信号0.2V-4.8V。
ADC0808的参考电压VREF+=5V,VREF-=0V。
则(0V-5V)对应(0-255),(0.2V-4.8V)对应。
其线性对应关系如下图所示:
系统最小分辨率:
2.2传感器接口电路的设计
采用C1=47PF的电容作滤波电路,以及内部原理图如下图所示:
内部原理图滤波电路
2.3单片机最小系统设计
选用的单片机为AT89C51系列芯
片,该芯片的最小系统由时钟电路、复位
电路、片选信号构成。
在最小系统构成的
基础上,将P1口作为模拟量的转换为数
字量的接收端,P0口作LED显示屏的数
据发送端,P2口作LED显示屏的控制端
口,同时作为过压及欠压的报警电路使
用。
具体最小系统设计如右图所示:
2.4 模数转换电路设计
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。
其硬件引脚如图所示:
2.5显示电路设计
显示界面利用16X1的LM016L的字符型液晶LM020L进行显示,相比LED显示能显示更多的内容,人机界面更友好,而且节省单片机硬件资源。
其引脚接线以及驱动电路如下图所示:
如上图所示:
RS、RW、E分别接至P2.0、P2.1、P2,2作为显示器的控制端口,D0、D1、D2、D3、D4、D5、D6、D7与P0口直接相连,同时使用驱动电路RESPACK-8来提供足够的LCD电源。
2.6 电源电路设计
此设计的所有硬件电路均可有5V的直流电源驱动,因此使用标准的5V的电压源作为电路电源。
3.软件部分的设计
#include <reg51.h>
#include <intrins.h>
#include <stdio.h> //包含必要的头文件
#define uint unsigned int
#define uchar unsigned char
#define delay4us() {_nop_();_nop_();_nop_();_nop_();}
#define NOP _nop_()
sbit HIGH=P2^3 ;
sbit LOW=P2^4 ;
sbit AD_CS =P1^0;
sbit SCK=P1^1;
sbit DO =P1^2;
sbit DI =P1^2;
sbit RS = P2^0;
sbit RW = P2^1;
sbit E = P2^2; //必要的位定义
unsigned char adval;
uchar Display_Buffer[] = "000.0KPa";
uchar code Line1[] = "Current Press:"; //初始化所显示的字符
uchar adc0832(uchar channel) //读ADC0832函数,采集并返回
{
uchar i=0;
uchar j;
uint dat2=0;
uchar ndat=0;
if(channel==0)channel=2;
if(channel==1)channel=3;
AD_CS=0;NOP; NOP; //拉低CS端,AD片选DI=1;NOP; NOP;
//在第一个脉冲下降之前DI 必须是高电平,表示启始信号 SCK=1;NOP; NOP;
SCK=0;NOP; NOP;
SCK=1;
DI=channel&0x1;NOP;NOP;
//在第二和第三个脉冲下降之前DI 输入两位表示通道
SCK=0;NOP; NOP;
SCK=1;
DI=(channel>>1)&0x1;NOP; NOP;
SCK=0; //写命令完成,DI失去输入作用 DI=1;NOP;NOP;
dat2=0;
for(i=0;i<8;i++) //读出8字节数据 {
dat2|=DO;
SCK=1;NOP; NOP;
SCK=0;NOP; NOP;
dat2<<=1;
if(i==7)
dat2|=DO;
}
for(i=0;i<8;i++)
{
j=0;
j=j|DO;
SCK=1;NOP; NOP;
SCK=0;NOP; NOP;
j=j<<7;
ndat=ndat|j;
if(i<7)ndat>>=1;
}
AD_CS=1;
SCK=0;
DO=1;
dat2<<=8;
dat2|=ndat;
return(dat2); //返回数据}
void DelayMS(uint ms) //延时程序,相应数值为相应毫秒数{
uchar i;
while(ms--)
{
for(i=0;i<120;i++); //1mS延时
}
}
uchar Read_LCD_State() //检测LCD是否“忙”{
uchar state;
RS=0;RW=1;E=1;DelayMS(1);
state=P0; //返回P0的值 E= 0;DelayMS(1);
return state; //返回状态}
void LCD_Busy_Wait()
{
while((Read_LCD_State()&0x80)==0x80);
DelayMS(5);
}
void LCD_Write_Command(uchar cmd) //写命令函数{
LCD_Busy_Wait();
RS = 0;
RW = 0;
E = 0;
_nop_();
_nop_();
P0 = cmd; //将CMD值写入LCD产生相应的控制
delay4us();
E = 1;
delay4us();
E = 0;
}
void Set_LCD_Pos(uchar pos)
{
LCD_Write_Command(pos | 0x80);
}
void LCD_Write_Data(uchar dat) //写数据函数{
LCD_Busy_Wait();
RS = 1;
RW = 0;
E = 0;
P0 = dat;
delay4us();
E = 1;
delay4us();
E = 0;
}
void LCD_Initialise() //LCD初始化函数{
LCD_Write_Command(0x38); DelayMS(1);
LCD_Write_Command(0x0c); DelayMS(1);
LCD_Write_Command(0x06); DelayMS(1);
LCD_Write_Command(0x01); DelayMS(1);
}
void Display_LCD_String(uchar p,uchar *s) //LCD显示函数{
uchar i;
Set_LCD_Pos(p);
for(i=0;i<16;i++)
{
LCD_Write_Data(s[i]); //调用写数据函数 DelayMS(1);
}
}
void write_sfm(uchar add,uchar num) //分秒函数{
LCD_Write_Command(0x80+0x40+add);
//第行数据指针位置调整
LCD_Write_Data(0x30+num);
}
void main()
{
uchar c;
uint bai,sh,ge,xiaoshu;
long d; //为得到小数部分,使用长整形数 LCD_Initialise();
DelayMS(10);
Display_LCD_String(0x00,Line1);
Display_LCD_String(0x46,Display_Buffer);
HIGH=0;
LOW=0;
while(1)
{
c=adc0832(0);
d=c;
d=d*10; //将数值扩大10倍得到小数 d=((d-100)*1000/2360)+150; //将电压值转换为压力值 bai=d/1000 ; //分离出百位 sh=d%1000/100; //分离出十位 ge=d%100/10; //分离出个位 xiaoshu=d%10 ; //分离出小数位
if(c>246) //判断过压函数
{ HIGH=1;LOW=0; //开启过压报警灯
DelayMS(1) ;
write_sfm(6,bai);
write_sfm(7,sh);
write_sfm(8,ge);
write_sfm(10,xiaoshu); //写数据
}
else if(c<10) //开启欠压报警灯 {
{ LOW=1; HIGH=0;
write_sfm(6,bai);
write_sfm(7,sh);
write_sfm(8,ge);
write_sfm(10,xiaoshu); //写数据
}
else
{
HIGH=0;LOW=0; //正常状态,显示压力值 write_sfm(6,bai);
write_sfm(7,sh);
write_sfm(8,ge);
write_sfm(10,xiaoshu);
}
}
} //程序完4.仿真及结果
如下图所示,是当压力值小于和大于115kPa时的显示与报警电路:
5.小结
在这炎炎夏日,为期5天的课程设计即将结束,在这5天里,我们学习了有关压力计的基础知识,同时,跟深刻的认识学习了单片机、LCD显示屏、模数转换电路的使用。
在实践中,我们有幸的综合了各种技能的使用,让我们对未来从事工作跟有信心。
虽然在此次的设计中,我们只是使用了软件来仿真压力计的设计,但我们同时也希望能够有真正自己动手的机会,从而来做出属于自己的东西,那样应该更加有价值。
压力计的设计是一项综合性的课程设计课题,其中具体体现了大学生动手的精神,在课程设计中,需要我们使用已经学过的基础知识,比如最小系统的设计,单片机的编程以及显示器的个性化使用。
同时更深化学习了模数转换以及与客观实践相联系的压力计。
将传感器与单片机系统的有机结合,有效的将学习与设计结合,更贴近客观实际。
总的来说,时间不长,收获颇丰。
希望在以后的学习生涯中,能接触到更多的像压力计的设计这样的动手课题,从而丰富我们的学习生涯。
6.参考文献
1.《单片机的C语言程序设计及应用》姜志海主编电子工业出版社
2.
3. 《传感器设计基础》张春主编国防工业出版社
4.《传感器原理与检测技术》钱显毅主编机械工业出版社
5.《误差理论与数据处理》费业泰主编机械工业出版社。