嵌入式ad接口實驗_第1頁
嵌入式ad接口實驗_第2頁
嵌入式ad接口實驗_第3頁
嵌入式ad接口實驗_第4頁
嵌入式ad接口實驗_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 2.4 A/D 接口實 驗 一、實驗?zāi)康?了解在 linux 環(huán)境下對 S3C2410 芯片的 8 通道 10 位 A/D 的操作與控制。 二、實驗內(nèi)容 學(xué)習(xí) A/D 接口原理,了解實現(xiàn) A/D 系統(tǒng)對于系統(tǒng)的軟件和硬件要求。閱讀 ARM 芯片文檔, 掌握 ARM 的 A/D 相關(guān)寄存器的功能,熟悉 ARM 系統(tǒng)硬件的 A/D 相關(guān)接口。利用外部模擬信 號編程實現(xiàn) ARM 循環(huán)采集全部前 4 路通道,并且在超級終端上顯示。 三、預(yù)備知識 ? 有 C 語言基礎(chǔ)。 ? 掌握在 Linux 下常用編輯器的使 用。? 掌握 Makefile 的編寫和使 用。? 掌握 Linux 下的程序編譯與交叉編

2、譯過 程。 四、實驗設(shè)備及工具 硬件:UP-TECH S2410/P270 DVP 嵌入式實驗平臺、PC 機(jī) Pentium 500 以上, 硬盤 10G 以上。 軟件: PC 機(jī)操作系統(tǒng) REDHAT LINUX 9.0MINICOMARM-LINUX 開發(fā)環(huán)境 五、實驗原理 1、A/D 轉(zhuǎn)換器 A/D 轉(zhuǎn)換器是模擬信號源和 CPU 之間聯(lián)系的接口,它的任務(wù)是將連續(xù)變化的模擬信號轉(zhuǎn)換 為數(shù)字信號,以便計算機(jī)和數(shù)字系統(tǒng)進(jìn)行處理、存儲、控制和顯示。在工業(yè)控制和數(shù)據(jù)采 集及許多其他領(lǐng)域中,A/D 轉(zhuǎn)換是不可缺少的。 A/D 轉(zhuǎn)換器有以下類型:逐位比較型、積分型、計數(shù)型、并行比較型、電壓頻率型,主

3、要應(yīng)根據(jù)使用場合的具體要求,按照轉(zhuǎn)換速度、精度、價格、功能以及接口條件等因素來 決定選擇何種類型。常用的有以下兩種: ? 雙積分型的 A/D 轉(zhuǎn)換器 雙積分式也稱二重積分式,其實質(zhì)是測量和比較兩個T,此時間往往是固定的;另一個是以充積分的時間 積分的時間,一個是對模擬輸入電壓0電后的電壓為初值,對參考電源 Vref 反向積分,積分電容被放電至零所需的時間 T。模擬輸1入電壓 Vi 與參考電壓 V之比,等 于上述兩個時間之比。由于 V、T固定,而放電時間 T可1 0 Ref Ref 以測出,因而可計算出模擬輸 入電壓的大小(V與 Vi 符號相反)。 Ref 由于 T、V為已知的固定常數(shù),因此反向

4、積分時間 T與輸入模擬電壓 Vi 在 T時間內(nèi)的平 均值0 1 0Ref 成正比。輸入電壓 V愈高,V愈大,T就愈長。在 T開始時刻,控制邏輯同時打開計 數(shù)器的1 A i 1 即正比 控制門開始計數(shù),直到積分器恢復(fù)到零電平時,計數(shù)停止。則計數(shù)器所計出的數(shù)字于輸入電壓 Vi 在 T時間內(nèi)的平均值,于是完成了一次 A/D 轉(zhuǎn)換。 0 由于雙積分型 A/D 轉(zhuǎn)換是測量輸入電壓 Vi 在 T時間內(nèi)的平均值,所以對常態(tài)干擾(串摸干 擾)0 有很強(qiáng)的抑制作用,尤其對正負(fù)波形對稱的干擾信號,抑制效果更好。 雙積分型的 A/D 轉(zhuǎn)換器電路簡單,抗干擾能力強(qiáng),精度高,這是突出的優(yōu)點。但轉(zhuǎn)換速度 比較慢,常? 逐

