版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
摘要
本文完成了基于51系列單片機(jī)的數(shù)據(jù)采集系統(tǒng)的硬件研發(fā)及相應(yīng)的軟件設(shè)計(jì),對(duì)系統(tǒng)的主要性能指標(biāo)進(jìn)行了測(cè)試研究。
系統(tǒng)的硬件研究?jī)?nèi)容主要包括:?jiǎn)纹瑱C(jī)型號(hào)、通訊方式、系統(tǒng)電源的選擇,設(shè)計(jì)系統(tǒng)原理圖、PCB板圖,制作PCB板。選擇C8051F350單片機(jī)作為系統(tǒng)控制核心,芯片自帶A/D轉(zhuǎn)換模塊,有增益放大功能。通訊方式選擇RS-485通訊,可以有較遠(yuǎn)的傳輸距離,又能保證高的通訊速率。系統(tǒng)電源選用5V直流電源,局部電路采用穩(wěn)壓芯片轉(zhuǎn)換供電。系統(tǒng)原理圖和PCB板圖的設(shè)計(jì)是在AltiumDesigner中完成。原理圖設(shè)計(jì)時(shí)要保證電源信號(hào)的穩(wěn)定性,消弱外界信號(hào)波動(dòng)的影響;PCB板圖設(shè)計(jì)時(shí)要保證元器件的布局及布線的合理,降低各元器件及電路之間的相互干擾。軟件的設(shè)計(jì)內(nèi)容主要包括:編譯器的選擇、流程圖設(shè)計(jì)及相關(guān)程序的開發(fā)。
主要研究了數(shù)據(jù)采集系統(tǒng)的A/D轉(zhuǎn)換速率和A/D轉(zhuǎn)換精度。首先測(cè)試分析系統(tǒng)的A/D轉(zhuǎn)換速率,確定最高轉(zhuǎn)換速率值,討論實(shí)際轉(zhuǎn)換速率與理論值之間的關(guān)系。再者研究探討A/D轉(zhuǎn)換的精度,由于A/D轉(zhuǎn)換精度與轉(zhuǎn)換速率之間存在緊密的聯(lián)系,第一步主要研究不同速率下的實(shí)際轉(zhuǎn)換精度;由于隨機(jī)誤差對(duì)系統(tǒng)測(cè)試精度的影響,第二步主要研究在求均值的方式下系統(tǒng)A/D轉(zhuǎn)換精度;由于系統(tǒng)誤差對(duì)A/D轉(zhuǎn)換精度的影響,第三步主要研究誤差補(bǔ)償后A/D轉(zhuǎn)換精度。
關(guān)鍵詞:數(shù)據(jù)采集;C8051F350;通訊方式;A/D精度
5.2A/D轉(zhuǎn)換精度的測(cè)試研究
本實(shí)驗(yàn)系統(tǒng)對(duì)精度的測(cè)試研究需要有穩(wěn)定的的電壓信號(hào)源,由于直接使用電池產(chǎn)生的信號(hào)穩(wěn)定性不好,波動(dòng)較大,所以使用穩(wěn)壓芯片產(chǎn)生穩(wěn)定的直流電壓信號(hào)輸入到模擬信號(hào)采集端。采用5V直流電源給系統(tǒng)供電。數(shù)據(jù)采集模塊中核心處理器C8051F350芯片的內(nèi)置AD最高允許輸入的電壓值為2.5V左右。為了安全起見,實(shí)驗(yàn)時(shí)最高輸入電壓信號(hào)限定在2V左右。
連接好的實(shí)驗(yàn)系統(tǒng)如圖5.3所示,實(shí)驗(yàn)時(shí)具體操作步驟如下:先將程序下載器、接口轉(zhuǎn)換器(USB轉(zhuǎn)RS-485)、5V直流電源模塊、穩(wěn)壓模擬信號(hào)輸入接口等連接完成。然后將測(cè)試程序燒入單片機(jī),斷開下載器,用KEITHLEY公司的Model2000Multimeter(精度為0.010mV)測(cè)量參考基準(zhǔn)電壓值,隨后測(cè)量模擬信號(hào)通道引腳的電壓值,通過(guò)串口監(jiān)控器記錄數(shù)據(jù)。
圖5.3精度測(cè)試時(shí)系統(tǒng)連接圖
由于C8051F350芯片內(nèi)置AD為24位精度,因此模數(shù)轉(zhuǎn)換的公式為:
(5.2)
式中D——模數(shù)轉(zhuǎn)換得到的數(shù)字量
UA——模擬通道輸入電壓
N——AD轉(zhuǎn)換器位數(shù),本系統(tǒng)中N=12
UG——AD轉(zhuǎn)換參考地,由于是單端輸入,所以取零
UK——參考基準(zhǔn)電壓值
根據(jù)式(5.2)可知,每一個(gè)電壓模擬信號(hào)都有其對(duì)應(yīng)的數(shù)字量。實(shí)驗(yàn)中,輸入穩(wěn)定的直流電壓信號(hào),讀取AD轉(zhuǎn)換后的數(shù)字量,通過(guò)實(shí)際采集數(shù)字量與理論數(shù)字量的比較來(lái)考核AD轉(zhuǎn)換的精度。
由干電池供電,利用穩(wěn)壓芯片和分壓電路,分別產(chǎn)生接近0.5V、2.0V的兩種直流電壓信號(hào),輸入到數(shù)據(jù)采集系統(tǒng)模塊輸入端口進(jìn)行AD轉(zhuǎn)換實(shí)驗(yàn)。由式(5.2)計(jì)算得到兩種電壓對(duì)應(yīng)的理論數(shù)字量,對(duì)比得到每種情況下的A/D精度。
對(duì)于每一種電壓值,做三次實(shí)驗(yàn),每次實(shí)驗(yàn)采集500個(gè)數(shù)據(jù)。在每種電壓條件下隨機(jī)抽取某一次實(shí)驗(yàn)采集的500個(gè)數(shù)據(jù),按照與理論數(shù)字量之間的偏差進(jìn)行量化統(tǒng)計(jì),觀察分析系統(tǒng)達(dá)到的精度。
5.2.1使用內(nèi)部參考基準(zhǔn)電壓時(shí)A/D精度測(cè)試
因?yàn)檠兄频臄?shù)據(jù)采集系統(tǒng)的A/D轉(zhuǎn)換精度與A/D轉(zhuǎn)換速率之間存在緊密的關(guān)系,所以分別測(cè)試速率為100ksps、50ksps、10ksps、5ksps、1ksps下的A/D轉(zhuǎn)換精度。
1)A/D轉(zhuǎn)換速率為100ksps
當(dāng)設(shè)定轉(zhuǎn)換速率為100ksps時(shí),對(duì)三種電壓模擬信號(hào)分別進(jìn)行測(cè)試,對(duì)于每一種電壓值,做三次實(shí)驗(yàn),每次實(shí)驗(yàn)采集500個(gè)數(shù)據(jù)。在每種電壓條件下隨機(jī)抽取某一次實(shí)驗(yàn)測(cè)試采集的500個(gè)數(shù)據(jù),按照與理論數(shù)字量之間的偏差進(jìn)行量化統(tǒng)計(jì),統(tǒng)計(jì)結(jié)果如表5.2所示。
從表5.2中可以看出,數(shù)據(jù)采集過(guò)程中,對(duì)于某一個(gè)隨機(jī)電壓信號(hào)測(cè)量值,該C8051F350單片機(jī)內(nèi)置的24位AD能保證的實(shí)際轉(zhuǎn)換精度僅僅是在6位左右,與標(biāo)稱的24位分辨率相差甚遠(yuǎn),實(shí)際工程測(cè)試中這樣的進(jìn)度也很難滿足要求。因此,需要用編程方法,從軟件上進(jìn)行誤差的校正[21],改善系統(tǒng)性能。
//-----------------------------------------------------------------------------
//F41x_ADC0_ExternalInput.c
//-----------------------------------------------------------------------------
//Copyright2006SiliconLaboratories,Inc.
//
//
//ProgramDescription:
//--------------------
//
//Thisexamplecodetakesandaverages2048analogmeasurementsfrominput
//P1.1usingADC0,thenprintstheresultstoaterminalwindowviatheUART.
//
//Thesystemisclockedbytheinternal24.5MHzoscillator.Timer2triggers
//aconversiononADC0oneachoverflow.Thecompletionofthisconversion
//inturntriggersaninterruptserviceroutine(ISR).TheISRaverages
//2048measurements,thenprintsthevaluetotheterminalviaprintfbefore
//startinganotheraveragecycle.
//
//TheanalogmultiplexerselectsP1.1asthepositiveADC0input.This
//portisconfiguredasananaloginputintheportinitializationroutine.
//ThenegativeADC0inputisconnectedviamuxtoground,whichprovides
//forasingle-endedADCinput.
//
//A100kohmpotentiometermaybeconnectedasavoltagedividerbetween
//VREFandAGNDontheterminalstripasshownbelow:
//
//---------
//|
//o|VREF----|
//o|GND---|<-|
//o|P1.1||
//o|||
//o|--------
//o|
//|
//----------
//C8051F410-TB
//
//Terminaloutputisdoneviaprintf,whichdirectsthecharactersto
//UART0.AUARTinitializationroutineisthereforenecessary.
//
//ADCSettlingTimeRequirements,SamplingRate:
//----------------------------------------------
//
//Thetotalsampletimeperinputiscomprisedofaninputsettingtime
//(Tsettle),followedbyaconversiontime(Tconvert):
//
//Tsample=Tsettle+Tconvert
//
//|--------Settling-------|==Conversion==|----Settling---...
//Timer2overflow^
//ADC0ISR^
//
//TheADCinputvoltagemustbeallowedadequatetimetosettlebeforethe
//conversionismade.Thissettlingdependsontheexternalsource
//impedance,internalmuximpedance,andinternalcapacitance.
//Settlingtimeisgivenby:
//
//|2^n|
//Tsettle=ln|---|*Rtotal*Csample
//|SA|
//
//Inthisapplication,assumea100kohmpotentiometerasthevoltagedivider.
//Theexpressionevaluatesto:
//
//|2^10|
//Tsettle=ln|----|*105e3*5e-12=4.4uS
//|0.25|
//
//Inaddition,onemustallowatleast1.5uSafterchanginganalogmux
//inputsorPGAsettings.Thesettlingtimeinthisexample,then,is
//dictatedbythelargeexternalsourceresistance.
//
//Theconversionis10periodsoftheSARclock<SAR_CLK>.At3MHz,
//thistimeis10*400nS=3.3uS.
//
//
//Tsample,minimum=Tsettle+Tconvert
//=4.4uS+3.3uS
//=7.7uS
//
//Timer2issettochangethemuxinputandstartaconversion
//every100uS,whichisfarlongerthantheminimumrequired.
//
//F330Resources:
//---------------
//Timer1:clocksUART
//Timer2:overflowinitiatesADCconversion
//
//
//HowToTest:
//------------
//1)Downloadcodetoa'F410deviceonaC8051F410-TBdevelopmentboard
//2)ConnectserialcablefromthetransceivertoaPC
//3)OnthePC,openHyperTerminal(oranyotherterminalprogram)andconnect
//totheCOMportat<BAUDRATE>and8-N-1
//4)Connectavariablevoltagesource(between0andVref)
//toP1.1,orapotentiometervoltagedividerasshownabove.
//5)HyperTerminalwillprintthevoltagemeasuredbythedeviceif
//everythingisworkingproperly
//
//FID:41X000030
//Target:C8051F410
//Toolchain:KeilC517.50/KeilEVALC51
//CommandLine:None
//
//
//-----------------------------------------------------------------------------
//Includes
//-----------------------------------------------------------------------------
#include<c8051f410.h>//SFRdeclarations
#include<stdio.h>
#include<math.h>
//-----------------------------------------------------------------------------
//16-bitSFRDefinitionsfor'F41x
//-----------------------------------------------------------------------------
sfr16TMR2RL=0xca;//Timer2reloadvalue
sfr16TMR2=0xcc;//Timer2counter
sfr16ADC0=0xbd;//ADC0result
sbitP1_3=P1^3;//定義P1.3引腳
sbitP1_5=P1^5;//定義P1.5引腳
//-----------------------------------------------------------------------------
//GlobalCONSTANTS
//-----------------------------------------------------------------------------
#defineSYSCLK24500000//SYSCLKfrequencyinHz
#defineBAUDRATE115200//BaudrateofUARTinbps
//-----------------------------------------------------------------------------
//FunctionPROTOTYPES
//-----------------------------------------------------------------------------
voidSYSCLK_Init(void);
voidPORT_Init(void);
voidTimer2_Init(void);
voidADC0_Init(void);
voidUART0_Init(void);
voidRs232_Send(unsignedintresult);
//-----------------------------------------------------------------------------
//MAINRoutine
//-----------------------------------------------------------------------------
voidmain(void)
{
PCA0MD&=~0x40;//WDTE=0(clearwatchdogtimer
//enable)
SYSCLK_Init();//Initializesystemclockto
//24.5MHz
PORT_Init();//InitializecrossbarandGPIO
Timer2_Init();//InitTimer2togenerate
//overflowstotriggerADC
UART0_Init();//InitializeUART0forprintf's
ADC0_Init();//InitializeADC0
EA=1; //enableglobalinterrupts
while(1)
{//spinforever
}
}
//-----------------------------------------------------------------------------
//InitializationSubroutines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//SYSCLK_Init
//-----------------------------------------------------------------------------
//
//ReturnValue:None
//Parameters:None
//
//Thisroutineinitializesthesystemclocktousetheinternal24.5MHz
//oscillatorasitsclocksource.Alsoenablesmissingclockdetectorreset.
//
//-----------------------------------------------------------------------------
voidSYSCLK_Init(void)
{
OSCICN=0x87;//configureinternaloscillatorfor
//24.5MHz
RSTSRC=0x04;//enablemissingclockdetector
}
//-----------------------------------------------------------------------------input
//PORT_Init
//-----------------------------------------------------------------------------
//
//ReturnValue:None
//Parameters:None
//
//ConfiguretheCrossbarandGPIOports.
//P0.4-UARTTX(push-pull))
//P0.5-UARTRX
//P1.1-ADC0analog
//P1.3-LED(push-pull
//
//-----------------------------------------------------------------------------
voidPORT_Init(void)
{
XBR0=0x01;//EnableUART0
XBR1=0x40;//Enablecrossbarandweakpull-ups
P0MDOUT|=0x10;//SetTXpintopush-pull
P1MDIN&=0xFE; //setP1.7asananaloginput
P1SKIP|=0x01;//skipP1.7pin
//P1MDIN&=0xEB;//setP1.2asinputP1.2為C51內(nèi)部AD基準(zhǔn)電壓外接參考接入引腳
//P1SKIP|=0x04;//skipP1.2pin
//P1MDOUT|=0x28;//1.31.5topush-pull
//P1_3=0;//選擇傳感器量程
//P1_5=1;//傳感器休眠控制引腳0狀態(tài)為休眠
}
//-----------------------------------------------------------------------------
//Timer2_Init
//-----------------------------------------------------------------------------
//
//ReturnValue:None
//Parameters:None
//
//ConfigureTimer2to16-bitauto-reloadandgenerateaninterruptat100uS
//intervals.Timer2overflowautomaticallytriggersADC0conversion.
//
//-----------------------------------------------------------------------------
voidTimer2_Init(void)
{
TMR2CN=0x00;//StopTimer2;ClearTF2;
//useKaSYSCLstimebase,16-bit
//auto-reload
CKCON=0x30;//selectSYSCLKfortimer2source
TMR2RL=-(SYSCLK/10000); //initreloadvaluefor20uS(采樣頻率為50k)
TMR2=0xffff;//settoreloadimmediately
TR2=1;//startTimer2
}
//-----------------------------------------------------------------------------
//ADC0_Init
//-----------------------------------------------------------------------------
//
//ReturnValue:None
//Parameters:None
//
//ConfiguresADC0tomakesingle-endedanalogmeasurementsonpinP1.1
//
//-----------------------------------------------------------------------------
voidADC0_Init(void)
{
ADC0CN=0x03;//ADC0disabled,normaltracking,
//conversiontriggeredonTMR2overflow
REF0CN=0x0A;//Enableon-chipVREF=2.2vandbuffer
ADC0MX=0x08; //SetP1.0aspositiveinput
ADC0CF=(SYSCLK/3000000-1)<<3;//setSARclockto3MHz
//rickadd
//ADC0CF=(int)(floor(SYSCLK/4900000)-1)<<3;
//ADC0TK=0xFF;
ADC0CF|=0x00;//right-justifyresults
EIE1|=0x08;//enableADC0conversioncompleteint.
AD0EN=1;//enableADC0
}
//-----------------------------------------------------------------------------
//UART0_Init
//-----------------------------------------------------------------------------
//
//ReturnValue:None
//Parameters:None
//
//ConfiguretheUART0usingTimer1,for<BAUDRATE>and8-N-1.
//
//-----------------------------------------------------------------------------
voidUART0_Init(void)
{
SCON0=0x10;//SCON0:8-bitvariablebitrate
//levelofSTOPbitisignored
//RXenabled
//ninthbitsarezeros
//clearRI0andTI0bits
if(SYSCLK/BAUDRATE/2/256<1){
TH1=-(SYSCLK/BAUDRATE/2);
CKCON|=0x08;//T1M=1;SCA1:0=xx
}elseif(SYSCLK/BAUDRATE/2/256<4){
TH1=-(SYSCLK/BAUDRATE/2/4);
CKCON&=~0x0B;//T1M=0;SCA1:0=01
CKCON|=0x01;
}elseif(SYSCLK/BAUDRATE/2/256<12){
TH1=-(SYSCLK/BAUDRATE/2/12);
CKCON&=~0x0B;//T1M=0;SCA1:0=00
}elseif(SYSCLK/BAUDRATE/2/256<48){
TH1=-(SYSCLK/BAUDRATE/2/48);
CKCON&=~0x0B;//T1M=0;SCA1:0=10
CKCON|=0x02;
}else{
while(1);//Error.Unsupportedbaudrate
}
TL1=TH1;//initTimer1
TMOD&=~0xf0;//TMOD:timer1in8-bitautoreload
TMOD|=0x20;
TR1=1;//STARTTimer1
TI0=1;//IndicateTX0ready
}
//發(fā)送程序-fromrick
//將數(shù)據(jù)通道232通訊或者485傳輸?shù)缴衔粰C(jī)
/*voidRs232_Send(unsignedintresult)
{
SBUF0=result;
while(TI0==0)
{};
TI0=0;
}
*/
//-----------------------------------------------------------------------------
//InterruptServiceRoutines
//------------------------------------------
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年商標(biāo)保護(hù)義務(wù)協(xié)議
- 2025年健身房特選設(shè)備訓(xùn)練服務(wù)協(xié)議
- 2025年基層金融質(zhì)押協(xié)議
- 2025年連帶責(zé)任保證合同(借款)
- 中小企業(yè)2024年期限勞動(dòng)合同3篇
- 正規(guī)2025年度藝人經(jīng)紀(jì)合同3篇
- 二零二五年度足療技師外出服務(wù)安全協(xié)議范本
- 2025年度度假酒店委托運(yùn)營(yíng)管理服務(wù)合同
- 二零二五年度汽車牌照租賃與車輛抵押貸款服務(wù)協(xié)議
- 2025年度門窗行業(yè)產(chǎn)品召回與質(zhì)量追溯合同電子版
- 江蘇省南京市協(xié)同體七校2024-2025學(xué)年高三上學(xué)期期中聯(lián)合考試英語(yǔ)試題答案
- 青島版二年級(jí)下冊(cè)三位數(shù)加減三位數(shù)豎式計(jì)算題200道及答案
- GB/T 12723-2024單位產(chǎn)品能源消耗限額編制通則
- GB/T 16288-2024塑料制品的標(biāo)志
- 麻風(fēng)病防治知識(shí)課件
- 干部職級(jí)晉升積分制管理辦法
- TSG ZF003-2011《爆破片裝置安全技術(shù)監(jiān)察規(guī)程》
- 2024年代理記賬工作總結(jié)6篇
- 電氣工程預(yù)算實(shí)例:清單與計(jì)價(jià)樣本
- VOC廢氣治理工程中電化學(xué)氧化技術(shù)的研究與應(yīng)用
- 煤礦機(jī)電設(shè)備培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論