您的位置 首页 编程

VxWorks下AD/DA驱动体系规划及测验

在分析了VxWorks实时操作系统设备驱动机制后,通过采用VxWorks I/O系统挂接应用层与底层的方式实现了VxWorks下对AD/DA设备的驱动。在重点介绍驱动中核心代码的同时,简要说明了应用层

相关于其他嵌入式操作体系,VxWorks以其高可靠性、微内核、可削减性以及高效的结实时使命调度、中止办理等长处,被广泛地运用在通讯、军事、航空、航天等高精尖技能和实时性要求极高的领域[1]。工程中实践运用的嵌入式体系一般包含以下几个部分:串口、并口、CAN总线和AD/DA等。关于前三种嵌入式硬件,VxWorks内核自身已供给了齐备的驱动支撑并给出了相应驱动的参阅例程,但现在还未包含对A/D及D/A设备的支撑;此外,因为相关技能资料的保密性,相应驱动规划的参阅文献也较少。因而,本文结合实践体系需求(运用12位D/A输出可调模仿量操控电机转速,运用12位A/D对压电陀螺所灵敏的电机转速进行数据收集),对AD/DA设备的驱动进行了相关研讨,研讨成果具有实践工程运用价值。

本文在扼要剖析了VxWorks I/O体系及设备驱动根底之上,将A/D与D/A两者整合为一个完好的字符设备挂接到VxWorks的I/O体系中,成功完结了该设备的硬件驱动并附上对应的中心驱动代码,最终在驱动程序测验进程中扼要阐明晰运用层软件的规划办法,为工程运用供给了完善的解决办法。

1 VxWorks I/O体系与设备驱动

了解和把握VxWorks的I/O体系及设备的驱动结构,是成功规划AD/DA设备驱动的条件和根底。具体来说:VxWorks是一个层次化清楚的操作体系,每层各负其责,层与层之间又严密相连。一般所说的驱动程序归于底层的领域,而用户的运用程序则归于上层,坐落这两层之间的是中间层,无需用户开发,由VxWorks进行保护和办理。这样,操作体系把各层有机地衔接在一起,使代码紧凑而高效。VxWorks的I/O体系正是这样的中间层,以本文所要研讨的AD/DA驱动体系规划为例,图1具体介绍了三者的联系。

图1中的最底层便是所要编写的设备驱动程序,包含对具体硬件的初始化和各种操作,以及与上层I/O体系的接口;中间层为I/O体系层,VxWorks的I/O体系不光向上供给了7个根本的I/O接口,以供运用程序调用,并且还向下供给与各种设备驱动程序的接口;最顶层为运用层,用户依据实践运用需求编写运用程序,并经过运用程序向下调用I/O体系。与UNIX相似,VxWorks一切的I/O设备都被当作文件来存取。关于VxWorks I/O体系驱动机制的更多内容请参阅文献[2][3]。

  针对体系需求,挑选7个根本I/O接口函数中的open()、read()、write()以及ioctl()进行驱动体系规划,各层函数与相应完结的功用对应联系如表1所示。

此外,D/A输出通道在运用程序中挑选,下面给出AD/DA驱动体系的具体规划进程。

2 AD/DA驱动体系规划

2.1 驱动体系开发环境

与其他嵌入式体系开发相似,VxWorks也选用主机-方针机方式[4],如图2所示。

硬件平台中主机运用CPU为迅驰的PC机,工作VxWorks开发环境Tornado2.2;方针机按照体系运用要求选用根据PC104 总线的嵌入式CPU卡MSMP586SEV,该CPU是VxWorks所支撑的Intel x86系列CPU。VxWorks自带的板级支撑包(BSP)支撑该CPU,使得在驱动开发进程中无须过多考虑CPU部分的代码设置。外扩AD/DA选用的相同是PC104总线的数据转化卡ADT-650。开发调试进程中,主机经过网络办法下载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(可依据实践情况挑选),其他各寄存器选用偏移地址拜访的办法。为便于后续阐明,扼要将卡上其他寄存器地址及功用列于表2。

在传统非嵌入式实时操作体系(比方DOS)下运用该卡,实践上是在运用程序中对板卡进行初始化和设置相应功用寄存器以完结硬件功用。但由前面临VxWorks的I/O体系和设备驱动结构剖析可知,该部分作业在VxWorks操作体系下由底层硬件驱动完结,运用程序中经过调用相应I/O接口函数来完结硬件功用,由此完结分层结构以到达阻隔硬件的意图。因而,AD/DA驱动的开发便是按照I/O体系传递过来的运用层各调用接口函数完结对相应寄存器的不同设置。

2.3 AD/DA驱动程序完结

AD/DA驱动的完结办法主要是完结以下6个函数的编写:

设备驱动程序装置函数adcDrv();设备创立函数adcDevCreate();设备翻开函数adcOpen();设备读函数(A/D转化) adcRead();设备写函数(D/A转化)adcWrite();I/O操控函数adIoctl()。

其间前三个函数的规划与具体硬件相关较少,与VxWorks下其他字符型设备驱动开发根本相似,不做过多介绍,仅需按照规范代码方式编写即可,具体具体代码可见参阅文献[6]。下面具体介绍A/D转化驱动、D/A转化驱动以及设备操控驱动等部分的程序规划,给出中心代码。

2.3.1 A/D转化驱动