5、次逼近型的 A/D 轉(zhuǎn)換器 用 /D )(逐次逼近型也稱逐位比較式的A轉(zhuǎn)換器,應(yīng)用比積分型更為廣泛,其原理框圖如圖的 A/D 2.4.1 所示,主要由逐次逼近寄存器 SAR、D/A 轉(zhuǎn)換器、比較器以及時序和控制邏輯等部分 組成。它的實質(zhì)是逐次把設(shè)定的 SAR 寄存器中的數(shù)字量經(jīng) D/A 轉(zhuǎn)換后得到電壓 Vc 與待轉(zhuǎn)換 ”還最高位開始,逐次確定各位的數(shù)碼應(yīng)是“1 SAR 的模擬電壓 V。進(jìn)行比較。比較時,先從是“0”,其工作過程如下: 轉(zhuǎn)換前,先將 SAR 寄存器各位清零。轉(zhuǎn)換開始時,控制邏輯電路先設(shè)定 SAR 寄存器的最高 位為“1”,其余位為“0”,此試探值經(jīng) D/A 轉(zhuǎn)換成電壓 Vc,然后

6、將 Vc 與模擬輸入電壓 Vx 比 較。如果 VxVc,說明 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

7、 和 D/A 的位數(shù)。位數(shù)越多, 越能準(zhǔn)確逼近模擬量,但轉(zhuǎn)換所需的時間也越長。 z 逐次逼近式的 A/D 轉(zhuǎn)換器的主要特點是: 轉(zhuǎn)換速度較快,在 1100/s 以內(nèi),分辨率可以達(dá) 18 位,特別適用于工業(yè)控制系統(tǒng)。轉(zhuǎn) 換時間固定,不隨輸入信號的變化而變化??垢蓴_能力相對積分型的差。例如,對模擬輸 入信號采樣過程中,若在采樣時刻有一個干擾脈沖迭加在模擬信號上,則采樣時,包括干 擾信號在內(nèi),都被采樣和轉(zhuǎn)換為數(shù)字量,這就會造成較大的誤差,所以有必要采取適當(dāng)?shù)?濾波措施。 圖 2.4.1 逐次逼近式 A/D 轉(zhuǎn)換器 2、A/D 轉(zhuǎn)換的重要指標(biāo) ? 分辨率(Resolution) 分辨率反映 A/D 轉(zhuǎn)

8、換器對輸入微小變化響應(yīng)的能力,通常用數(shù)字輸出最低位(LSB)所對應(yīng)的 滿量程的模擬輸入電平。由于分辨率直接與1/2能反應(yīng) 模擬輸入的電平值表示。n 位 A/D n 轉(zhuǎn)換器的位數(shù)有關(guān),所以一般也可簡單地用數(shù)字量的位數(shù)來表示分辨率,即 n 位二進(jìn)制數(shù), 最低位所具有的權(quán)值,就是它的分辨率。 值得注意的是,分辨率與精度是兩個不同的概念,不要把兩者相混淆。即使分辨率很高, 也可能由于溫度漂移、線性度等原因,而使其精度不夠高。 ? 精度 (Accuracy)精度有絕對精度(Absolute Accuracy)和相對精度(Relative Accuracy)兩種表示方法。 z 絕對誤差: 在一個轉(zhuǎn)換器中,

9、對應(yīng)于一個數(shù)字量的實際模擬輸入電壓和理想的模擬輸入電壓之差并非 是一個常數(shù)。我們把它們之間的差的最大值,定義為“絕對誤差”。通常以數(shù)字量的最小± 1LSB 等。絕對誤差包括量化誤差和其它的分?jǐn)?shù)值來表示絕對誤差,例如:有 效位(LSB) 所 有誤差。 z 相對誤差 是指整個轉(zhuǎn)換范圍內(nèi),任一數(shù)字量所對應(yīng)的模擬輸入量的實際值與理論值之差,用模擬電 壓滿量程的百分比表示。 ± 1/2LSB, 則其最小有效位的量化 單片,10 位 A/D 芯若其絕對精度為0V例如,滿量程為 1位:9.77mV,其絕對精度為4.88mV,其相對精度為 0.048%。 z 轉(zhuǎn)換時間(Conversion

10、 Time) 轉(zhuǎn)換時間是指完成一次 A/D 轉(zhuǎn)換所需的時間,即由發(fā)出啟動轉(zhuǎn)換命令信號到轉(zhuǎn)換結(jié)束信號 開始有效的時間間隔。轉(zhuǎn)換時間的倒數(shù)稱為轉(zhuǎn)換速率。例如 AD570 的轉(zhuǎn)換時間為 25us,其 轉(zhuǎn)換速率為 40KHz。 (power supply sensitivity)電源靈敏度z 電源靈敏度是指 A/D 轉(zhuǎn)換芯片的供電電源的電壓發(fā)生變化時,產(chǎn)生的轉(zhuǎn)換誤差。一般用電 源電壓變化 1時相當(dāng)?shù)哪M量變化的百分?jǐn)?shù)來表示。 量程z 量程是指所能轉(zhuǎn)換的模擬輸入電壓范圍,分單極性、雙極性兩種類型。 例如,單極性 量程為 0+5V,0+10V,0+20V; 雙極性 量程為-5+5V,-10+10V。 z

