新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > VxWorks下AD/DA驅(qū)動系統(tǒng)設計及測試

VxWorks下AD/DA驅(qū)動系統(tǒng)設計及測試

作者: 時間:2017-06-04 來源:網(wǎng)絡 收藏

相對于其他嵌入式操作系統(tǒng),以其高可靠性、微內(nèi)核、可裁減性以及高效的硬實時任務調(diào)度、中斷管理等優(yōu)點,被廣泛地應用在通信、軍事、航空、航天等高精尖技術和實時性要求極高的領域[1]。工程中實際應用的嵌入式系統(tǒng)通常包括以下幾個部分:串口、并口、CAN總線和AD/DA等。對于前三種嵌入式硬件,內(nèi)核本身已提供了完備的驅(qū)動支持并給出了相應驅(qū)動的參考例程,但目前還未包括對A/D及D/A設備的支持;此外,由于相關技術資料的保密性,相應驅(qū)動設計的參考文獻也較少。因此,本文結合實際系統(tǒng)需要(利用12位D/A輸出可調(diào)模擬量控制電機轉速,利用12位A/D對壓電陀螺所敏感的電機轉速進行數(shù)據(jù)采集),對AD/DA設備的驅(qū)動進行了相關研究,研究結果具有實際工程應用價值。

本文在簡要分析了 I/O系統(tǒng)及基礎之上,將A/D與D/A兩者整合為一個完整的字符設備掛接到VxWorks的I/O系統(tǒng)中,成功實現(xiàn)了該設備的硬件驅(qū)動并附上對應的核心驅(qū)動代碼,最后在驅(qū)動程序測試過程中簡要說明了應用層軟件的設計方法,為工程應用提供了完善的解決辦法。

1 VxWorks I/O系統(tǒng)與

了解和掌握VxWorks的I/O系統(tǒng)及設備的驅(qū)動結構,是成功設計AD/DA的前提和基礎。具體來說:VxWorks是一個層次化分明的操作系統(tǒng),每層各負其責,層與層之間又緊密相連。通常所說的驅(qū)動程序?qū)儆诘讓拥姆懂?,而用戶的應用程序則屬于上層,位于這兩層之間的是中間層,無需用戶開發(fā),由VxWorks進行維護和管理。這樣,操作系統(tǒng)把各層有機地連接在一起,使代碼緊湊而高效。VxWorks的I/O系統(tǒng)正是這樣的中間層,以本文所要研究的AD/DA驅(qū)動系統(tǒng)設計為例,圖1詳細介紹了三者的關系。

圖1中的最底層就是所要編寫的設備驅(qū)動程序,包括對具體硬件的初始化和各種操作,以及與上層I/O系統(tǒng)的接口;中間層為I/O系統(tǒng)層,VxWorks的I/O系統(tǒng)不但向上提供了7個基本的I/O接口,以供應用程序調(diào)用,而且還向下提供與各種設備驅(qū)動程序的接口;最頂層為應用層,用戶根據(jù)實際應用需要編寫應用程序,并通過應用程序向下調(diào)用I/O系統(tǒng)。與UNIX類似,VxWorks所有的I/O設備都被當作文件來存取。關于VxWorks I/O系統(tǒng)驅(qū)動機制的更多內(nèi)容請參考文獻[2][3]。

本文引用地址:http://m.butianyuan.cn/article/201706/348401.htm

  針對系統(tǒng)需要,選擇7個基本I/O接口函數(shù)中的open()、read()、write()以及ioctl()進行驅(qū)動系統(tǒng)設計,各層函數(shù)與相應實現(xiàn)的功能對應關系如表1所示。

此外,D/A輸出通道在應用程序中選擇,下面給出AD/DA驅(qū)動系統(tǒng)的具體設計過程。

2 AD/DA驅(qū)動系統(tǒng)設計

2.1 驅(qū)動系統(tǒng)開發(fā)環(huán)境

與其他嵌入式系統(tǒng)開發(fā)類似,VxWorks也采用主機-目標機模式[4],如圖2所示。

硬件平臺中主機使用CPU為迅馳的PC機,運行VxWorks開發(fā)環(huán)境Tornado2.2;目標機依照系統(tǒng)應用要求選用基于PC104 總線的嵌入式CPU卡MSMP586SEV,該CPU是VxWorks所支持的Intel x86系列CPU。VxWorks自帶的板級支持包(BSP)支持該CPU,使得在驅(qū)動開發(fā)過程中無須過多考慮CPU部分的代碼設置。外擴AD/DA采用的同樣是PC104總線的數(shù)據(jù)轉換卡ADT-650。開發(fā)調(diào)試過程中,主機通過網(wǎng)絡方式下載VxWorks映像至目標機中,目標機設定為CF卡啟動。

2.2 PC104-AD/DA卡硬件結構[5]