A/D转化驱动实践是完结adcRead()函数的编写,在该函数编写之前,首要应清晰A/D转化驱动完结进程:当运用程序调用read()函数时,VxWorks的I/O体系将调用底层驱动adcRead()函数,该函数随即按照程序设定对表2所列卡上各相关寄存器进行设置来完结A/D转化的硬件功用,然后完结底层驱动。

A/D转化驱动具体完结的中心代码如下(伪指令为代码阐明,以下同):

int adcRead(int adcDevId,char *pBuf,int nBytes)
{…/*触发AD转化*/
sysOutByte(BA+0, 0x00);
while(1)
{/*判别AD转化状况*/
status=sysInByte(BA+5);
if((status0x01)==0)
{
/*存储A/D转化成果*/
pBuf[1]=sysInByte(BA+0);
pBuf[2]=sysInByte(BA+1);

}
}
}
首要挑选一个输入通道(经过ioctl挑选)并触发A/D转化,随后查询A/D转化状况信息直到A/D转化进程结束,最终将转化成果保存在pBuf[]数组中传送到运用层,运用程序运用得到的数字量信息,至此,A/D驱动结束。其间sysOutByte()和sysInByte()为VxWorks下对寄存器操作的规范函数。

2.3.2 D/A转化驱动

与上述驱动完结进程相似,D/A转化驱动是完结对adcWrite()函数的编写,转化进程是A/D转化的逆进程,因为其不触及查询判别,代码相对简化。D/A转化驱动具体完结的中心代码如下:

int adcWrite(int adcDevId, char *pBuf,int nBytes)
{…/*将数据写入缓冲区*/
sysOutByte(BA+2, pBuf[2]);
sysOutByte(BA+1, pBuf[1]);

}

首要将运用程序中设定的待转化数字量的低4位和高8位别离存放在pBuf[1]、pBuf[2]中,随后按照先高后低的次序写入D/A转化缓冲区内,当低位数据写入完结后,硬件将主动开端更新D/A输出的模仿量,至此,D/A驱动结束。需求阐明的是:D/A通道挑选是在运用程序中的编码进程中完结的。

2.3.3 设备操控驱动

设备操控驱动用于完结A/D通道挑选,完结进程是对BA+3寄存器进行设置,当该寄存器高低位不一起,通道进行主动扫描,每逢AD转化完结时切换到下一个通道。以操控A/D对通道0至通道3循环扫描为例,具体代码如下:

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

}

经过界说操控参数CH30,完结通道扫描的规模为0、1、2、3、0、1、2、3……,运用该办法的优点是能够省去置通道的软件操作时刻,这个功用在高速多通道切换时起很关键作用,相同可界说其他通道的操控参数,如CH20、CH00等等。

3 运用及测验

为了验证上面所规划的驱动体系的有用性,文章对其进行了具体的试验验证。针对本体系而言,D/A能将电机转速操控数字量转化为相应的模仿电压量输出至电机,并且在操控电机工作的一起,还能运用A/D将压电陀螺灵敏到的电机转速所输出的模仿电压量转化为数字量后并收集,以此证明驱动体系规划是成功的。下面具体给出实践工程中用于测验驱动程序规划成功的运用程序。

3.1 运用程序规划

首要调用adcDrv()和adcDevCreat()初始化驱动并创立AD/DA设备;并经过fd=open(‘/adc’,O_RDWR,0)操作翻开设备。这样,体系为AD/DA卡分配了一个文件描述符fd,经过读写该描述符操作即可完结相应AD/DA改换。

随后建议两个使命[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下经过调用iosDevShow()函数能够看到,名为/adc的AD/DA卡设备现已被VxWorks操作体系正确辨认,如图3所示。

测验分为两个进程来验证A/D及D/A驱动的正确性:
进程1:数字量→模仿量→电机转速(D/A)
进程2:电机转速→模仿量→数字量(A/D)
进程1操控电机加减速进程傍边,给定的操控电机工作的数字量如图4中data1所示(其间:data1是经过16进制数转化为10进制数完结的)。每隔0.5s对体系进行一次D/A转化,得到电机实践转速rate如图5所示。

比照data1和rate,两条曲线规则共同,阐明D/A驱动功用正常。

随后将图5中的电机转速作为输入量,输入到进程2中进行试验,以相一起间距离对体系进行A/D采样,转化后的数字量如图4中data2所示,比照data2和rate,两条曲线规则共同,阐明A/D驱动功用正常。

data1与data2两条曲线根本重合,二者之间的差错曲线error(data1-data2)如图6。

由图6可得:差错最大值为3.2LSB,最小为2.1LSB。由此可见,AD/DA功用完结的一起精度彻底符合要求(4LSB≥error≥2LSB)。试验成果表明:驱动体系规划成功有用。

本文介绍了VxWorks下AD/DA驱动的开发进程,给出了驱动中的中心代码。一起在对驱动程序进行测验的进程中阐明晰部分运用程序的规划。测验成果表明,所开发的驱动体系满意实践需求(12位AD/DA转化分辨率),可在实践工程中运用。限于篇幅本文未能给出悉数代码,但文中驱动程序的规划是彻底按照VxWorks的规范I/O机制完结的,具有遍及的指导意义,可为VxWorks下其他字符型设备驱动开发供给参阅。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/biancheng/198741.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部