11、輸出邏輯電平 多數(shù) A/D 轉(zhuǎn)換器的輸出邏輯電平與 TTL 電平兼容。在考慮數(shù)字量輸出與微處理的數(shù)據(jù)總線 接口時,應(yīng)注意是否要三態(tài)邏輯輸出,是否要對數(shù)據(jù)進(jìn)行鎖存等。 工作溫度范圍z 由于溫度會對比較器、運算放大器、電阻網(wǎng)絡(luò)等產(chǎn)生影響,故只在一定的溫度范圍內(nèi)才能保證額定精度指標(biāo)。一般 A/D 轉(zhuǎn)換器的工作溫度范圍為(0700為軍用品的工作溫度范圍 C),(-55+1250 C)? ARM 自帶的十位 A/D 轉(zhuǎn)換 器ARM S3C2410 芯片自帶一個路 10 位 A/D 轉(zhuǎn)換器,并且支持觸摸屏功能。ARM2410 開發(fā)板 只用作 3 路 A/D 轉(zhuǎn)換器,其最大轉(zhuǎn)換率為 500K,非線性度為正負(fù)

12、.5 位,其轉(zhuǎn)換時間可以 通過下式計算:如果系統(tǒng)時鐘為 50MHz,比例值為 49,則為 A/D 轉(zhuǎn)換器頻率50 MHz/(49+1) = 1 MHz 轉(zhuǎn)換時間1/(1 MHz / 5cycles) = 1/200 kHz(相當(dāng)于 5us)= 5 us 采樣控制寄存器的設(shè)置.4.1 2表 寄存器 地址 寫/讀 描述復(fù)位值 ADCCON 0x58000000 R/W 控制寄存器 ADC 0x3FC4 采樣控制寄存器的位描述2.4.2 表 ADCCON 位 描述初始設(shè)置 ECFLG 15End of conversion flag (read only). 0 = A/D conversion i

13、n process PRSCEN 141 = End of A/D conversionA/D converter prescaler enable. 0 = Disable PRSCVL 13:61 = EnableA/D converter prescaler value. Data value: 1 255 Note that division factor is (N+1) when the prescaler value is SEL_MUX 5:3Analog input channel select. 000 = AIN 0 001 = AIN 1 010 = AIN 2 011

14、 = AIN 3 100 = AIN 4 101 = AIN 5 0xF0 STDBM 2Standby mode select. 0 = Normal operation mode READ_ START 11 = Standby modeA/D conversion start by read. 0 = Disable start by read operation ENABLE_ START 01 = Enable start by read operationA/D conversion starts by setting this bit. If READ_START is enab

15、led, this value is not valid. 0 = No operation 1 = A/D conversion starts and this bit is 0 是讀操作使能轉(zhuǎn)換,寫表示轉(zhuǎn)位表示轉(zhuǎn)換開始。1 位 0 是轉(zhuǎn)換使能位,寫 1 該寄存器的有 14 位為比例因子5 3、4、位是通道號。換在讀操作時開始。換比例因子。D 轉(zhuǎn)位為 A13:6 。位為轉(zhuǎn)換標(biāo)志位(只讀)15 效位, 轉(zhuǎn)換結(jié)果數(shù)據(jù)寄存器的設(shè)置2.4.3A/D表 寄存器地址 寫/讀描述復(fù)位值 ADCDAT0 0x5800000C R 轉(zhuǎn)換數(shù)據(jù)寄存器ADC - 為滿量程 時ADCDAT0:轉(zhuǎn)換結(jié)果數(shù)據(jù)寄存器。該寄

