西安航空技术高等专科学校2012届毕业设计说明书
局部空间1范围寄存器的值为OxFFFFFFF1,表示I/O空间大小为16字节,bit0为1表示此空间被映射为I/O空间。
局部空间1基地址寄存器的值为0x00000201,表示空间1的基地址0x200。bit0为1表示空间1使能。
局部空间1描述寄存器的值为0x00400022,其中bit[23:22]为01表明局部空间1的数据总线宽度为16位。在ISA模式中,局部空间1必须映射为I/O空间,局部空间0必须映射为内存空间。
局部片选寄存器1的值是0x00000109,表示局部地址落在0x200-0x210之间时,片选有效。在ISA模式下,虽然不存在片选信号1,但我们必须设置它,使它的值与局部空间1的基地址和范围相匹配,否则局部空间也就无法响应PC I的I/O控制指令了
地址 00H 04H 08H 0CH 10H 14H 18H 1CH 2CH 3CH 设备ID和生产商ID 状态和命令 类别码和版本ID BIST、头域类型、延迟计时器、Cache行大小 配置寄存器内存映射的PCI基址0 配置寄存器I/O映射的PCI基址1 局部空间0的PCI基址2 局部空间0的PCI基址3 子系统ID、字系统生产商ID Max_Lat、Min_Gnt、中段引脚、中断线 表4.2 PCI总线配置寄存器 中断控制状态寄存器的值为0x00001000 ,表示不使用中断,其中bit12为1
表示ISA模式使能,如果不设置bit12为1,那么9052就会工作在C模式而造成错误。
地址 00H 04H 14H 18H 28H 2CH 3CH 40H 4CH 50H 局部地址空间0的范围寄存器 局部地址空间1的范围寄存器 局部地址空间0的基址寄存器 局部地址空间1的基址寄存器 局部地址空间0的总线定义寄存器 局部地址空间1的总线定义寄存器 片选0基址寄存器 片选1基址寄存器 中断控制/状态寄存器 控制寄存器 9052内部提供了两种配置寄存器:PCI配置寄存器(表4.2)和局部空间配置寄存器(表4.3)。PCI配置寄存器有6个基地址寄存器,局部配置寄存器有4个基地址寄存器。PCI基地址是在系统上电时由BIOS 根据设备配置信息而分给设备在系统中的物理地址,我们在设计硬件电路和编写EEPROM时不用理会。其中PCI基地址0和基地址1分别是以内存方式和I /O方
表4.3 局部总线配置寄存器
式来访问局部配置寄存器所分配的基地址,PCI基地址2和基地址3分别映射到局部基地址0和局部基地址1。编写驱动程序时通过调用PCI基地址2或基
18
西安航空技术高等专科学校2012届毕业设计说明书
地址3的值得到板卡在微机系统中的真实基地址。因此,9052其实就相当于一个桥,在PCI总线和局部总线之间起到一个翻译的作用。在本设计中,对局部空间1进行I/O操作,局部基地址寄存器1的值为0x201,表示空间1的基地址0x200,局部片选寄存器1的值是0x00000209表示局部地址范围为0x200~Ox20F,共16字节。假设现在板卡实际基地址的值为PCIBAR3,那么当PCI端访问地址PCIBAR3+Offset (Offset为偏移量)时,若0 < Offsets<16,那么ISA端的地址总线上出现的值就会为0x200+Offset,且IORD或IOWR信号也会产生,如图3所示;如果Offset不在这个范围之内,那么地址就会落在局部片选寄存器1所设置的有效片选范囚之外,因而局部端也就不会响应。
PCI空间 PCIBAR3+0
PCIBAR3+1 ISA空间 0x200 0x201 图4.4 ISA端的地址与PCI端的
地址一一映射(0≤offset≤16) Figure 4.4 ISA and PCI-side of the address Address mapping (0 ≤ offset ≤ 16)
PCIBAR3+1 5 0x20F 由于存在这种一一映射的关系,ISA总线的地址空间要映射到I/O空间。为从PCI总线配置寄存器中获得主机动态分配的映射基址,并对映射端口进行读写,必须编写驱动程序。但是由于驱动在本设计中已经准备好了,我们在后边的文中对于主机统一分配的基地址统一用PCIBAR3=000C400H表示,用以这个基地址加上个偏移量,调用编程语言指令对端口进行读写。
对于我们设计的总线接口卡在ISA空间的口地址范围为0x200~0x20F即一般板卡的游戏接口。通过对各个端口的分配如下:
采集子函数读入地址为0x202和0x203。所以偏移量分别为offset=02H,offset=03H。所以端口的地址为000C402H和000C403H。
输出数据将占用0x201,偏移量为offset=01H。所以端口的地址为000C401H 2. I/O接口的输入输出指令函数
在PC机中,有多种语言支持端口的读写操作。我们针对C语言进行详细说明。因为这些函数已经存在于C语言库中,省略了设计者自己开发的麻烦。TurboC提供了专门对I/O接口进行输入输出操作的几个函数:
int inp(int portid) int inport(int portid) int inportb(int portid)
int outp(int portid ,int value)
19
西安航空技术高等专科学校2012届毕业设计说明书
int outport(int portid ,int value) int outportb(int portid ,int value) 这些函数的原型在dos.h中。 (1)接口输入函数 int inp(int portid) int inport(int portid)
import函数从指定的接口地址portid中读取一个字,而inportb则从指定的接口中读取一个字节。 1. 接口输出函数
int outp(int portid ,int value) int outport(int portid ,int value) int outportb(int portid ,int value)
outport函数把一个16位二进制数发送到口地址坡人提到的接口中去。outportb函数是将一个字节的数value送到口地址为portid的接口去。
4.1.3 随动系统C程序功能要求及实现
本系统作为一个数字控制的随动系统,需要有计算机对整个过程进行数据采集及监控,因此除了模拟电路的调节及PCI总线几口电路的硬件支持外,也需要软件对硬件各个方面的工作给予支持及协调。在整个控制过程中所有的系统参数、位置给定量输入,控制规律的软件实现,通过I/O端口地址向外部模拟调剂电路的控制输出量的输出及模拟电路的位置反馈量的采集,整个调节过程参数及波形的处理、显示等都得由C语言来实现。就本系统而言,其软件功能的整体实现应如附录2流程图所示。下面就此流程图的主要过程进行解释。对各主要自函数作专门分析。
大家都已经知道本系统的工作的首先从接收有数字计算键盘给出的各项系统参数开始,系统参数包裹系统比例放大倍数Kp,积分系数Ki,微分系数kd及位置给定Pn。
在定各个头文件、各全局变量声明及赋初值、打开个将要使用的数据文件、接受各个参数及给定量后,程序即开始第一次调用采集自函数,采集光电编码器送回的执行电机当前位置量,然后和给定位置两相比较,求出首个偏差值en。将此偏差值送捷径跟随子函数,将其在保证执行电机旋转角度在-180。 和180。之间的前提下转换,再将转换出的本次偏差值赋给钱一次误差变量en1。
延时一段时间后,重复以上各步再次采集、计算、转换得到本次偏差,调用PID运算子函数,算出控制输出量,经过范围校正后调用控制量输处子程序,对外部模拟调剂电路输出控制电压,并向数据文件输出调节过程参数。将本次偏差再赋予上次偏差en1,利用time()函数取当前系统时间。
20
西安航空技术高等专科学校2012届毕业设计说明书
再调用延时子程序延时一段时间,重复各步骤,输出控制电压,调节过程参数后再次去当前系统时间,利用difftime()函数求出两次系统时间的间隔,判断其是否小于3秒,如果小于3秒,则调转循环执行此段程序;否则停止执行调节过程,向另一数据文件输出一标志位,以备VB程序执行时调用,调用调剂过程超调量显示子程序显示整个调剂过程的超调情况,调用过程子程序显示调节过程调节波形。令执行电机停止,调节过程结束。
在本系统的C语言程序中利用了多个功能子函数。对各功能子函数进行详细的分析对于全面地理解整个随动控制软件是非常有必要的。 1. 执行电机位置采集子函数
采集子函数是本系统子函数中两个与外部交换数据的重要子函数之一。欲比较精确的调节数字随动系统,有比较准确的位置反馈量是非常比要的。如何准确的采回光电编码器送出的位置反馈量呢?前文已经对地址空间作了详细的说明,所以采集自函数使用的杜如地址为0x402和0x403。虽然74LS373仅锁存了2条数据线上的数据,但仍以8位的形式通过总线送回内存,因此本子函数使用前面介绍过得intputb()函数将此8为数据功过口地址为0x402的端口采回,然后与0x0C0相与取其高两位。将第二片74LS373锁存的7位数据以8位形式经0x403取回,与0x7f相与取其低七位。光电编码器采集的9位反馈量取齐后。将通过0x403取回的数据左移8位后和通过0x402取回的数据相加。然后再右移6位去掉其原有相与留下的6个0。这样就形成了9位位置反馈量。 2. 系统捷径跟踪子函数
本系统数字控制的优点在于它能实现位置上的捷径跟踪。这就是说,不管你输入的位置给定量与当前位置的偏差多大,系统总能控制旋转角度在-180。 和180。之间即达到指定位置。其程序实现如下:判断得到偏差值en,如果0 本系统是采集频率为5KHz的光电编码器进行数据采集的,而系统所用的主控计算机是计算速度达到几百兆次。因此出现了一个问题那就是当光电编码器采集一次外部数据时,微机已经执行了数据操作上万次了,以至于发生同一个数据被采集了许多次的现象,影响了系统的调节,扩大了系统处理的数据量,所以有必要增加一个延时子函数,让计算机执行与光电编码器采回数据量相应次数的端口操作。 4. 描绘波形子函数 为更形象、更直观地了解本系统的动态调节过程,本系统还未用户开发了波形帽徽子程序。现在普遍使用的TC2.0版本支持丰富的图形库函数,利用他们我 21 西安航空技术高等专科学校2012届毕业设计说明书 们可以方便的显示借口系统中获得的数据序列和分析结果。在本系统中继将采回的位置反馈数据至于数组S[200],因此我们自诩将此数组中的数据序列以曲线形式描绘出来就可以了。本函数中,我们使用了VGA的640*480分辨率的图形显示模式,像素的左上角(0,0)至右下角(639,479)。以clearviewport()函数清屏后利用矩形函数rectangle()在左上角(20,40),右下角(620,440)范围内开辟一个视图区,用于显示波形,试图的背景色和线条分别用setbkcolor()和setcolor()设定,线形由setlinestyle()函数确定。波形图的横坐标是画在XIAS=240处的一处横线,纵坐标一左边框代替。综合坐标各处均标出T(执行时间)、β(旋转角度值)。坐标的正负方向均有PIX=200个像素,由于执行电机的旋转角度范围为-180度到+180度之间,即-256—+255,因此用200.0/256.0将数据归为一化为[-200,200]范围内。各值点用函数lineto()连接起来形成连续曲线。在给定波形和反馈波形除分别标出Pn和Yn。本函数的优点在于可以通过接受键盘字符输入惊醒反馈波形的动态显示,且可通过改变dx值对波形进行压缩或展开。 22