APP下载

基于CH365的PCI总线运动控制卡的设计

2012-01-18黄子牛

电子设计工程 2012年24期
关键词:服务程序控制卡板卡

李 飞,黄子牛

(石家庄机械化步兵学院 河北 石家庄 050083)

运动控制卡与PC机的接口主要有ISA总线和PCI总线两种方式,由于ISA总线已基本被PC机所淘汰,而PCI总线则以其速度快、性能优等特点成为主流接口规范[1],因此目前运动控制卡多基于PCI总线设计。

实现PCI接口的方法主要有两种:一是使用复杂可编程逻辑器件或现场可编程门阵列(如CPLD或FPGA),二是使用专用电路(如PCI9052或CH365),采用第一种方法尽管灵活性高且性能好,但成本较高;而第二种方法采用专用电路,虽然灵活性差,但性能尚可,成本较低,并且开发周期较短,能够满足科研开发的一般场合,因此本设计选用第二种方案。

1 运动控制卡的工作原理

1.1 组成框图

PCI接口芯片选用南京沁恒公司推出的CH365,该器件完全符合PCI接口规范[2]。图1为设计的运动控制卡的功能框图,定时中断设为4 ms,依据PCI总线上送来的数据,在每个中断周期内由定时计数器输出一定数量的方波信号,控制伺服电机单轴或四轴的摆动频率,实现对内燃机的拖动;同时,该卡还对光电编码器的反馈脉冲进行计数,以实现对伺服电机的闭环控制。伺服电机光电编码器反馈信号经过高速光耦隔离后输入GAL进行四倍频处理,以提高反馈信号分辨率。

图1 运动控制卡框图Fig.1 Block diagram of motion control card

图2 为部分原理图,定时计数器U1、U2负责对输入轴反馈脉冲计数,以判断电机实际运行位置,U3、U4则对工作频率进行分频,在每一中断周期输出程序中设定频率的方波,从而控制电机的摆动频率,定时中断信号由U4的定时器2产生,中断信号与PCI总线的IRQ7相连,每一中断周期为4 ms。

图2 计数与分频部分Fig.2 Count and frequency divider

为提高信号抗干扰能力,定时计数器输出脉冲应经过差分处理,以“脉冲/方向”形式向伺服电机发出指令,设计中采用DS26C31对输出信号进行差分发送;光电编码器的反馈信号体现伺服电机的实际摆动频率,对此信号除需差分处理外,还应进行整形、滤波等处理,以提高定时计数器对输入信号的计数精度[3-4],设计中采用DS26C32对输入信号进行差分接收。

1.2 性能特点

图3为研制的PCI总线运动控制卡,可实现四轴及单轴控制,每轴高达4 MPPS脉冲输出、1 MHz编码器输入,该运动控制卡还具有以下特点:

1)实现基于32位PCI总线的从设备接口。

2)可设定PCI板卡的设备标示。

3)自动分配I/O基址,支持长度达240字节的I/O端口。

4)支持本地硬件定址功能,自由选择I/O地址,在指定地址实现I/O端口。

5)转换为主动并行接口:8位数据、16位地址、I/O读写。

6)4个16位定时/计数器。

7)脉冲输出形式为上下或脉冲/方向。

8)通用的 Windows98/ME/2000/XP驱动程序,通过 DLL提供应用层API。

图3 PCI总线运动控制卡Fig.3 Motion control card based on PCI bus

2 驱动程序的编写

在使用PCI板卡之前,需要查找板卡并获取其配置信息。计算机BIOS已经为PCI设备设定了合适的工作环境,而我们编写程序的目的是为了使用此工作环境。

PCI设备有3个空间——内存地址空间、IO地址空间和配置空间。由于PCI支持即插即用,所以PCI设备不是占用固定的内存地址空间或I/O地址空间,而是可以由操作系统决定其映射的基址,这也就是配置空间的作用。

用于PCI板卡转换的CH365芯片同时提供了基于DOS的开源驱动函数库(包括 Ch365dos.c和 Ch365dos.h)和基于Windows的驱动程序及动态链接库[5]。在 DOS系统和Windows 9X系统下编写PCI板卡程序时,可以直接调用Ch365dos.c中的函数,实现对设备的驱动和控制。

2.1 初始化设备