PC104-AD/DA卡主要由A/D轉換控制器(AD1674)和D/A轉換控制器(ADC7724)兩個核心器件組成,可提供的硬件資源為12位分辨率的8通道A/D轉換和同分辨率的4通道D/A轉換;CPU卡通過I/O映射方式對其進行訪問,可通過硬件開關選通該卡的I/O映射基地址,為了避免與其他器件地址沖突,在此選擇其基地址為:BA=0x240(可根據(jù)實際情況選擇),其余各寄存器采用偏移地址訪問的方式。為便于后續(xù)說明,簡要將卡上其他寄存器地址及功能列于表2。

在傳統(tǒng)非嵌入式(比如DOS)下應用該卡,實際上是在應用程序中對板卡進行初始化和設置相應功能寄存器以完成硬件功能。但由前面對VxWorks的I/O系統(tǒng)和設備驅(qū)動結構分析可知,該部分工作在VxWorks操作系統(tǒng)下由底層硬件驅(qū)動完成,應用程序中通過調(diào)用相應I/O接口函數(shù)來實現(xiàn)硬件功能,由此實現(xiàn)分層結構以達到隔離硬件的目的。因此,AD/DA驅(qū)動的開發(fā)就是依照I/O系統(tǒng)傳遞過來的應用層各調(diào)用接口函數(shù)完成對相應寄存器的不同設置。

2.3 AD/DA驅(qū)動程序?qū)崿F(xiàn)

AD/DA驅(qū)動的實現(xiàn)方式主要是完成以下6個函數(shù)的編寫:

設備驅(qū)動程序安裝函數(shù)adcDrv();設備創(chuàng)建函數(shù)adcDevCreate();設備打開函數(shù)adcOpen();設備讀函數(shù)(A/D轉換) adcRead();設備寫函數(shù)(D/A轉換)adcWrite();I/O控制函數(shù)adIoctl()。

其中前三個函數(shù)的設計與具體硬件關聯(lián)較少,與VxWorks下其他字符型設備驅(qū)動開發(fā)基本類似,不做過多介紹,僅需按照標準代碼形式編寫即可,具體詳細代碼可見參考文獻[6]。下面詳細介紹A/D轉換驅(qū)動、D/A轉換驅(qū)動以及設備控制驅(qū)動等部分的程序設計,給出核心代碼。

2.3.1 A/D轉換驅(qū)動

A/D轉換驅(qū)動實際是完成adcRead()函數(shù)的編寫,在該函數(shù)編寫之前,首先應明確A/D轉換驅(qū)動實現(xiàn)過程:當應用程序調(diào)用read()函數(shù)時,VxWorks的I/O系統(tǒng)將調(diào)用底層驅(qū)動adcRead()函數(shù),該函數(shù)隨即依照程序設定對表2所列卡上各相關寄存器進行設置來實現(xiàn)A/D轉換的硬件功能,從而實現(xiàn)底層驅(qū)動。

A/D轉換驅(qū)動具體實現(xiàn)的核心代碼如下(偽指令為代碼說明,以下同):

int adcRead(int adcDevId,char *pBuf,int nBytes)
{…/*觸發(fā)AD轉換*/
sysOutByte(BA+0, 0x00);
while(1)
{/*判斷AD轉換狀態(tài)*/
status=sysInByte(BA+5);
if((status0x01)==0)
{
/*存儲A/D轉換結果*/
pBuf[1]=sysInByte(BA+0);
pBuf[2]=sysInByte(BA+1);

}
}
}
首先選擇一個輸入通道(通過ioctl選擇)并觸發(fā)A/D轉換,隨后查詢A/D轉換狀態(tài)信息直到A/D轉換過程結束,最終將轉換結果保存在pBuf[]數(shù)組中傳送到應用層,應用程序使用得到的數(shù)字量信息,至此,A/D驅(qū)動完畢。其中sysOutByte()和sysInByte()為VxWorks下對寄存器操作的標準函數(shù)。

2.3.2 D/A轉換驅(qū)動

與上述驅(qū)動實現(xiàn)過程類似,D/A轉換驅(qū)動是完成對adcWrite()函數(shù)的編寫,轉換過程是A/D轉換的逆過程,由于其不涉及查詢判斷,代碼相對簡化。D/A轉換驅(qū)動具體實現(xiàn)的核心代碼如下:

int adcWrite(int adcDevId, char *pBuf,int nBytes)
{…/*將數(shù)據(jù)寫入緩沖區(qū)*/
sysOutByte(BA+2, pBuf[2]);
sysOutByte(BA+1, pBuf[1]);

}

首先將應用程序中設定的待轉換數(shù)字量的低4位和高8位分別存放在pBuf[1]、pBuf[2]中,隨后依照先高后低的順序?qū)懭隓/A轉換緩沖區(qū)內(nèi),當?shù)臀粩?shù)據(jù)寫入完成后,硬件將自動開始更新D/A輸出的模擬量,至此,D/A驅(qū)動完畢。需要說明的是:D/A通道選擇是在應用程序中的編碼過程中實現(xiàn)的。

