嵌入式ad接口實(shí)驗(yàn)_第1頁(yè)
嵌入式ad接口實(shí)驗(yàn)_第2頁(yè)
嵌入式ad接口實(shí)驗(yàn)_第3頁(yè)
嵌入式ad接口實(shí)驗(yàn)_第4頁(yè)
嵌入式ad接口實(shí)驗(yàn)_第5頁(yè)
已閱讀5頁(yè),還剩15頁(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)介

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

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

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

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

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

6、將 Vc 與模擬輸入電壓 Vx 比 較。如果 VxVc,說(shuō)明 SAR 最高位的“1”應(yīng)予保留;如果 Vx<Vc,說(shuō)明 SAR 該位應(yīng)予清零。 然后再對(duì) SAR 寄存器的次高位置“1”,依上述方法進(jìn)行 D/A 轉(zhuǎn)換和比較。如此重復(fù)上述過(guò)程, 直至確定 SAR 寄存器的最低位為止。過(guò)程結(jié)束后,狀態(tài)線改變狀態(tài),表明已完成一次轉(zhuǎn)換。 最后,逐次逼近寄存器 SAR 中的內(nèi)容就是與輸入模擬量 V 相對(duì)應(yīng)的二進(jìn)制數(shù)字量。顯然 A/D 轉(zhuǎn)換器的位數(shù) N 決定于 SAR 的位數(shù)和 D/A 的位數(shù)。圖 2.4.1(b)表示四位 A/D 轉(zhuǎn)換器的逐次 逼近過(guò)程。轉(zhuǎn)換結(jié)果能否準(zhǔn)確逼近模擬信號(hào),主要取決于 SAR

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

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

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

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

11、輸出邏輯電平 多數(shù) A/D 轉(zhuǎn)換器的輸出邏輯電平與 TTL 電平兼容。在考慮數(shù)字量輸出與微處理的數(shù)據(jù)總線 接口時(shí),應(yīng)注意是否要三態(tài)邏輯輸出,是否要對(duì)數(shù)據(jù)進(jìn)行鎖存等。 工作溫度范圍z 由于溫度會(huì)對(duì)比較器、運(yùn)算放大器、電阻網(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 芯片自帶一個(gè)路 10 位 A/D 轉(zhuǎn)換器,并且支持觸摸屏功能。ARM2410 開(kāi)發(fā)板 只用作 3 路 A/D 轉(zhuǎn)換器,其最大轉(zhuǎn)換率為 500K,非線性度為正負(fù)

12、.5 位,其轉(zhuǎn)換時(shí)間可以 通過(guò)下式計(jì)算:如果系統(tǒng)時(shí)鐘為 50MHz,比例值為 49,則為 A/D 轉(zhuǎn)換器頻率50 MHz/(49+1) = 1 MHz 轉(zhuǎn)換時(shí)間1/(1 MHz / 5cycles) = 1/200 kHz(相當(dāng)于 5us)= 5 us 采樣控制寄存器的設(shè)置.4.1 2表 寄存器 地址 寫(xiě)/讀 描述復(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)換,寫(xiě)表示轉(zhuǎn)位表示轉(zhuǎn)換開(kāi)始。1 位 0 是轉(zhuǎn)換使能位,寫(xiě) 1 該寄存器的有 14 位為比例因子5 3、4、位是通道號(hào)。換在讀操作時(shí)開(kāi)始。換比例因子。D 轉(zhuǎn)位為 A13:6 。位為轉(zhuǎn)換標(biāo)志位(只讀)15 效位, 轉(zhuǎn)換結(jié)果數(shù)據(jù)寄存器的設(shè)置2.4.3A/D表 寄存器地址 寫(xiě)/讀描述復(fù)位值 ADCDAT0 0x5800000C R 轉(zhuǎn)換數(shù)據(jù)寄存器ADC - 為滿量程 時(shí)ADCDAT0:轉(zhuǎn)換結(jié)果數(shù)據(jù)寄存器。該寄

16、存器的十位表示轉(zhuǎn)換后的結(jié)果,全為 1 伏。3.3 A/D 轉(zhuǎn)換器在擴(kuò)展板的連接? 源上。電示,前三路通過(guò)電位器接到所 3.3v .4.2 轉(zhuǎn)A/D 換器在擴(kuò)展板的接法如圖2 .4.2 A/D 圖2轉(zhuǎn)換器在擴(kuò)展板上的接法 六、程序分析(關(guān)鍵代碼分析) 、 read 驅(qū)動(dòng)對(duì)用戶來(lái)說(shuō)只是下面的一個(gè)文件結(jié)構(gòu)。在用戶程序里只需要用到open、ad 內(nèi)核函數(shù)即可。本實(shí)驗(yàn)采用的是模塊方式加載,可以在實(shí)驗(yàn)箱的、 release 等write 驅(qū)動(dòng)程序。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, ; 下面我們對(duì)驅(qū)動(dòng)部分重要函數(shù)進(jìn)行說(shuō)明。ad 驅(qū)動(dòng)在內(nèi)核里的代碼我們放到了本次實(shí)驗(yàn)的 src 文件下,s3c2410.h_chip.h 里為 arm2410 頭文件 s3c2410.h 初始化 ADC 的部分。所有 代碼也可以到內(nèi)核里面去閱讀。關(guān)于驅(qū)動(dòng)知識(shí)的基本介紹請(qǐng)見(jiàn)第 4 章第一小節(jié),本節(jié)只作 為應(yīng)用實(shí)驗(yàn)的簡(jiǎn)單例子。 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ū)動(dòng)讀哪一個(gè)通道的數(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; 七、實(shí)驗(yàn)步驟 1、閱讀理解源碼 進(jìn)入/arm2410cl/e

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論