壓力測量儀的仿真與設計
設計一個數字氣壓測量儀,要求測量范圍為15Kpa~115Kpa,分辨力為0.1Kpa,誤差不超過1.5%。
Protues仿真軟件提供了MPX4115和MPX4250,因此可以采用這兩種芯片進行設計。壓力傳感器對于系統至關重要,需要綜合實際的需求和各類壓力傳感器的性能參數加以選擇。一般要選用有溫度補償作用的壓力傳感器,因為溫度補償特性可以克服半導體壓力傳感器件存在的溫度漂移問題。 本設計要實現的數字氣壓計顯示的是絕對氣壓值,同時為了簡化電路,提高穩定性和抗干擾能力,要求使用具有溫度補償能力的壓力傳感器。經過綜合考慮,選擇使用MPX4115,可以產生高精度模擬輸出電壓。
1、設計整體思想:
基于MPX4115的數字氣壓計包括軟硬件的設計與調試。軟件部分通過對C語言的學習和對單片機知識的了解,根據系統的特點編寫出單片機程序。硬件部分分為四大塊,包括非電信號數據的采集、轉換、處理以及顯示:。通過對設計的了解,選擇適合的器件,畫出原理圖。
- 系統總體設計框圖:
0.png (8.33 KB, 下載次數: 39)
下載附件
2018-12-21 01:37 上傳
(1)數據采集模塊: 數據采集模塊由壓力傳感器MPX4115構成。其中1腳是輸出信號端,輸出的是與氣壓值相對應的模擬電壓信號。數據采集模塊的原理如圖:
 MPX4115系列壓電電阻傳感器是一個硅壓力傳感器。這個傳感器結合了高級的微電機技術,薄膜鍍金屬。還能為高水準模擬輸出信號提供一個均衡壓力。在0℃-85℃的溫度下誤差不超過1.5%,溫度補償是-40℃-125℃。
- 單片機控制模塊

AT89C52 P為40 腳雙列直插封裝的8 位通用微處理器,采用工業標準的C51內核,在內部功能及管腳排布上與通用的8xc52 相同,其主要用于會聚調整時的功能控制。功能包括對會聚主IC 內部寄存器、數據RAM及外部接口等功能部件的初始化,會聚調整控制,會聚測試圖控制,紅外遙控信號IR的接收解碼及與主板CPU通信等。主要管腳有:XTAL1(19 腳)和XTAL2(18 腳)為振蕩器輸入輸出端口,外接12MHz 晶振。RST/Vpd(9 腳)為復位輸入端口,外接電阻電容組成的復位電路。VCC(40 腳)和VSS(20 腳)為供電端口,分別接+5V電源的正負端。P0~P3 為可編程通用I/O 腳,其功能用途由軟件定義,在本設計中,P0 端口(32~39 腳)被定義為N1 功能控制端口,分別與N1的相應功能管腳相連接,13 腳定義為IR輸入端,10 腳和11腳定義為I2C總線控制端口,分別連接N1的SDAS(18腳)和SCLS(19腳)端口,12 腳、27 腳及28 腳定義為握手信號功能端口,連接主板CPU 的相應功能端,用于當前制式的檢測及會聚調整狀態進入的控制功能。
 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端必須是高電平,表示啟始信號。 作為單通道模擬信號輸入時ADC0832的輸入電壓是0~5V且8位分辨率時的電壓精度為19.53mV。如果作為由IN+與IN-輸入的輸入時,可是將電壓值設定在某一個較大范圍之內,從而提高轉換的寬度。但值得注意的是,在進行IN+與IN-的輸入時,如果IN-的電壓大于IN+的電壓則轉換后的數據結果始終為00H。