调用Ch365dos.c中的CH365CheckDevice函数,检查PCI设备是否存在,CH365CheckDevice内部使用int86函数,调用DOS的1AH中断,即PCI BIOS中断,输入寄存器AH为固定值B1H,AL为02H时表示判断指定设备是否存在。

printf( “Check PCI Device...” );

mPciAddr=CH365CheckDevice( );

if(mPciAddr==0)

{

printf(“Failed. ”);

return-1;

}

printf(“OK. ”);

2.2 获取设备ID和厂商ID

获取PCI设备标识和厂商标识,这两个十六进制数代表此板卡区别于其他类型设备的唯一标志。CH365ReadCfgWord内部使用int86函数,调用DOS的1AH中断,输入寄存器AH为固定值B1H,AL为08H时表示读取PCI设备配置空间的信息。配置空间中最重要的有:

Vendor ID:厂商ID。用来判断PCI设备是否存在。

Device ID:设备ID。操作系统依据 Vendor ID和Device ID找到对应的驱动程序。

Class Code:类代码。共三字节,分别是类代码、子类代码、编程接口。类代码不仅用于区分设备类型,还是编程接口的规范。

IRQLine:IRQ编号。支持管理24个中断源。

IRQ Pin:中断引脚。PCI有4个中断引脚,该寄存器表明该设备连接的是哪个引脚。

以下代码用于读取PCI配置空间中的设备标识和厂商标识:

mCfgID=CH365ReadCfgWord(0x00);

printf(“Vender ID:%04X. ”, mCfgID);

mCfgID=CH365ReadCfgWord(0x02);

printf(“Device ID:%04X. ”, mCfgID);

2.3 配置IO地址

查找设备IO端口地址,获取设备IO端口的基地址之后,可通过指定偏移地址的方法,向板卡相应的端口输入或读取数据。注意此处被注释的函数CH365SetIoBaseAddr,在DOS系统下可以使用此函数自行指定一个IO基地址,但是Windows系统通常为硬件预设了IO基地址,用户强制指定的地址往往起不到效果。

CH365GetIoBaseAddr内部使用int86函数,调用了DOS的1AH中断,输入寄存器AH为固定值B1H,AL为07H~09H时 分 别表 示 按 字 节 (BYTE), 字 (WORD) 和 双 字(DWORD)读取PCI设备配置空间的信息。

//CH365SetIoBaseAddr((mPCH365_IO_REG)0x200);

mIoBase=CH365GetIoBaseAddr();

iIoBase= (unsigned int)mIoBase;

printf( "IOBase Addr:%04X. ", iIoBase );

2.4 设定硬件中断

检查和设定硬件中断,使用函数CH365SetIntLine和CH365GetIntLine指定或读取系统中保存的板卡中断号。CH365SetIntLine内部使用int86函数,调用DOS的1AH中断,输入寄存器AH为固定值B1H,AL为0BH~0DH时分别表示按字节(BYTE),字(WORD)和双字(DWORD)写入到PCI设备配置空间。

注意此处被注释的宏mCH365_INT_LINE_AUTO,它表示程序将使用缺省的中断号。在DOS和Windows 9x环境中,也允许用户自行指定中断号,如下的代码强行指定中断号为7。

printf( “Set Interrput Line...” );

if(CH365SetIntLine(7/*mCH365_INT_LINE_AUTO*/)==FALSE)

{

mIntLine= -1;

printf( “Failed. ” );

}

else

{

printf( “OK. ” );

mIntLine=CH365GetIntLine();

}

printf( "Interrupt Line:%X. ", mIntLine);

3 中断的控制

中断服务程序是具有特定格式的函数,为保证运动控制卡的正常工作,中断服务子程序的编写必不可少。

3.1 初始化中断服务程序

查找并设定设备中断号,指定相应中断服务程序,系统在收到设备的中断信号时自动执行此函数的内容,如果不指定中断服务程序,那么中断将不会产生任何效果。

作为PCI板卡的前端设备,CH365控制中断信号的发送,在执行中断之前,应对mCh365IoCtrl发送控制字进行清零,否则可能无法开启中断。

mChipIoCtrl=inportb ( (USHORT) &mIoBase ->mCh365IoCtrl);

outportb ( (USHORT) &mIoBase ->mCh365IoCtrl,mChipIoCtrl&0xfb);

3.2 开启中断

