基于51單片機(jī)的數(shù)據(jù)信號(hào)采集實(shí)驗(yàn)報(bào)告_第1頁(yè)
基于51單片機(jī)的數(shù)據(jù)信號(hào)采集實(shí)驗(yàn)報(bào)告_第2頁(yè)
基于51單片機(jī)的數(shù)據(jù)信號(hào)采集實(shí)驗(yàn)報(bào)告_第3頁(yè)
基于51單片機(jī)的數(shù)據(jù)信號(hào)采集實(shí)驗(yàn)報(bào)告_第4頁(yè)
基于51單片機(jī)的數(shù)據(jù)信號(hào)采集實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論