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