16、存器的十位表示轉(zhuǎn)換后的結(jié)果,全為 1 伏。3.3 A/D 轉(zhuǎn)換器在擴(kuò)展板的連接? 源上。電示,前三路通過電位器接到所 3.3v .4.2 轉(zhuǎn)A/D 換器在擴(kuò)展板的接法如圖2 .4.2 A/D 圖2轉(zhuǎn)換器在擴(kuò)展板上的接法 六、程序分析(關(guān)鍵代碼分析) 、 read 驅(qū)動對用戶來說只是下面的一個文件結(jié)構(gòu)。在用戶程序里只需要用到open、ad 內(nèi)核函數(shù)即可。本實驗采用的是模塊方式加載,可以在實驗箱的、 release 等write 驅(qū)動程序。D 的中找到/mnt/yaffs/ad/ A static struct file_operations s3c2410_fops = owner: THIS_

17、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)核里的代碼我們放到了本次實驗的 src 文件下,s3c2410.h_chip.h 里為 arm2410 頭文件 s3c2410.h 初始化 ADC 的部分。所有 代碼也可以到內(nèi)核里面去閱讀。關(guān)于驅(qū)動知識的基本介紹請見第 4 章第一小節(jié),本節(jié)只作 為應(yīng)用實驗的簡單例子。 static int s3c2410_adc_open

18、(struct inode *inode, struct file *file) init_MUTEX(&adcdev.lock); init_waitqueue_head(&(adcdev.wait); adcdev.channel=0; adcdev.prescale=0xff; MOD_INC_USE_COUNT; DPRINTK( adc openedn); return 0; /AD 通道和比例因子初始化 static ssize_t s3c2410_adc_write(struct file *file, const char *buffer, size_t cou

19、nt, loff_t * ppos) int data; if(count!=sizeof(data) /error input data size DPRINTK(he size of input data must be %dn, sizeof(data); return 0; copy_from_user(&data, buffer, count); adcdev.channel=ADC_WRITE_GETCH(data); adcdev.prescale=ADC_WRITE_GETPRE(data); DPRINTK(set adc channel=%d, prescale=0

20、x%xn, adcdev.channel, adcdev.prescale); return count; /告訴內(nèi)核驅(qū)動讀哪一個通道的數(shù)據(jù)和設(shè)置比例因子 #define START_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; A

21、DCCON 0 為置 1,準(zhǔn)備采集數(shù)據(jù) static ssize_t s3c2410_adc_read(struct file *filp, char *buffer, size_t count, loff_t *ppos) int ret = 0; if (down_interruptible(&adcdev.lock) return -ERESTARTSYS; START_ADC_AIN(adcdev.channel, adcdev.prescale); interruptible_sleep_on(&adcdev.wait); ret = ADCDAT0; ret &am

22、p;= 0x3ff; /把數(shù)據(jù)寄存器內(nèi)容放入變量 ret DPRINTK(AIN%d = 0xx, %dn, adcdev.channel, ret, ADCCON & 0x80 ? 1:0); copy_to_user(buffer, (char *)&ret, sizeof(ret);/把 ret 變量的內(nèi)容傳給用戶緩沖區(qū) up(&adcdev.lock); return sizeof(ret); /由內(nèi)核采集通道數(shù)據(jù)后把數(shù)據(jù)放回用戶區(qū) main.c 的代碼如下: /* *by threewater<threewaterup-> *2004.06.18

23、*/ #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 #define ADC_DEV /dev/adc/0raw static int adc_fd = -1; static int init_ADdevice(void) i

24、f(adc_fd=open(ADC_DEV, O_RDWR)<0) printf(Error opening %s adc devicen, ADC_DEV); return -1; static int GetADresult(int channel) int PRESCALE=0XFF; int data=ADC_WRITE(channel, PRESCALE); write(adc_fd, &data, sizeof(data); read(adc_fd, &data, sizeof(data); return data; static int stop=0; st

25、atic void* comMonitor(void* data) getchar(); stop=1; return NULL; int main(void) int i; float d; pthread_t th_com; void * retval; /set s3c44b0 AD register and start AD if(init_ADdevice()<0) return -1; /* Create the threads */ pthread_create(&th_com, NULL, comMonitor, 0); printf(Press Enter key exit!n); while( stop=0 ) for(i=0; i<=2; i+)/采樣 02 路 A/D 值 d=(float)GetADresult(i)*3.3)/1024.0; printf(a%d=%8.4ft,i,d); usleep(1); printf(); /* Wait until producer and consumer finish. */ pthread_join(th_com, &retval); printf(); return 0; 七、實驗步驟 1、閱讀理解源碼 進(jìn)入/arm2410cl/e

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論