基于s3c2410和嵌入式Linux的D/A轉(zhuǎn)換的實(shí)現(xiàn)
1 引言
本文引用地址:http://m.butianyuan.cn/article/152619.htm在嵌入式應(yīng)用系統(tǒng)中,特別是智能儀器、儀表、機(jī)電設(shè)備及裝置控制中,需要使用A/D轉(zhuǎn)換將模擬的電量信號(hào)轉(zhuǎn)換為數(shù)字信號(hào)進(jìn)行處理,而后再將處理的結(jié)果通過D/A轉(zhuǎn)換為模擬量實(shí)現(xiàn)對被控過程和對象的控制[1]。
基于ARM920T內(nèi)核的s3c2410是一款低功耗,高性價(jià)比的處理器[2]。這款處理器內(nèi)部集成了多種控制接口,自帶8路10位的A/D轉(zhuǎn)換器[3],用于支持對于觸摸屏輸入的控制,而且足以滿足外部模擬量采集的需要,但是s3c2410內(nèi)部沒有集成D/A轉(zhuǎn)換器,因此在上述應(yīng)用中,就需要采用獨(dú)立的D/A轉(zhuǎn)換芯片與s3c2410配合,滿足應(yīng)用的需要。而MAX504一款通用的10位串行D/A轉(zhuǎn)換器,可以滿足一般應(yīng)用對于分辨率和精度的要求,并且采用串行通信,芯片面積小,占用的處理器管腳數(shù)少,因此本文中以s32410外接MAX504,并基于Linux操作系統(tǒng),實(shí)現(xiàn)D/A轉(zhuǎn)換的功能。
2 系統(tǒng)硬件電路
2.1 10位的D/A轉(zhuǎn)換器MAX504[4]
MAX504是MAXIUM公司推出的低功耗,電壓輸出,10位串行數(shù)字/模擬轉(zhuǎn)換芯片,支持+5V單供電和±5V雙供電方式,并且該芯片對于包括偏移、增益和線性誤差在內(nèi)的各項(xiàng)誤差均以調(diào)整,所以應(yīng)用非常簡單,不需要再度校正。
MAX504采用的是三線串行接口,與SPI,QSPI和Microwire標(biāo)準(zhǔn)均兼容。MAX504可通過寫入兩個(gè)8位長的數(shù)據(jù)進(jìn)行編程,其寫入的先后順序?yàn)椋?個(gè)填充位,10個(gè)數(shù)據(jù)位和最低兩位的0。此處,最高4位的填充位只有當(dāng)MAX504采用菊花鏈方式連接時(shí)必須寫入,而最低的兩位0則一定需要寫入。當(dāng)且僅當(dāng)CS片選有效時(shí),數(shù)據(jù)在SCLK的上升沿逐位打入片內(nèi)的16位移位寄存器,并在CS上升沿,將有效的10位數(shù)據(jù)(第2~第11位)傳送到D/A轉(zhuǎn)換寄存器中,修改原寄存器內(nèi)容。
MAX504芯片為14管腳的DIP或者SO封裝形式,除電源和地管腳外,管腳可以分為兩組,一組與處理器相連接,另一組管腳的不同連接可以改變MAX504的工作模式。
MAX504具有三種工作模式,分別是單極性輸出,雙極性輸出和四象限乘法器。通過將MAX504的REIN,VOUT ,BIPOFF和RFB幾個(gè)管腳的不同連接方式,可以根據(jù)需要將MAX504定義為需要的工作模式。
2.2 MAX504與S3c2410的連接
MAX504與處理器之間可以使用SPI,QSPI和Microwire中的任何一種串行通信方式,而s3c2410帶有兩個(gè)SPI接口,所以MAX504與s32410之間通過SPI進(jìn)行連接非常方便。電路如圖所示
圖2.1 電路連接原理圖
MAX504與處理器連接的主要管腳有四個(gè),分別是:
(1) DIN―數(shù)據(jù)輸入端,該管腳用于接收串行通信數(shù)據(jù)信號(hào),直接與s3c2410的MOSI管腳連接即可。MOSIn(n可以為0或1,分別對應(yīng)兩個(gè)SPI口)管腳,s3c2410作為SPI串行通信的主模塊使用,該管腳由s3c2410輸出信號(hào),MAX504作為通信的從設(shè)備進(jìn)行數(shù)據(jù)的接收。
(2) SCLK―串行時(shí)鐘輸入端,該管腳用于接收串行通信的時(shí)鐘信號(hào),以便串行通信過程中的通信雙方的同步,直接與s3c2410的SPI時(shí)鐘輸出管腳SPICLK連接即可。
(3) CS―片選管腳,該管腳為低電平有效,只有當(dāng)CS有效時(shí),MAX504接收數(shù)據(jù),并在CS失效時(shí),開始進(jìn)行數(shù)據(jù)轉(zhuǎn)換。本電路中,使用s3c2410的一根外部I/O管腳進(jìn)行控制。
(4) CLR―清除端,該管腳也是低電平有效,可將MAX504的轉(zhuǎn)換數(shù)據(jù)寄存器復(fù)位清零,本電路,使用s3c2410的另一個(gè)外部I/O腳進(jìn)行控制。
該電路中,采用的是單極性工作模式,輸出電壓范圍為0~2VREF,參考電壓VREF由片內(nèi)電路形成,為2.048V,故該電路的輸出電壓范圍為0~4.096V。
3 系統(tǒng)的編程實(shí)現(xiàn)
目前嵌入式系統(tǒng)為了更好的適應(yīng)高效,穩(wěn)定,可移植的需要,廣泛地應(yīng)用了嵌入式操作系統(tǒng)進(jìn)行資源管理。Linux因其開放性特點(diǎn),成為在嵌入式系統(tǒng)中應(yīng)用最為廣泛的操作系統(tǒng)。嵌入式Linux包括RT-linux,µClinux以及ARM處理器使用的ARM-Linux等多種適應(yīng)不同應(yīng)用需要的版本。
ARM-Linux將Linux內(nèi)核移植到各種ARM處理器上,因此,在開發(fā)基于ARM處理器的應(yīng)用系統(tǒng)時(shí),如果對于實(shí)時(shí)性的要求不是很嚴(yán)格,且處理器又支持MMU時(shí),采用ARM-Linux作為操作系統(tǒng)可以縮短開發(fā)周期,降低開發(fā)成本。
3.2 D/A驅(qū)動(dòng)的實(shí)現(xiàn)
考慮到一個(gè)嵌入式應(yīng)用系統(tǒng)中,不僅僅包含A/D,D/A轉(zhuǎn)換,還包括其他,如通信,顯示,輸入等等功能,所以在實(shí)現(xiàn)D/A轉(zhuǎn)換功能時(shí),是基于嵌入式操作系統(tǒng)的,以嵌入式Linux作為操作系統(tǒng)。嵌入式Linux在操作外設(shè)時(shí),將外設(shè)分為三種類型的設(shè)備進(jìn)行操作,即:字符型、塊設(shè)備和網(wǎng)絡(luò)設(shè)備[5]。在支持D/A操作時(shí),將D/A設(shè)備作為字符型設(shè)備,需要編寫相應(yīng)的驅(qū)動(dòng)程序。
驅(qū)動(dòng)程序s3c2410-da.h>主要包含的內(nèi)容就是對文件結(jié)構(gòu)體open, ctrl,realse的重定向函數(shù)的編寫,即定向?yàn)閟3c2410_da_open,s3c2410_da_ctrl,s3c2410_da_close。這三個(gè)函數(shù)的作
用分別為:
(1)s3c2410_da_open:所做的工作非常簡單,就是增加模塊使用的計(jì)數(shù)值,通過該值可以體現(xiàn)邏輯上當(dāng)先打開da端口的任務(wù)數(shù)。
(2)s3c2410_da_close:該函數(shù)進(jìn)行的處理與open剛好相反,將模塊使用計(jì)數(shù)值減一,表明使用結(jié)束。
圖3.1 驅(qū)動(dòng)核心函數(shù)s3c2410_da_ctrl流程圖
(3)s3c2410_da_ctrl:該函數(shù)為核心函數(shù),函數(shù)定義為static int s3c2410_exio_ioctl (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg),函數(shù)功能為:由cmd參數(shù)指出D/A操作類型,arg為操作使用的參數(shù),根據(jù)cmd和arg,可以根據(jù)通道號(hào),對多個(gè)D/A通道進(jìn)行清空操作和數(shù)據(jù)寫入操作。
函數(shù)流程如圖3.1所示,應(yīng)用程序進(jìn)行系統(tǒng)調(diào)用后,進(jìn)入內(nèi)核態(tài),運(yùn)行該函數(shù)實(shí)現(xiàn)對DA的操作,DA_ENABLE,使能s3c2410用于控制Max504的外部I/O,使CS低電平有效,選中D/A。之后,根據(jù)cmd指定的操作類型,對不同的D/A設(shè)備進(jìn)行數(shù)據(jù)傳送操作和寄存器清空操作。對D/A的數(shù)據(jù)寫入,這里是通過s3c2410的SPI口進(jìn)行的,s3c2410的兩個(gè)SPI口,在D/A應(yīng)用中,需要操作的SPI寄存器主要是SPICON和SPITDAT,設(shè)置SPICON,使s3c2410工作于主模式,將發(fā)送給MAX504進(jìn)行轉(zhuǎn)換的數(shù)據(jù)寫入SPITDAT,SPITDAT為8位的寄存器,而MAX504是10位D/A轉(zhuǎn)換器,所以需要發(fā)送兩次,并且MAX504接收的16位數(shù)據(jù),要求最低兩位一定為00。數(shù)據(jù)經(jīng)SPI傳送后,MAX504并不立即進(jìn)行數(shù)據(jù)轉(zhuǎn)換,而是在CS片選上升沿才開始數(shù)據(jù)轉(zhuǎn)換,DA_DISABLE的作用就是使s3c2410連接MAX504-CLR管腳的外部I/O端失效,此時(shí)D/A開始進(jìn)行數(shù)據(jù)轉(zhuǎn)換,系統(tǒng)調(diào)用結(jié)束。
將寫好的驅(qū)動(dòng)程序庫,進(jìn)行加載,加載到Linux核中,應(yīng)用程序就可以像操作文件一樣操作D/A設(shè)備了。
3.3應(yīng)用程序設(shè)計(jì)示例
有了底層驅(qū)動(dòng)的支持,用戶可以根據(jù)自己的需要編寫D/A轉(zhuǎn)換應(yīng)用程序,而不需要關(guān)心MAX504和s3c2410的硬件特征,這樣就使的應(yīng)用程序的編寫非常的簡單。這里以一個(gè)簡單的應(yīng)用程序?yàn)槔f明其程序編寫方法,流程圖如圖所示。該應(yīng)用程序,可以根據(jù)用戶輸入的D/A轉(zhuǎn)換器的編號(hào)和電壓,由MAX504的Vout管腳輸出該電壓。
首先,由于按上述電路,MAX504的滿量程輸出電壓為4.096V,所以用戶要求輸出的電壓應(yīng)在該范圍內(nèi),將用戶輸入的電壓值,用下面語句轉(zhuǎn)換為數(shù)字量:
value=(unsigned int)((v*1024.0f)/Max504_FULL);
得到D/A轉(zhuǎn)換的數(shù)字量后,調(diào)用ioctl,首先將指定D/A的寄存器清空:
ioctl(da_fd, DA_IOCTRL_CLR, 0);//清D/A0
而后調(diào)用ioctl,對待轉(zhuǎn)換的數(shù)字量進(jìn)行D/A轉(zhuǎn)換:
ioctl(da_fd, DA0_IOCTRL_WRITE, value);
轉(zhuǎn)換結(jié)束后,將設(shè)備釋放即可。
圖3.2 應(yīng)用程序流程圖
4結(jié)束語
本文針對主流嵌入式處理器-基于ARM920T內(nèi)核的s3c2410,以D/A小型外設(shè)實(shí)際開發(fā)過程為引,在硬件連接電路的基礎(chǔ)上,詳細(xì)地說明了嵌入式Linux操作系統(tǒng)的外設(shè)驅(qū)動(dòng)開發(fā)方法,給出了基于該處理器和Linux操作系統(tǒng)的外設(shè)驅(qū)動(dòng)開發(fā)流程,既可直接用于工程應(yīng)用,同時(shí)又為其他嵌入式系統(tǒng)的開發(fā)提供參考。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論