linux實(shí)驗(yàn)報(bào)告2.4和2.5(AD與DA接口實(shí)驗(yàn))_第1頁
linux實(shí)驗(yàn)報(bào)告2.4和2.5(AD與DA接口實(shí)驗(yàn))_第2頁
linux實(shí)驗(yàn)報(bào)告2.4和2.5(AD與DA接口實(shí)驗(yàn))_第3頁
linux實(shí)驗(yàn)報(bào)告2.4和2.5(AD與DA接口實(shí)驗(yàn))_第4頁
linux實(shí)驗(yàn)報(bào)告2.4和2.5(AD與DA接口實(shí)驗(yàn))_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

嘉應(yīng)學(xué)院電子信息工程學(xué)院學(xué)生實(shí)驗(yàn)報(bào)告班級:082班座號:姓名:成績:課程名稱:嵌入式Linux應(yīng)用程序開發(fā)標(biāo)準(zhǔn)教程實(shí)驗(yàn)項(xiàng)目:A/D接口實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康牧私庠趌inux環(huán)境下對S3C2410芯片的8通道10位A/D的操作與控制。二、實(shí)驗(yàn)內(nèi)容學(xué)習(xí)A/D接口原理,了解實(shí)現(xiàn)A/D系統(tǒng)對于系統(tǒng)的軟件和硬件要求。閱讀ARM芯片文檔,掌握ARM的A/D相關(guān)寄存器的功能,熟悉ARM系統(tǒng)硬件的A/D相關(guān)接口。利用外部模擬信號編程實(shí)現(xiàn)ARM循環(huán)采集全部前4路通道,并且在超級終端上顯示。三、預(yù)備知識1、有C語言基礎(chǔ)。2、掌握在Linux下常用編輯器的使用。3、掌握Makefile的編寫和使用。4、掌握Linux下的程序編譯與交叉編譯過程。四、實(shí)驗(yàn)設(shè)備及工具硬件:UP-TECHS2410/P270DVP嵌入式實(shí)驗(yàn)平臺、PC機(jī)Pentium500以上,硬盤10G以上。軟件:PC機(jī)操作系統(tǒng)REDHATLINUX9.0+MINICOM+ARM-LINUX開發(fā)環(huán)境五、實(shí)驗(yàn)原理A/D轉(zhuǎn)換器A/D轉(zhuǎn)換器是模擬信號源和CPU之間聯(lián)系的接口,它的任務(wù)是將連續(xù)變化的模擬信號轉(zhuǎn)換為數(shù)字信號,以便計(jì)算機(jī)和數(shù)字系統(tǒng)進(jìn)行處理、存儲、控制和顯示。在工業(yè)控制和數(shù)據(jù)采集及許多其他領(lǐng)域中,A/D轉(zhuǎn)換是不可缺少的。A/D轉(zhuǎn)換器有以下類型:逐位比較型、積分型、計(jì)數(shù)型、并行比較型、電壓-頻率型,主要應(yīng)根據(jù)使用場合的具體要求,按照轉(zhuǎn)換速度、精度、價(jià)格、功能以及接口條件等因素來決定選擇何種類型。常用的有以下兩種:1、雙積分型的A/D轉(zhuǎn)換器雙積分式也稱二重積分式,其實(shí)質(zhì)是測量和比較兩個(gè)積分的時(shí)間,一個(gè)是對模擬輸入電壓積分的時(shí)間T0,此時(shí)間往往是固定的;另一個(gè)是以充電后的電壓為初值,對參考電源Vref反向積分,積分電容被放電至零所需的時(shí)間T1。模擬輸入電壓Vi與參考電壓VRef之比,等于上述兩個(gè)時(shí)間之比。由于VRef、T0固定,而放電時(shí)間T1可以測出,因而可計(jì)算出模擬輸入電壓的大小(VRef與Vi符號相反)。由于T0、VRef為已知的固定常數(shù),因此反向積分時(shí)間T1與輸入模擬電壓Vi在T0時(shí)間內(nèi)的平均值成正比。輸入電壓Vi愈高,VA愈大,T1就愈長。在T1開始時(shí)刻,控制邏輯同時(shí)打開計(jì)數(shù)器的控制門開始計(jì)數(shù),直到積分器恢復(fù)到零電平時(shí),計(jì)數(shù)停止。則計(jì)數(shù)器所計(jì)出的數(shù)字即正比于輸入電壓Vi在T0時(shí)間內(nèi)的平均值,于是完成了一次A/D轉(zhuǎn)換。由于雙積分型A/D轉(zhuǎn)換是測量輸入電壓Vi在T0時(shí)間內(nèi)的平均值,所以對常態(tài)干擾(串摸干擾)有很強(qiáng)的抑制作用,尤其對正負(fù)波形對稱的干擾信號,抑制效果更好。雙積分型的A/D轉(zhuǎn)換器電路簡單,抗干擾能力強(qiáng),精度高,這是突出的優(yōu)點(diǎn)。但轉(zhuǎn)換速度比較慢,常用的A/D轉(zhuǎn)換芯片的轉(zhuǎn)換時(shí)間為毫秒級。例如12位的積分型A/D芯片ADCETl2BC,其轉(zhuǎn)換時(shí)間為lms。因此適用于模擬信號變化緩慢,采樣速率要求較低,而對精度要求較高,或現(xiàn)場干擾較嚴(yán)重的場合。例如在數(shù)字電壓表中常被采用。2、逐次逼近型的A/D轉(zhuǎn)換器逐次逼近型(也稱逐位比較式)的A/D轉(zhuǎn)換器,應(yīng)用比積分型更為廣泛,其原理框圖如圖2.4.1所示,主要由逐次逼近寄存器SAR、D/A轉(zhuǎn)換器、比較器以及時(shí)序和控制邏輯等部分組成。它的實(shí)質(zhì)是逐次把設(shè)定的SAR寄存器中的數(shù)字量經(jīng)D/A轉(zhuǎn)換后得到電壓Vc與待轉(zhuǎn)換模擬電壓V。進(jìn)行比較。比較時(shí),先從SAR的最高位開始,逐次確定各位的數(shù)碼應(yīng)是“1”還是“0”,其工作過程如下:轉(zhuǎn)換前,先將SAR寄存器各位清零。轉(zhuǎn)換開始時(shí),控制邏輯電路先設(shè)定SAR寄存器的最高位為“1”,其余位為“0”,此試探值經(jīng)D/A轉(zhuǎn)換成電壓Vc,然后將Vc與模擬輸入電壓Vx比較。如果Vx≥Vc,說明SAR最高位的“1”應(yīng)予保留;如果Vx<Vc,說明SAR該位應(yīng)予清零。然后再對SAR寄存器的次高位置“1”,依上述方法進(jìn)行D/A轉(zhuǎn)換和比較。如此重復(fù)上述過程,直至確定SAR寄存器的最低位為止。過程結(jié)束后,狀態(tài)線改變狀態(tài),表明已完成一次轉(zhuǎn)換。最后,逐次逼近寄存器SAR中的內(nèi)容就是與輸入模擬量V相對應(yīng)的二進(jìn)制數(shù)字量。顯然A/D轉(zhuǎn)換器的位數(shù)N決定于SAR的位數(shù)和D/A的位數(shù)。圖2.4.1(b)表示四位A/D轉(zhuǎn)換器的逐次逼近過程。轉(zhuǎn)換結(jié)果能否準(zhǔn)確逼近模擬信號,主要取決于SAR和D/A的位數(shù)。位數(shù)越多,越能準(zhǔn)確逼近模擬量,但轉(zhuǎn)換所需的時(shí)間也越長。逐次逼近式的A/D轉(zhuǎn)換器的主要特點(diǎn)是:轉(zhuǎn)換速度較快,在1—100/μs以內(nèi),分辨率可以達(dá)18位,特別適用于工業(yè)控制系統(tǒng)。轉(zhuǎn)換時(shí)間固定,不隨輸入信號的變化而變化。抗干擾能力相對積分型的差。例如,對模擬輸入信號采樣過程中,若在采樣時(shí)刻有一個(gè)干擾脈沖迭加在模擬信號上,則采樣時(shí),包括干擾信號在內(nèi),都被采樣和轉(zhuǎn)換為數(shù)字量,這就會造成較大的誤差,所以有必要采取適當(dāng)?shù)臑V波措施。逐次逼近式A/D轉(zhuǎn)換器A/D轉(zhuǎn)換器在擴(kuò)展板的連接A/D轉(zhuǎn)換器在擴(kuò)展板的接法如圖所示,前三路通過電位器接到3.3v電源上。A/D轉(zhuǎn)換器在擴(kuò)展板上的接法六、程序分析(關(guān)鍵代碼分析)ad驅(qū)動對用戶來說只是下面的一個(gè)文件結(jié)構(gòu)。在用戶程序里只需要用到open、read、write、release等內(nèi)核函數(shù)即可。本實(shí)驗(yàn)采用的是模塊方式加載,可以在實(shí)驗(yàn)箱的/mnt/yaffs/ad/中找到AD的驅(qū)動程序。staticstructfile_operationss3c2410_fops={owner:THIS_MODULE,open:s3c2410_adc_open,read:s3c2410_adc_read,write:s3c2410_adc_write,release:s3c2410_adc_release,};下面我們對驅(qū)動部分重要函數(shù)進(jìn)行說明。ad驅(qū)動在內(nèi)核里的代碼我們放到了本次實(shí)驗(yàn)的src文件下,s3c2410.h_chip.h里為arm2410頭文件s3c2410.h初始化ADC的部分。所有代碼也可以到內(nèi)核里面去閱讀。staticints3c2410_adc_open(structinode*inode,structfile*file){init_MUTEX(&adcdev.lock);init_waitqueue_head(&(adcdev.wait));adcdev.channel=0;adcdev.prescale=0xff;MOD_INC_USE_COUNT;DPRINTK("adcopened\n");return0;}//AD通道和比例因子初始化staticssize_ts3c2410_adc_write(structfile*file,constchar*buffer,size_tcount,loff_t*ppos){intdata;if(count!=sizeof(data)){//errorinputdatasizeDPRINTK("thesizeofinputdatamustbe%d\n",sizeof(data));return0;}copy_from_user(&data,buffer,count);adcdev.channel=ADC_WRITE_GETCH(data);adcdev.prescale=ADC_WRITE_GETPRE(data);DPRINTK("setadcchannel=%d,prescale=0x%x\n",adcdev.channel,adcdev.prescale);returncount;}//告訴內(nèi)核驅(qū)動讀哪一個(gè)通道的數(shù)據(jù)和設(shè)置比例因子#defineSTART_ADC_AIN(ch,prescale)\do{\ADCCON=PRESCALE_EN|PRSCVL(prescale)|ADC_INPUT((ch));\ADCCON|=ADC_START;\}while(0)//PRESCALE_EN左移14使位比例因子有效;PRSCVL左移6位設(shè)置比例因子;//ADC_INPUT左移3位選擇通道;//ADCCON|=ADC_START;ADCCON0為置1,準(zhǔn)備采集數(shù)據(jù)staticssize_ts3c2410_adc_read(structfile*filp,char*buffer,size_tcount,loff_t*ppos){intret=0;if(down_interruptible(&adcdev.lock))return-ERESTARTSYS;START_ADC_AIN(adcdev.channel,adcdev.prescale);interruptible_sleep_on(&adcdev.wait);ret=ADCDAT0;ret&=0x3ff;//把數(shù)據(jù)寄存器內(nèi)容放入變量retDPRINTK("AIN[%d]=0x%04x,%d\n",adcdev.channel,ret,ADCCON&0x80?1:0);copy_to_user(buffer,(char*)&ret,sizeof(ret));//把ret變量的內(nèi)容傳給用戶緩沖區(qū)up(&adcdev.lock);returnsizeof(ret);}//由內(nèi)核采集通道數(shù)據(jù)后把數(shù)據(jù)放回用戶區(qū)main.c的代碼如下:#include<stdio.h>#include<unistd.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/ioctl.h>#include<pthread.h>#include<fcntl.h>#include"s3c2410-adc.h"#defineADC_DEV"/dev/adc/0raw"staticintadc_fd=-1;staticintinit_ADdevice(void){if((adc_fd=open(ADC_DEV,O_RDWR))<0){printf("Erroropening%sadcdevice\n",ADC_DEV);return-1;}}staticintGetADresult(intchannel){intPRESCALE=0XFF;intdata=ADC_WRITE(channel,PRESCALE);write(adc_fd,&data,sizeof(data));read(adc_fd,&data,sizeof(data));returndata;}staticintstop=0;staticvoid*comMonitor(void*data){getchar();stop=1;returnNULL;}intmain(void){inti;floatd;pthread_tth_com;void*retval;//sets3c44b0ADregisterandstartADif(init_ADdevice()<0)return-1;/*Createthethreads*/pthread_create(&th_com,NULL,comMonitor,0);printf("\nPressEnterkeyexit!\n");while(stop==0){for(i=0;i<=2;i++){//采樣0~2路A/D值d=((float)GetADresult(i)*3.3)/1024.0;printf("a%d=%8.4f\t",i,d);}usleep(1);printf("\r");}/*Waituntilproducerandconsumerfinish.*/pthread_join(th_com,&retval);printf("\n");return0;}七、實(shí)驗(yàn)步驟1、閱讀理解源碼進(jìn)入/arm2410cl/exp/basic/04_ad目錄,使用vi編輯器或其他編輯器閱讀理解源代碼。2、編譯應(yīng)用程序運(yùn)行make產(chǎn)生ad可執(zhí)行文件[root@zxt/]#cd/arm2410cl/exp/basic/04_ad/[root@zxt04_ad]#makearmv4l-unknown-linux-gcc-c-omain.omain.carmv4l-unknown-linux-gcc-o../bin/admain.o-lpthreadarmv4l-unknown-linux-gcc-oadmain.o-lpthread[root@zxt04_ad]#lsadhardware.hmain.oMakefile.baks3c2410-adc.hbinmain.cMakefilereadme.txtsrc3、下載調(diào)試換到minicom終端窗口,使用NFSmount開發(fā)主機(jī)的/arm2410cl到/host目錄。[root@zxtroot]#minicom[/mnt/yaffs]mount-tnfs-onolock192.168.0.56:/arm2410cl/host[/mnt/yaffs]insmodad/s3c2410-adc.o[/mnt/yaffs]cd/host/exp/basic/04_ad/[/host/exp/basic/04_ad]./adPressEnterkeyexit!a0=0.0032a1=3.2968a2=3.2968我們可以通過調(diào)節(jié)開發(fā)板上的三個(gè)黃色的電位器,來查看a0、a1、a2的變化。實(shí)驗(yàn)項(xiàng)目:D/A接口實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康?、學(xué)習(xí)D/A轉(zhuǎn)換原理2、掌握MAX504D/A轉(zhuǎn)換芯片的使用方法3、掌握不帶有D/A的CPU擴(kuò)展D/A功能的主要方法4、了解D/A驅(qū)動程序加入內(nèi)核的方法二、實(shí)驗(yàn)內(nèi)容學(xué)習(xí)D/A接口原理,了解實(shí)現(xiàn)D/A系統(tǒng)對于系統(tǒng)的軟件和硬件要求。閱讀MAX504芯片文檔,掌握其使用方法。三、預(yù)備知識1、有C語言基礎(chǔ)2、掌握在Linux下常用編輯器的使用3、掌握Makefile的編寫和使用4、掌握Linux下的程序編譯與交叉編譯過程四、實(shí)驗(yàn)設(shè)備及工具硬件:UP-TECHS2410/P270DVP嵌入式實(shí)驗(yàn)平臺、PC機(jī)Pentium500以上,硬盤10G以上。軟件:PC機(jī)操作系統(tǒng)REDHATLINUX9.0+MINICOM+ARM-LINUX開發(fā)環(huán)境五、實(shí)驗(yàn)原理D/A轉(zhuǎn)換器D/A轉(zhuǎn)換器的內(nèi)部電路構(gòu)成無太大差異,一般按輸出是電流還是電壓、能否作乘法運(yùn)算等進(jìn)行分類。大多數(shù)D/A轉(zhuǎn)換器由電阻陣列和n個(gè)電流開關(guān)(或電壓開關(guān))構(gòu)成。按數(shù)字輸入值切換開關(guān),產(chǎn)生比例于輸入的電流(或電壓)。1、電壓輸出型(如TLC5620)電壓輸出型D/A轉(zhuǎn)換器雖有直接從電阻陣列輸出電壓的,但一般采用內(nèi)置輸出放大器以低阻抗輸出。直接輸出電壓的器件僅用于高阻抗負(fù)載,由于無輸出放大器部分的延遲,故常作為高速D/A轉(zhuǎn)換器使用。2、電流輸出型(如THS5661A)電流輸出型D/A轉(zhuǎn)換器很少直接利用電流輸出,大多外接電流—電壓轉(zhuǎn)換電路得到電壓輸出,后者有兩種方法:一是只在輸出引腳上接負(fù)載電阻而進(jìn)行電流—電壓轉(zhuǎn)換,二是外接運(yùn)算放大器。用負(fù)載電阻進(jìn)行電流—電壓轉(zhuǎn)換的方法,雖可在電流輸出引腳上出現(xiàn)電壓,但必須在規(guī)定的輸出電壓范圍內(nèi)使用,而且由于輸出阻抗高,所以一般外接運(yùn)算放大器使用。此外,大部分CMOSDA轉(zhuǎn)換器當(dāng)輸出電壓不為零時(shí)不能正確動作,所以必須外接運(yùn)算放大器。當(dāng)外接運(yùn)算放大器進(jìn)行電流電壓轉(zhuǎn)換時(shí),則電路構(gòu)成基本上與內(nèi)置放大器的電壓輸出型相同,這時(shí)由于在D/A轉(zhuǎn)換器的電流建立時(shí)間上加入了運(yùn)算放入器的延遲,使響應(yīng)變慢。此外,這種電路中運(yùn)算放大器因輸出引腳的內(nèi)部電容而容易起振,有時(shí)必須作相位補(bǔ)償。3、乘算型(如AD7533)D/A轉(zhuǎn)換器中有使用恒定基準(zhǔn)電壓的,也有在基準(zhǔn)電壓輸入上加交流信號的,后者由于能得到數(shù)字輸入和基準(zhǔn)電壓輸入相乘的結(jié)果而輸出,因而稱為乘算型D/A轉(zhuǎn)換器。乘算型D/A轉(zhuǎn)換器一般不僅可以進(jìn)行乘法運(yùn)算,而且可以作為使輸入信號數(shù)字化地衰減的衰減器及對輸入信號進(jìn)行調(diào)制的調(diào)制器使用。4、一位D/A轉(zhuǎn)換器一位D/A轉(zhuǎn)換器與前述轉(zhuǎn)換方式全然不同,它將數(shù)字值轉(zhuǎn)換為脈沖寬度調(diào)制或頻率調(diào)制的輸出,然后用數(shù)字濾波器作平均化而得到一般的電壓輸出(又稱位流方式),用于音頻等場合。5、MAX504在開發(fā)板上的連接Max504的連接上圖中,RFB連接VOUT、BIPOFF連接AGND,使得輸出電壓范圍為0~2VREFIN,即0~4.069V。時(shí)鐘和輸入、輸出信號分別與同步串口的時(shí)鐘、發(fā)送和接收端相連。可以通過WriteSDIO(data)函數(shù)(Uhal.h)向MAX504發(fā)送數(shù)據(jù)。發(fā)送數(shù)據(jù)時(shí)要注意,MAX504可接受12位的數(shù)據(jù),但低兩位不起作用。WriteSDIO(data)函數(shù)一次只能發(fā)送8位的數(shù)據(jù),所以發(fā)送數(shù)據(jù)時(shí)應(yīng)先將數(shù)據(jù)左移兩位,然后先發(fā)送高八位,再發(fā)送低八位數(shù)據(jù)。CLR和CS分別由MAX504_CLEAR()和MAX504_ENABLE()、MAX504_DISABLE()函數(shù)(Max504.c)控制。六、程序分析實(shí)驗(yàn)程序流程圖具體程序代碼da_main.c如下:#include<stdio.h>#include<fcntl.h>#include<string.h>#include<sys/ioctl.h>#defineDA0_IOCTRL_WRITE 0x10#defineDA1_IOCTRL_WRITE 0x11#defineDA_IOCTRL_CLR 0x12#defineMax504_FULL 4.096fstaticintda_fd=-1;char*DA_DEV="/dev/exio/0raw";voidDelay(intt){inti;for(;t>0;t--)for(i=0;i<400;i++);}intmain(intargc,char**argv){floatv;unsignedintvalue;//char*da_dev;//unsignedintda_num=0;if(argc<3){printf("\n");printf("Errorparameter\n");printf("Inputas:\n");printf("[~]./ad_mainda_idnum\n");printf(" da_id:selectbetween0and1\n");printf(" num:range0.0~4.096\n");printf("\n");return1;}sscanf(argv[2],"%f",&v);if(v<0||v>Max504_FULL){printf("DAoutmustbetween:0to%f\n",Max504_FULL);return1;}value=(unsignedint)((v*1024.0f)/Max504_FULL);if((da_fd=open(DA_DEV,O_WRONLY))<0){printf("Erroropening/dev/exio/0rawdevice\n");return1;}if(strcmp(argv[1],"0")==0){ioctl(da_fd,DA_IOCTRL_CLR,0);//clearda.ioctl(da_fd,DA0_IOCTRL_WRITE,&value);}elseif(strcmp(argv[1],"1")==0){ioctl(da_fd,DA_IOCTRL_CLR,1);//clearda.ioctl(da_fd,DA1_IOCTRL_WRITE,&value);}#if0ioctl(da_fd,DA_IOCTRL_CLR,0);//clearda.for(;;){ioctl(da_fd,DA0_IOCTRL_WRITE,&value);Delay(500);}#endifclose(da_fd);printf("CurrentVoltageis%fv\n",v);return0;}七、實(shí)驗(yàn)步驟1、閱讀理解源碼進(jìn)入/arm2410cl/exp/basic/05_da目錄,使用vi編輯器或其他編輯器閱讀理解源代碼2、編譯應(yīng)用程序運(yùn)行make產(chǎn)生da可執(zhí)行文件da_main[root@zxt/]#cd/arm2410cl/exp/basic/05_da/[root@zxt05_da]#makearmv4l-unknown-linux-gcc -c-oda_main.oda_main.carmv4l-unknown-linux-gcc da_main.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論