首先要了解的是此數碼管為共陽極數碼管,即三極管Q1、Q2、Q3、Q4導通時數碼管才能點亮,亦即相應的單片機P2.3、P2.、P2.、P2.0為低電平。  采用LED動態掃描顯示原理如下: - P23、P22、P21、P20輸出高電平,關閉所有數碼管;
- 顯示個位——把要顯示的數據送到P0.0-P0.7,P23送低電平,延時5毫秒(時間不能太長,否則數碼管會閃爍),P23送高電平;
- 顯示十位——把要顯示的數據送到P0.0-P0.7,P22送低電平,延時5毫秒(時間不能太長,否則數碼管會閃爍),P22送高電平;
- 顯示百位——把要顯示的數據送到P0.0-P0.7,P21送低電平,延時5毫秒(時間不能太長,否則數碼管會閃爍),P21送高電平;
- 顯示千位——把要顯示的數據送到P0.0-P0.7,P20送低電平,延時5毫秒(時間不能太長,否則數碼管會閃爍),P20送高電平。
- 以此順序循環,把它做成子程序,在主循環中調用。
 MCS-51系列單片機的時鐘信號通常用兩種電路形式得到,即內部震蕩方式和外部振蕩方式,本設計才用內部震蕩方式。在引腳XTAL1和XTAL2外接晶體振蕩器,就構成了內部振蕩電路,如上圖所示,圖中C1 、C2起穩定震蕩頻率、快速起振的作用,電容值一般在5PF到30PF。晶體常選用6MHz 、12MHz 或24MHz采用串口時常使用11.0592MHz。內部震蕩方式所得到的時鐘信號比較穩定。
復位電路
復位操作通常有兩種形式:上電復位和按鈕復位,本設計采用的是上電復位,如右圖所示。其工作原理為:上電瞬間RC電路充電,RST引腳端出現正脈沖,只要RST端保持在兩個時鐘周期以上的高電平,就能使單片機有效復位。
仿真結果如下,順利完成實驗:
1、選擇芯片和傳感器時,夠用易用就可以,綜合考慮選擇性價比最好的。 2、在進行電路實際制作之前,應該用仿真軟件進行仿真,可以使開發進程加快。 3、在實際制作電路時,需要注意電源端和地端要檢測過不導通后才能通電檢測,防止燒壞芯片。
單片機源程序如下:
- #include<reg52.h>
- #include "intrins.h"
- #define uint unsigned int
- #define uchar unsigned char
- //ADC0832的引腳
- sbit ADCS =P3^1; //ADC0832 chip seclect
- sbit ADDI =P3^2; //ADC0832 k in
- sbit ADDO =P3^2; //ADC0832 k out
- sbit ADCLK =P3^0; //ADC0832 clock signal080307208
- unsigned char dispbitcode[8]={
- 0xf1,0xf2,0xf4,0xf8,0xef,0xdf,0xbf,0x7f
- }; //位掃描
- unsigned char dispcode[11]={
- 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff
- }; //共陽數碼管字段碼
- unsigned char dispbuf[4];
- uint temp;
- uchar getdata; //獲取ADC轉換回來的值
- void delay_1ms(void) //12mhz delay 1.01ms
- {
- unsigned char x,y;
- x=3;
- while(x--)
- {
- y=40;
- while(y--);
- }
- }
- void display(void) //數碼管顯示函數
- {
- char k;
- for(k=0;k<4;k++)
- {
- P2 = dispbitcode[k];
- P0 = dispcode[dispbuf[k]];
- if(k==1) //加上數碼管的dp小數點
- P0&=0x7f;
- delay_1ms();
- }
- }
- /*讀ADC0832函數*/
- //采集并返回
- unsigned int Adc0832(unsigned char channel) //AD轉換,返回結果
- {
- uchar i=0;
- uchar j;
- uint dat=0;
- uchar ndat=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;
- ADDO=1;//收數據
- 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); //return ad k
- }
- /*主程序*/
- void main(void)
- {
- while(1)
- { unsigned int temp;
- float press;
- getdata=Adc0832(0);
- if(14<getdata<243) //當壓力值介于15kpa到115kpa之間時,遵循線性變換
- {
- int vary=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; //取壓力值個位
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png (47.62 KB, 下載次數: 57)
下載附件
2018-12-21 01:36 上傳
所有資料51hei提供下載:
壓力測量儀的仿真與設計.rar
(672.72 KB, 下載次數: 201)
2018-12-20 20:23 上傳
點擊文件名下載附件
源程序仿真報告 下載積分: 黑幣 -5
|