在DOS下,应向计算机系统申请打开中断。此处假设中断采用屏蔽中断(INTR)的方式。PC机上的8088INTR中断请求线与8259A中断控制器的INT相连,而8259A有8个输入端,可连8个外设,8259A接收来自外设的中断请求信号,并把中断源的类型号送给CPU[6]。从外设的中断请求到CPU响应中断有两个控制条件起决定作用:

第一个条件,该外设中断请求是否屏蔽,对于8259A中断屏蔽寄存器IMR(口地址为21H)的某一位,若为0,则表示允许中断;为1,该外设的中断请求被屏蔽。

第二个条件,CPU是否允许中断,即标志寄存器中IF是否等于1,若IF=0,CPU禁止中断;IF=1,允许CPU响应中断。

由此编写代码如下:

outportb(0x20, 0x20);

outportb(0x21, inportb(0x21) &0x7f); //IRQ7

此外,还应当注意PCI卡是如何产生中断脉冲的,如果需要用户向指定IO地址执行输入才能够触发中断,那么还需要编写相应的板卡触发代码。

3.3 执行中断

运行时系统将根据中断周期自动进入中断服务程序,中断服务程序中必要的工作有:

检查中断信号是否来自此设备,因为其他的PCI设备可能产生同样的中断信号。

mChipIoCtrl=inportb ( (USHORT) &mIoBase ->mCh365IoCtrl);

if(mChipIoCtrl&0x04) ……

此次中断执行完成之后,应编写退出代码,必要的退出代码包括CH365控制位清零,以及向系统申请退出中断服务程序。注意,如果缺少退出语句,或者中断服务程序中用户要执行的工作太多,则可能造成中断套叠以至计算机死锁。

outportb ( (USHORT) &mIoBase ->mCh365IoCtrl,mChipIoCtrl& ~0x04 );

if(mIntLine>=8)

{

outportb(0xa0,0x20 );

if(inportb(0xa0)==0)outportb(0x20,0x20);

}

else outportb(0x20,0x20 );

之后向计算机系统发出申请,退出中断,也可以同时指定中断服务程序为NULL。

outportb(0x21, inportb(0x21) |0x80);

4 结束语

运用国产芯片CH365,设计开发了一块PCI总线的运动控制卡,并编写了配套的驱动程序,经实际测试,伺服电机选用日本信浓公司的交流伺服电机,型号为5CB06-1SE,驱动器选用其配套的HO 10AB CB 600C 17 F型数字式交流伺服驱动器,可进行步进式及脉冲式伺服电机控制,并能充分发挥电机性能,方便地实现运动控制。

[1]阮毅,陈维钧.运动控制系统[M].北京:清华大学出版社,2006.

[2]南京沁恒电子有限公司.PCI总线接口芯片CH365[EB/OL].(2005-12-21) http://wch.cn/download/list.asp?id=10.

[3]覃琴.基于FPGA的PCI接口运动控制卡的研究 [D].成都:四川大学,2006.

[4]林剑豪.基于CH365型接口和MCX314As型运动控制器的PCI总线运动控制卡设计[J].电子设计工程,2005(12):22-26.LIN Jian-hao.Designing of PCI bus motion controlling card based on CH365 and MCX314As[J].Electronic Design Engineering,2005(12):22-26.

[5]游林儒,庞永鹏,谭子瑜.基于PCI总线的四轴运动控制卡的研制[J].微计算机信息,2007,31(21):12-14.YOU Lin-ru,PANG Yong-peng,TAN Zi-yu.Research and design of 4-Aexs motion controller based on PCI bus[J].Microcomputer Information,2007,31(21):12-14.

[6]马忠梅.单片机的C语言应用程序设计[M].3版.北京:北京航空航天大学出版社,2005.

猜你喜欢

服务程序控制卡板卡
兼容多种运动控制卡的V割机数控系统关键技术*
SylixOS系统的中断嵌套机制研究与实现
基于C#的进程守护程序的设计
UDP穿透NAT技术实现数据唤醒车联网T-Box设备的方案
三轴机械手控制器设计
基于PCI9054的多总线通信板卡的研制
基于FPGA的多通道模拟量采集/输出PCI板卡的研制
基于运动控制卡的桁架机器人控制系统设计
一种基于光纤数据传输的多板卡软件程序烧写技术
水利工程施工监理服务程序及质量控制