2.3.3 設備控制驅(qū)動

設備控制驅(qū)動用于完成A/D通道選擇,實現(xiàn)過程是對BA+3寄存器進行設置,當該寄存器高低位不同時,通道進行自動掃描,每當AD轉換完成時切換到下一個通道。以控制A/D對通道0至通道3循環(huán)掃描為例,具體代碼如下:

int adcIoctl(int adcDevId, int cmd, int arg)
{…/*CH30控制字控制通道0-3轉換*/
case CH30:
sysOutByte(BA+3, 0x30);

}

通過定義控制參數(shù)CH30,實現(xiàn)通道掃描的范圍為0、1、2、3、0、1、2、3……,利用該方法的好處是可以省去置通道的軟件操作時間,這個功能在高速多通道切換時起很關鍵作用,同樣可定義其他通道的控制參數(shù),如CH20、CH00等等。

3 應用及測試

為了驗證上面所設計的驅(qū)動系統(tǒng)的有效性,文章對其進行了詳細的實驗驗證。針對本系統(tǒng)而言,D/A能將電機轉速控制數(shù)字量轉換為相應的模擬電壓量輸出至電機,并且在控制電機運轉的同時,還能利用A/D將壓電陀螺敏感到的電機轉速所輸出的模擬電壓量轉換為數(shù)字量后并采集,以此證明驅(qū)動系統(tǒng)設計是成功的。下面詳細給出實際工程中用于測試驅(qū)動程序設計成功的應用程序。

3.1 應用程序設計

首先調(diào)用adcDrv()和adcDevCreat()初始化驅(qū)動并創(chuàng)建AD/DA設備;并通過fd=open('/adc',O_RDWR,0)操作打開設備。這樣,系統(tǒng)為AD/DA卡分配了一個文件描述符fd,通過讀寫該描述符操作即可完成相應AD/DA變換。

隨后發(fā)起兩個任務[7][8]:寫任務和讀任務,分別完成上述D/A與A/D的功能。兩個任務的核心代碼如下:
int Dac()
{…
pBuf[0]=xxx;
pBuf[1]=xxx;
t1=write(fd,pBuf[0],2);

}
int Adc()
{…
ioctl(fd,CH00,0);
t2=read(fd,pBuf[0],2);
LSB=pBuf[0];
MSB=pBuf[1];

}

3.2 測試結果

在WinShell下通過調(diào)用iosDevShow()函數(shù)可以看到,名為/adc的AD/DA卡設備已經(jīng)被VxWorks操作系統(tǒng)正確識別,如圖3所示。

測試分為兩個步驟來驗證A/D及D/A驅(qū)動的正確性:
步驟1:數(shù)字量→模擬量→電機轉速(D/A)
步驟2:電機轉速→模擬量→數(shù)字量(A/D)
步驟1控制電機加減速過程當中,給定的控制電機運轉的數(shù)字量如圖4中data1所示(其中:data1是通過16進制數(shù)轉換為10進制數(shù)實現(xiàn)的)。每隔0.5s對系統(tǒng)進行一次D/A轉換,得到電機實際轉速rate如圖5所示。



對比data1和rate,兩條曲線規(guī)律一致,說明D/A驅(qū)動功能正常。

隨后將圖5中的電機轉速作為輸入量,輸入到步驟2中進行實驗,以相同時間間隔對系統(tǒng)進行A/D采樣,轉換后的數(shù)字量如圖4中data2所示,對比data2和rate,兩條曲線規(guī)律一致,說明A/D驅(qū)動功能正常。

data1與data2兩條曲線基本重合,二者之間的誤差曲線error(data1-data2)如圖6。

由圖6可得:誤差最大值為3.2LSB,最小為2.1LSB。由此可見,AD/DA功能實現(xiàn)的同時精度完全符合要求(4LSB≥error≥2LSB)。實驗結果表明:驅(qū)動系統(tǒng)設計成功有效。

本文介紹了VxWorks下AD/DA驅(qū)動的開發(fā)過程,給出了驅(qū)動中的核心代碼。同時在對驅(qū)動程序進行測試的過程中說明了部分應用程序的設計。測試結果表明,所開發(fā)的驅(qū)動系統(tǒng)滿足實際需要(12位AD/DA轉換分辨率),可在實際工程中應用。限于篇幅本文未能給出全部代碼,但文中驅(qū)動程序的設計是完全依照VxWorks的標準I/O機制實現(xiàn)的,具有普遍的指導意義,可為VxWorks下其他字符型設備驅(qū)動開發(fā)提供參考。



評論


相關推薦

技術專區(qū)

關閉
×

报名截止时间 12月22日
Let's do--DIY 液体流量检测仪让喝水更有乐趣,快来报名吧!