数控系统设计综合实践 一、系统硬件电路设计 系统硬件电路设计的主要内容包括 CPU 的选型、1/0 口以及存储器的扩展电路、键盘-显示电路、开关量的输入/输出电路、步进电机驱动电路以及抗干扰电路等设计,本章就这些内容展开研究、讨论。图 3.1 为数控系统总体设计框图。 从图中可以看出,系统选用ATMEL公司生产的8位单片机AT89S52作为控制核心考虑到数控系统程序代码存储量比较大,扩展了一片 EPROM 芯片27512 用做程序存储器:AT89S52芯片内只有 256KB 的数据存储器(RAM,而一般数控系统需要存储的数据较多,必须外接数据存储器芯片进行适当扩展,故扩展一片 SRAM 芯片6264 数据存储器,用来存放用户程序:键盘输入电路采用一片 8279 芯片来管理;扩展一片 8255 可编程接口芯片作为并行 O 口,步进电机、切削液泵电机等控制信号都经 8255 输出,些进/出的信号均做了隔离放大处理:系统采用 LCD 显示,LCD的控制器选用 1602芯片。 系统硬件结构确定之后,如何实现系统硬件具体结构,如何实现各种功能模块电路成为硬件设计的核心内容。实现同样的功能,采用不同的电路和模式,其效果并不是完全相同。以下对本平台中的各个单元模块予以介绍。 1.CPU及存储器的扩展设计 1.1 数据存储扩展 在机电一体化设备的专用控制系统中,数据存储器通常选用静态 RAM(SRAM)。因为在使用SRAM时,无需考虑刷新问题,且与 CPU 的接口较简单。常用的 SRAM 芯片主要有6116(2KX8位)、6264(8KX8位)、62256(32KX8位)、628128(128KX8位)等。本次设计中选用 6264 芯片,其中,Ai 是地址线;I/i 是双向数据线;/CE 或/CS 是片选线;/0E是数据读出选通线,通常与 CPU 芯片的/RD引脚相连:/WE 是数据写入选通线,一般与CPU的/WR引脚连接;VCC是工作电源,通常要求4.5V-5V。 数据存储器的扩展与程序存储器的扩展,在地址线的处理上是相同的,所不同的是除读选通信号各异之外,尚需考虑写选通的控制问题。 6264 芯片有一个片选/CS1,今用“3-8”译码器输出引脚 CSO 来选通它;8 根数据线I/07-I/00 直接挂在CPU的PO口;13根地址线A12-A0分为高5位和低8位,其中高5位与CPU的P2.4-P2.0引脚相连,低8位与地址锁存器74LS373 的输出端相连:数据读允许引脚/0E与CPU的/RD连接;数据写允许引脚/WE 与CPU的WR连接可以算出6264的地址范围是:0000H-FFFH。 在很多应用场合,要求 SRAM 芯片内部的数据在掉电后不丢失,这时就需要增加掉电保护电路。SRAM属CMOS 芯片,静态电流小,正常运行时由电源对其供电,而在掉电状态下,由小型蓄电池对其供电,连续掉电后,蓄电池可维持数据 3-5 个月不丢失。 1.2 CPU的选择 AT89S52是一种低功耗、高性能CMOS的8位微控制器,具有8K 在系统可编程Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业 80C51产品指令和引存储空间,如果不需要这一空间,可将其/EA 引脚接地:如果需要使用这部分空间,/EA引脚必须接高电平,且片外扩展的 EPROM 地址应从2000H开始。 AT89S52单片机的 PO 口是分时复用的地址/数据总线,而且与 I/0 口线复用,为了将地址总线与数据总线分离出来,以便同片外的电路正确连接,需要在单片机外部增加地址锁存器,构成片外三总线结构,一般常用锁存器74LS373。 74LS373有直通、高阻、锁存3个状态。通过锁存信号输入端G和输出允许控制信号输入端/0E 组合,可实现上述3个状态。当三态门的/0E=0 且 G=1时,三态门处于直通状态,允许 1Q-8Q 输出到 Q0-Q7;当/0E 为高电平时,输出三态门断开,输出线 Q0-Q7处于高阻状态:当/0E=0且G 端出现下降沿时,为锁存状态。74LS373 作为地址锁存器时,首先应使三态门的使能信号/0E 为低电平,这时,当G输入为高电平时,锁存器直通状态,此时输出端Q0-Q7 状态和输入端 DO-D7 状态相同;当G端从高电平到低电平(下降沿)时,输入端1D-8D的数据锁入 10-8Q的8位锁存器,为锁存状。它的锁存控制端G直接与单片机的锁存控制信号 ALE 相连,ALE 下降沿进行低8 位地址锁存,直到下一次 ALE 变高,地址才发生变化。 74LS138是一个广泛应用的地址译码器,3位输入A BC对应8位反向输出YO-Y78选1,即YO-Y7 有一个输出为低电平有效,作片选。 2.键盘电路和LCD显示电路设计 键盘-显示功能是数控系统中的一个很关键的部分,它能实现向系统输入数据、传达命令和显示工作状况等,是人工干预的主要依据和手段。 2.1键盘电路 键盘主要有独立式和矩阵式。前者一个按键接一个输入线,输入口浪费很大,用于按键数量较少的场合:后者多用按键较多的场合,可以节省很多 1/0 口。矩阵式键盘又可分为两大类:无编码器键盘和带编码器键盘。带编码器键盘采用硬件方法,当按键按下时直接给出该键的键编码,而且还能够消除抖动和解决重复键问题。键盘编码器有静态编码器,扫描式编码器和反相编码器等。无编码器键盘采用软件扫描法,逐行逐列地检查键盘状态,当发现有键按下时,用计算的方法来得到该键的编码。目前使用较多的是带编码器键盘。 INTEL8279是一种通用可编程键盘-显示器接口芯片。它能完成键盘输入和显示控制两种功能。键盘部分提供一种扫描工作方式,可于 64 个按键的矩阵键盘连接,能对键盘不断扫描,自动消抖,自动识别出按下的键并给出编码,能对双键或n键同时按下实现保护。8279为40列引脚封装。 
引脚简介: 1.数据总线:DO-D7 是双向三态总线。用于和系统数据总线相连,在 CPU 和 8279之间传送命令或数据。 2.地址线:当/CS=0选中8279,当AO=1为命令字及状态字地址,A0=0 为片内数据地址,故8279占用两个端口地址。 3.控制线:8279的控制线较多。这里介绍系统设计中几个用到的控制线 4.IRQ:中断请求输出线,高电平有效。 5SLO-SL3(扫描线):输出线。这四条输出线用来扫描键盘和显示器。它们可以编程设定为编码输出(16 中取 1)或译码输出(4 中取1)。 6.RLO-RL7(回复线):输入线。它们是键盘矩阵或传感器矩阵的列信号输入线。 7.SHIFT(移位信号):输入线,高电平有效。该输入信号是 8279 键盘数据的次高位D6,通常用来补充键盘开关的功能,可以用作键盘上、下档功能键,在传感器方式和选通方式中,SHIFT 无效。 8.CNTL/STB(控制/选通):输入线,高电平有效。在键盘方式时,该输入信号是键盘数据的最高位 D7,通常用来扩充键开关的控制功能,做控制功能键用。 本节着重介绍系统中可编程 I/0 接口芯片的电路设计。 可编程1/0接口芯片种类很多,常用的有 Intel 公司的外围器件,如可编程外围并行接口8255A、可编程RAM/I0扩展接口8155、可编程键盘/显示接口8279、可编程定时/计数器8253、可编程串行通讯接口 8251等。这些芯片都具有多种工作方式,可由CPU对其编程进行决定。下面对 8255A、8253在本平台中的运用进行详细介绍。 2.2可编程外围并行接口设计 本系统中所要控制的外部设备主要有两个步进电机(根据自制的步进电机驱动器需要用8个输出口),加上上下左右的4个键盘输口,选用8255A 可编程外围并行接口芯片。 
可编程输入/输出接口芯片 8255A 的引脚如图 3.5所示。D是双向数据线:/CS是片选线:/RD 是数据读出选通线,通常与 CPU 芯片的/RD引脚相连;/WR 是数据写入选通线,一般与CPU的/WR引脚连接:PA口是8位数据输出口,既有上拉又有下拉总线保持器;PB 口是8位数据输入/输出口,只有上拉总线保持器;PC 口是8位数据输入(无所存)/输出(带缓冲器)口,在方式控制下可分作两个 4 位端口用,每个 4位口都有一个4位所存器,这两个4位端口可与A及B口配合使用,输出控制信号输入状态信息,PC 口的保持结构与 B口相同。 向8255A 控制口写入控制字可决定它的工作方式,并且只有先写入控制字,才能通过三个数据口实现正确的I/0操作。它的3个I/0并行口 PA、PB、PC可选择三种工作方式:方式0为基本的输入输出:方式1为选通输入输出:方式2 为双向传送8255A 还能对C端口的任一位进行置位/复位操作。 3.步进电机控制设计 步进电机是一种通过电脉冲信号控制相绕组电流实现定角转动的机电元件,与其他类型电机相比具有易于开环精确控制、无积累误差等优点,在众多领域中获得了广泛的应用。为了得到性能优越的控制效果,出现了很多步进电机控制系统,其中采用单片机作为控制核心的控制系统得到了广泛的应用。 3.1步进电机的工作原理 
图3.6反应式步进电机结构图图3.6 是反应式步进电机结构示意图,它的定子具有均匀分布的六个磁极,磁极上绕有绕组。两个相对的磁极组成一组,连法如图 3.6 所示。 下面介绍反应式步进电动机单三拍、六拍及双三拍通电方式的基本原理。反应式进电机的工作原理是利用了物理上的“磁通总是力图使自己所通过的路径的磁阻最小所产生的磁阻转矩,使电机一步一步转动的。以三相反应式步进电机为例。 1、单三拍通电方式的基本原理 设A 相首先通电 (B、C 两相不通电),产生 A-A轴线方向的磁通,并通过转子形成闭合回路。这时 A、A’极就成为电磁极铁的 N、S 极。在磁场的作用下,转子总是力图转到磁阻最小的位置,也就是要转到转子的齿对齐 A、A’极的位置(图 3.7a);接着B相通电(A、C两相不通电),转子便顺时针方向转过 30°,它的齿和C、C’极对齐(图c)。不难理解,当脉冲信号一个一个发来时,如果按 A一C一B一A一···的顺序通电,则电机转子逆时针方向转动。这种通电方式称为单三拍方式。 2、六拍通电方式的基本原理 
设A相首先通电,转子齿与定子A、A’对齐(图3.7a),然后在A 相继续通电的情况下接通B相。这时定子 B、B’极对转子齿 2、4产生磁拉力,使转子顺时针方向转动但是 A、A’极继续拉住齿 1、3,因此,转子转动两个磁拉力平衡为止。这时转子的位置如图 3.7b 所示,即转子从图 3.7a 位置顺时针转过了巧“。接着A相断电,B相继续通电。这时转子齿2、4和定子 B、B’极对齐(图3.7c),转子从图3.8(b)的位置又转过了15“。其位置如图3.8d所示。这样,如果按 A-A、B-B-B、C-C-C、A一A.二的顺序轮流通电,则转子便顺时针方向一步一步地转动,步距角 15°。电流换接六次,磁场旋转一周,转子前进了一个齿距角。如果按 A一A、C-C-C、B一B一B、A一A.二的顺序通电,则电机转子逆时针方向转动。这种通电方式称为六拍方式功能来实现。 3、转矩的选择 步进电机转矩的选择包括四个方面:最大静转矩、启动转矩、矩频特性、定位转矩最大静转矩是指步进电动机在通电状态下,使转子离开平衡位置时的极限力矩值,它反映了步进电动机承受外加转矩的特性;启动转矩是指步进电动机单相绕组励磁时所能带动的极限负载转矩:矩频特性是指输出转矩与频率的关系,一般来一说,随着运行频率的提高,输出转矩逐渐下降;定位转矩是指步进电机在断电状态下定位时所需的转矩。当注意的是,步进电动机的输出转矩不仅与电动机本身的最大静转矩和矩频特性有关,而且还与驱动电源有着很大的关系。 4、连续运行频率的选择 步进电动机启动后,不失步地连续升速,所能达到的最高频率,称作连续运行频率。产品样本所提供的极限运行频率,是指电动机在空载时的最高运行频率。带载时的极限运行频率要根据负载转矩的大小,从矩频特性曲线上查找。 5.启动频率的选择 步进电动机不同于一般电动机,它的启动概念和不失步联系在一起。厂家提供的步进电动机启动频率,是指步进电动机空载时的极限启动频率。电动机带载后,启动频率要下降。启动频率主要取决于负载的转动惯量,二者之间的关系可以用启动惯频特性曲线来描述。用户可以根据厂家提供的启动惯频特性曲线来决定带载时的启动频率。 综合上述因素,进给系统选用三洋 57 型步进电机,其额定转矩为 20Nm,相数为 2,步距角为 0.9/1.8度,可以对其进行两相两拍、两相四拍控制。 3.2步进电机驱动与隔离选择 由于步进电机的大功率、高电平会对单片机产生比较严重的干扰,不能直接把单片机产生的控制信号直接连在步进电机上,需要进行强弱电隔离。在实际运用中,对于强弱电隔离一般采用电子开关方法或光电隔离的方法。由于步进电机工作需要较大的功率所以通常需要使用功率放大器来提供步进电机的工作电流,将光电隔离器送来的弱电信号变为强电信号,可以采用集成功放,也可以采用分立元件。本系统使用 TLP521GB 光电耦合芯片。 由于步进电机是一种将电脉冲信号转换成直线或角位移的执行元件,它不能直接接到交直流电源上.而必须使用专用设备-步进电机控制驱动器。典型步进电机控制系统中的控制器可以发出脉冲频率从几赫兹到几十千赫兹连续变化的脉冲信号,它为环形分配器提供脉冲序列。环形分配器的主要功能是把来自控制环节的脉冲序列按一定的规律分配后,经过功率放大器的放大加到步进电机驱动电源的各项输人端,以驱动步进电机的转动。环形分配器主要有两大类:一类是用计算机软件设计的方法实现环分器要求的功能,通常称软环形分配器。另一类是用硬件构成的环形分配器,通常称为硬环形分配器。功率放大器主要对环形分配器的较小输出信号进行放大,以达到驱动步进电机目的。L298N 是ST 公司生产的一种高电压、大电流电机驱动芯片。该芯片采用 15 脚封装主要特点是:工作电压高,最高工作电压可达 46V;输出电流大,瞬间峰值电流可达 3A,持续工作电流为 2A;额定功率 25W。内含两个H桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载:采用标准逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。使用 L298N 芯片驱动电机,该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机。可以直接用单片机的 I/O 口提供信号:而且电路简单,使用比较方便。L298N 可接受标准TTL逻辑电平信号 VSS,VSS 可接4.5~7V电压。4脚VS 接电源电压,VS 电压范围VIH为+25~46V。输出电流可达2.5A,可驱动电感性负载。1 脚和 15 脚下管的发射极分别单独引出以便接入电流采样电阻,形成电流传感信号。L298 可驱动 2个电动机,OUT1,OUT2 和OUT3,OUT4 之间可分别接电动机,本实验装置我们选用驱动一台电动机。5,7,10,12 脚接输入控制电平,控制电机的正反转。EnA,EnB 接控制使能端,控制电机的停转。 
In1,In2的逻辑图与图3.9相同。由图可知 EnA 为低电平时,输入电平对电机控制起作用,当 EnA 为高电平,输入电平为一高一低,电机正或反转。同为低电平电机停止,同为高电平电机刹停。4.系统抗干扰措施 控制系统都工作在一定的环境条件下。环境中必然存在各种产生电磁场的因素,这些磁场能量会通过一定的途径传入单片机控制系统,产生系统正常工作所不需要的信号,影响了单片机的正常工作。同时,单片机内部也会产生影响正常工作的信号。一般把上述所说影响正常工作的信号称为噪声,也就是干扰。在单片机控制系统出现干扰就会影响指令的正常执行。 环境对单片机控制系统的干扰一般都是以脉冲的形式进入系统的,干扰窜入系统的渠道主要有 3条,即空间干扰、供电系统干扰、过程通道干扰。一般情况下,空间干扰在强度上远小于其它两个渠道进入系统的干扰,而且空间干扰可用良好的屏蔽与正确的接地,或采用高频滤波器加以解决。因此,抗干扰的重点应放在供电系统和过程干扰通道的干扰。系统的抗干扰措施可以从硬件和软件两方面着手。 4.1硬件抗干扰技术 硬件系统的抗干扰设计特别重要,必须要在硬件设计的初始阶段就要考虑各种干扰因素,否则在系统调试时将会非常困难,增加系统调试的时间和费用。 单片机控制系统通常可由几块印刷电路板组成,各板之间以及各板与基准电源之间经常选用接插针相联系。在接插件的插针之间也易造成干扰,这些干扰与接插件插针之间的距离都有关系。在设计时要注意四个问题:合理地设置接插件:2插座上要话当增加接地针数;3信号针尽量分散配置,增大彼此之间的距离;@考虑到信号的翻转时差,把不同时刻翻转的插针放在一起,同时翻转的插针尽量远离,因为同时翻转会使干扰叠加。 印刷电路板是器件、信号线、电源线的高密度集合体,电路板的布线和布局好坏对可靠性影响很大。制作电路板时要注意以下几个事项:D电路板大小要适中,元件布局时相关尽量靠近:2电源线和地线与数据线传输方向要一致,这样有助于增强抗干扰能力;3地线尽量加宽,数据地线、模拟地线要分开,配置必要的去藕电容。 4.2软件抗干扰抗术 控制系统软件设计对提高系统的可靠性,提高抗干扰性能意义很大。一个好的软件设计,要充分考虑采取必要的抗干扰措施,利用软、硬件相结合的措施实现系统抗干扰,这也是单片机控制系统具有的优点之一。 1.软件冗余 软件冗余技术就是多次使用同一功能的软件指令,以保证指令执行的可靠性,常从以下几个方面考虑。 (1) 采用多次读入法,确保开关量输入正确无误。重要的输入信息利用软件多读入,比较几次结果一致再让其参与运算。对于按钮和开关状态读入时,要配合软件延时可消除抖动和误操作。 (2) 不断输出状态寄存器,及时纠正输出状态。设置输出状态寄存器,利用软件不断查询,当发现和输出的不一致时,及时纠正,防止由于干扰引起的输出变化导致设备误动作。 (3)对于条件控制系统,把对控制条件的一次采样、处理控制输出改为循环地采样。这种方法对于惯性较大的控制系统具有良好的抗干扰作用。 (4)为防止计算错误,可采用两组计算程序,分别计算,然后将两组计算结果进行比较,如两次计算结果相同,则将结果输出。如果出现误差,则再进行一次运算,重新比较,直到结果相同,才认为计算正确。 软件冗余技术是提高软件设计可靠性,防止干扰造成误差,保证控制系统正常运行的有力措施。至于在什么地方采用冗余,是根据在软件设计过程中的薄弱环节和在硬件上易于受到干扰部位而定。采用软件冗余技术,可使程序运转的可靠性大大提高。 对于AT89S52 单片机来说,所有的指令都不会超过三个字节,因此在某条关键的指令前插入两条“NOP”指令,则该条指令不会因程序跑飞而跳过没有被执行,造成整个程序的混乱。这些关键的指令一般为:RET、RETI、ACALL、LCALL、AJMP、LJMP、JZ、州Z、JC、JNC、JB、JBC、DJNZ、CJNE 等。同样可以在某些对系统状态起关键作用的指令前加上冗余指令。 2.增加程序监视系统 利用设置软件陷阱的办法虽然在一定程度上解决了程序“飞出”失控问题,但在程序执行过程中若进入死循环,无法撞上陷阱,就会使程序运行不下去。因此设置陷阱的办法不能有效的解决死循环问题。设置程序监视器(Watchdog)可比较有效的解决死循环问题。程序监视器系统有的采用软件解决,大部分都是采用软硬件相结合的办法。 本系统采用单片机内部定时器进行监视,其方法是在程序一开始就启动定时器工作,在主程序中增设定时器赋值指令,使该定时器维持在非溢出工作状态。定时器要稍大于程序一次循环的执行时间。程序正常循环执行一次给定定时器送一次初值,使其不能溢出。若程序失控,定时器则计满溢出中断,在中断服务程序中使主程序自动复位又进行初始状。 5.开关量输入、输出通道设计 5.1有触点开关量 有触点开关也称机械式开关,比如行程开关、控制按钮、继电器、接触器等。有触点开关分为常开、常闭两种方式,其显著特点是无源,开、闭时均会产生抖动,所以在实际应用中需要采取措施消除抖动。 在机械有触点开关中,当触点闭合或打开时将产生抖动,使得开关量在瞬间的状态不稳,由于机械触点的弹性作用,按键开关在闭合时不会马上稳定地接通,在断开时也不会立即断开。因而在闭合及断开的瞬间均伴随一连串的抖动,抖动的时间长短中按键的机械特性决定,一般为5到10ms。若是工作在计数器方式或作为中断输入,将导致系统工作不正常,因此消除抖动是十分必要的。消除按键抖动通常有两种方法:硬件消除抖动和软件消抖。 硬件消除抖动是通过在按键输出电路上加一定的硬件线路来消除抖动,一般采用R-S 触发器或单稳态电路。软件消除抖动是利用延时来跳过抖动动作过程,当判断有按键按下后,先执行一段大于 10ms 的延时程序再去判断按下的键位是哪一个,从而消除抖动的影响。本系统采用软件消除抖动。 5.2开关量输入通道 开关量输入通道也称数字量输入通道,它是将用双值逻辑“1’和“0’表示的电压或电流的开关量,转换为计算机能够识别的数字量。典型的开关量输入通道通常由以下几个部分组成: (1)信号变换器 将工业过程的非电量或电磁量转换为电压或电流的双值逻辑值比如有触点的机械开关或无触点的接近开关等。 (2) 整形变换电路 将混有毛刺之类干扰的双值逻辑信号,或前后沿不合要求的输入信号,整形为接近理想状态的方波。 (3)电平变换电路 将输入的双值逻辑电平转换成与 CPU 兼容的逻辑电平 二、系统软件设计 控系统软件是为实现数控系统各项功能而编制的专用软件,即存放于内存储器中的系统程序。由于数控系统的功能设置与控制方案各不相同,在结构和规模上差别很大般来说,功能越多,所需要的系统程序越长,所占内存空间越大。系统程序的设计直接关系到数控系统各项功能的实现及其将来的扩展,所以它是整个数控系统研制工作中的关键,也是工作量最大的部分。一般数控系统软件设计的原则是,在条件允许的情况下,减少硬件电路,降低成本,尽可能地用软件来代替硬件。系统软件必须完成管理和控制两项仟务,数控装置的管理任务一般包括编辑输入、I/0 处理、显示、诊断等,控制任务包括译码、刀具补偿、速度处理、插补、位置控制等。 本系统的软件设计主要分为系统初始化、按键、显示处理及控制脉冲输出几部分,事实上每一部分都是紧密相关的,每个功能模块对于整体设计都是非常重要,单片机AT89C2051 通过软件编程才能使系统真正的运行起来,软件设计的好坏也直接决定了系统的运行质量。 程序流程图的设计遵循自顶向下的原则,即从主体遂逐步细分到每一个模块的流程。在流程图中把设计者的控制过程梳理清楚。本程序主要由键盘程序、显示器程序、步进电机驱动程序三部份组成,主程序首先初始化各变量,将显示器消隐,步进电机驱动的各引脚均输出高电平,便进入待机状态,等待键入相应操作。然后调用键盘程序,并作判断,如果有键按下,则调用键盘处理程序。在各个调用程序中相应的编入显示的程序。 1.系统软件的总体框架简介 在此运行模块中,在开启定时器后,便进入速度档位显示和允许操作键盘扫描判断程序。在连续运行模式中“拍数”和“模式”键不可用,“上升”和“下降”键为速度调节键。数控系统软件具有多任务性和实时性两大特点。编辑输入、预处理、显示、插补、进给控制等任务需并行及时处理。所以要采用并行处理技术确定软件各模块的结构。并行处理技术的方法很多,本系统由于是单 CPU的数控装置,因而在软件设计中采用资源分时并行处理技术。一般地采用资源分时共享方法是:各个任务按其需要时间的长短被分割成一个个子任务,系统采用时循环调度和优先抢占调度相结合的方法完成各任务,所以资源分时共享的并行处理只具有宏观上的意义,从微观上看来,各个任条还是顺序执行的。并行处理中的信息交换主要通过设置各种缓冲存储区来实现。零件程序首先通过编辑输入程序的处理存入加工程序缓冲存储区,这是一个循环存储队列,然后插补准备程序(包括译码、刀具补偿和速度处理)从加工程序存储区将一个程序段的数据读入译码缓冲存储区,进行译码、刀具补偿和速度处理,并将结果放入插补缓冲存储区。插补程序在每次执行一个程序段的插补运算时,将插补缓冲存储区的内容读入插补工作存储区,用插补工作存储区的数据进行插补计算并将结果送到插补输出寄存器。各缓冲区数据交换和更新的同步依靠同步信号指针实现,从而保证了信息的正确传输。分时并行处理技术主要需解决的问题是,充分利用计算机的高速数据计算和处理能力,保证每个任务的合理响应时间。 本系统软件总体结构采用前后台型。这种模式将数控系统分成两部分:前台程序和后台程序。前台程序为实时中断程序,承担了几乎全部实时任务,实现插补、位置控制、开关控制等实时功能;后台程序是一个循环运行程序,实现加工程序的输入和预处理以及管理的各项任务。后台程序是本系统的主程序,主要功能是完成整个系统的管理和调度,并完成实时插补前的各项控制任务。 系统启动和复位重新启动后,先进入开机界面,稍后自动进入系统初始化子程序为系统的正常工作做好各种准备。初始化子程序的主要工作有:设置 CPU 及其有关接口工作状态,显示系统有关的局部标志和全局标志:设置系统参数:设置中断矢量,使系统能及时获得操作员的操作控制信号。 图4.1为正常加工状态下背景程序的软件度管理主流程图。初始化工作完成后,系统进入背景程序的循环中,调度系统工作于编辑、手动、自动、模拟和对刀等工作方式中。编辑工作方式使背景程序进入键盘输入处理程序,用来进行程序的编制、修改和存储;手动工作方式使背景程序进入手动方式处理程序,按操作面板上的操作状态转入不同的处理分支,在实时时钟中断服条程序和点动处理程序的配合下,实现各种手动功能,自动工作方式是对零件进行自动加工的一种方式,自动处理程序及时完成各程序段插补前的预处理并完成实时加工控制。 附录2:程序清单 - #include <reg51. H> //x轴半/全步设定
- sbit hfx= P(f7; sbit //x轴正反转设定
- ccwx= P20; sbit //x轴脉冲设定
- stepx= P21; sbit //y轴半/全步设定
- hfy=P2"2;sbit ccwy //y轴正反转设定
- =P2 3;sbit stepy = 7/y轴脉冲设定
- P2 4; sbit LED = "报警
- P2"5; sbit K1 = P2^7; //确定步进电机工作
- sbit shift =P31; //圆、直线转换
- int a[]={0x3F,0x06,0x5B,0x4F,0x66,
- 0x6D,0x7D,Ox07,0x7F,0x6F,0x77,
- 0x7C,0x39,0x5E,0x79,0x71}; //数码管显示代码
- Static int Fn1=0;static int Fn2=0;
- Static int Fn3=0;static int Fn4=0
- Static int Fn=0;
- Static int xn1,yn1;
- Static int xn2,yn2;
- Static int xn3,yn3;
- Static int xn4,yn4;
- Int cntx=0;
- Int cnty=0;
- Int m1,m2.m3,m4,m;
- Static int kx,ky,i,mO;
- Void circle(void);//函数声明
- Void alarm(void);
- Void Delay(int t);
- Void line (void);
- Void LI(void);
- Void L2(void);
- Void L3(void);
- void main(void)
- EA =1: //开中断
- ITO=1;
- EXO=1;
- TT1=1;
- EXl=1;
- while(K1);if
- (shift^0)
- circle();
- if(shift=1) //调用两圆子程序
- line();
- } //调用岡直线子程序
- /*外部中断0程序*1
- void intO(void)interrupt 0 using 1{
- Delay(2000);
- cntx++;
- cntx%:16;
- ynl=0;
- xnl=10 氺 cntx;
- xn2=0;
- yn2=10氺cntx;
- yn3=0;
- xn3=10氺cntx;
- xn4=0;
- yn4=10氺cntx;
- Pl=~a[cntx];
- kx=5氺cntx;
- }
- / * 外 部 中 断 1 程 序 * /
- void inti(void)interrupt 2 using 2
- Delay(2000);
- cnty++;
- Cnty%16;
- P0=~a[cnty];
- Ky=5氺cnty;
- }
- //显示更新程序
- void circle(void) //显示更新画圆
- {1)1 =~a[cntx];
- hfx=0;
- hfy=0;
- m1=m2=m3,m4=20*cnty;//若K1键按下(为0),步进电机开始动作
- while (R1=0)
- {
- Delay(1000);if(Kl=0) //延时消抖处理
- {
- LED=0; while
- (ml)
- //此时调用各象限加工子函数
- {
- PO=~0x06;L1();
- }
- Delay(1000);while(m2){PO=~0x5B;L2();
- }Delay(1000);while(m3) {PO=~0x4F:
- L3()
- }
- Delay(1000);while(m4)
- P0=~0x66;L4();
- }
- while(!ml&&!m2&&!m3&&!m4)//加工完毕,报警提示
- stepx=stepy=1;
- alarm();
- }
- }
- }
- }
- Void line(void) //显示更新画直线单步插补
- {
- mO=kx+ky;ccwx=1;ccwy=1;
- //xy步进电机正转
- while(Kl==0)
- //若K1为0,步进电机开始动作
- {
- EA =0;
- LED=0;while(mO)
- {
- if(Fn 〉=0)
- {
- Fn =Fn ky;
- ky=ky;
- stepx=0;Delay(25);
- stepx=1;Delay(25);mO-
- =1;
- }
- if(Fn〈0)
- En=Fn+kx;
- kx=kx;
- stepy=0;Delay (25);
- stepy=1;Delay(25);
- mO-=1;
- }
- }
- if(!mO) //加工完毕,报警提示
- {
- stepx=stepy=1; alarm
- ();
- /**** //显示更新画直线比例插补
- Kx=100*cntx
- ky=100*cnty; while(Kl=0)
- { //若K1为0,步进电机开始动作
- EA =0;
- LED=0;while(kx||ky)
- {
- kx=kx-cntx;
- ky=ky-cnty;
- for(m=0;m<cntx;m++) //脉冲
- {
- Delay(25);
- stepx=0;
- Delay(25);
- stepx=1;
- }
- for(m=0;n)<cnty;m++)
- Delay(25);
- stepy=0;
- Delay(25);
- stepy=1;
- }
- }
- if(!kx&&!ky) //加工完毕,报警提示
- stepx=stepy=1;
- alarm();
- }
- } ****
- }
- /各象限插补程序/
- voidLI(void)
- ccwx=0;ccwy=1;
- if(Fnl>=0)
- Fnl=Fn1-2*xnl+1;
- xnl=xnl- 1;
- stepx=0;Delay(25);
- stcpx=1;Delay(25);
- ml-=1;
- }
- if(Fnl<0)
- Fnl=Fnl+2*ynl+1;
- ynl=ynl+1;
- stepy=0;Delay(25);
- stepy=1;Delay(25);
- m1=1
- }
- void L2(void)
- ccwx=0;ccwy=0;
- if(Fn2>=0)
- {
- Fn2=Fn2-2*yn2+1;
- yn2=yn2~1;m2~=1;
- stepy=0;Delay(25);
- stepy=1;Delay(25);}
- if(Fn2<0)
- {
- Fn2=Fn2+2*xn2+1;
- xn2=xn2+1;m2-=1;
- stepx=0;Delay(25);
- stepx=1;Delay(25);
- }
- void L3(void)
- {
- ccwx=1;ccwy=0;
- if(Fn3 〉=0)
- {
- Fn3=Fn3-2*xn3+1;
- xn3=xn3~1;m3-=1;
- stepx=0;Delay(25);
- stepx=1;Delay(25);}
- if(Fn3<0)
- {
- Fn3=Fn3+2*yn3+1;
- yn3=yn3+1;m3-=1;
- stepy=0;Delay(25);
- stepy=1;Delay(25);}
- void L4(void)
- ccwx=1;ccwy=1;if
- (Fn4>=0)
- {
- Fn4=Fn4-2*yn4+1;
- yn4=yn4- 1;m4~=1;
- stepy=0;Delay(25);
- stepy=1;Delay(25);}
- if(Fn4<0)
- {
- Fn4=Fn4+2*xn4+1;
- xn4=xn4+1;m4-=1;
- stepx=0;Delay(25);
- stepx=1;Delay(25);}
- 报警函数
- void alarm(void)
- {
- for(i=0;i<200;i++)
- {
- LED=0;Delay(150);
- LED=1;Delay(150);
- //延时函数//
- void Delay(int t)
- for(i=0;i<t;i++);
复制代码 |