计量泵流量控制系统设计(共13页).doc
精选优质文档-倾情为你奉上基于80C51的计量泵流量控制系统设计【内容摘要】:步进电机是一种用电脉冲进行控制 ,将电脉冲信号转换成相位移的电机。本文将计量泵流量控制转换为对步进电机的控制。控制系统采用AT89C52做主控单元,通过与AT89C2051的串口通信实现对步进电机的远程控制,最终实现对泵流量控制。【关键词】:单片机 控制 速度 步进电机 AT89C52 AT89C2051步进电机是数控式电机,是工业控制及仪表中常用的控制元件之一,其最大特点是通过输入脉冲信号来进行控制,即电机的总转动角度有输入的脉冲数决定,而电机的转速由脉冲信号频率决定。它具有输入脉冲与电机轴转角成比例的特征因此非常适合于单片机控制。步进电机的工作原理:其机械位移和转速分别与输入电机绕组的脉冲个数和脉冲频率成正比 ,每一个脉冲信号可使步进电机旋转一个固定的角度.脉冲的数量决定了旋转的总角度 ,脉冲的频率决定了电机运转的速度.当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(称为“步距角”),它的旋转是以固定的角度一步一步运行的。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的步进电机的特点:1) 一般步进电机的精度为步进角的3-5%,且不累积。2) 步进电机外表允许的温度高。步进电机温度过高首先会使电机的磁性材料退磁,从而导致力矩下降乃至于失步,因此电机外表允许的最高温度应取决于不同电机磁性材料的退磁点;一般来讲,磁性材料的退磁点都在摄氏130度以上,有的甚至高达摄氏200度以上,所以步进电机外表温度在摄氏80-90度完全正常。3)步进电机的力矩会随转速的升高而下降。当步进电机转动时,电机各相绕组的电感将形成一个反向电动势;频率越高,反向电动势越大。在它的作用下,电机随频率(或速度)的增大而相电流减小,从而导致力矩下降。4)步进电机低速时可以正常运转,但若高于一定速度就无法启动,并伴有啸叫声。步进电机有一个技术参数:空载启动频率,即步进电机在空载情况下能够正常启动的脉冲频率,如果脉冲频率高于该值,电机不能正常启动,可能发生丢步或堵转。在有负载的情况下,启动频率应更低。如果要使电机达到高速转动,脉冲频率应该有加速过程,即启动频率较低,然后按一定加速度升到所希望的高频(电机转速从低速升到高速)。计量泵的控制系统是由步进电机通过一对减速齿轮带动计量泵的转动丝杠上下运动,从而达到控制流量的目的。因此,本系统的控制主要是通过向步进电机发脉冲以控制步进电机的转数来实现。在本控制系统中,可以通过人工输入所需要的流量值(通过丝杠的位置反应出来)来控制步进电机的脉冲数;也可以通过外部流量传感器反馈回来的信号(标准420MA)经过A/D转换后以自动控制方式来控制步进电机的脉冲数。当采用人工控制时,输入期望数据后,处理器将输入的数据与当前数据相比较,得到相应的动作值,计算出相应的脉冲数发送给步进电机,通过步进电机正转或反转来达到期望值。在步进启动时采用加速过程,在即将达到期望值时采用减速过程,使得步进电机能不失步的稳定运行。另外,在计量泵的泵体上安装了接近开关,当计量泵的丝杠运行到极限位置时,接近开关向单片机发出高电平是计量泵的丝杠运动停止,以保障计量泵本体的安全性,在软件设计中,对控制装置也采用软件保护措施,如当步进电机所处于运动状态或输入值超过系统的最大值时,所输入的命令是无效的。控制系统硬件电路基本组成控制系统采用AT89C52做主控单元,通过与AT89C2051的串口通信实现对步进电机的远程控制。控制系统硬件电路的总体结构如下图(图(1)所示,包括A/D转换电路 AT89C51单片机系统 AT89V2051单片机系统和操作/显示面板等。AT89C52是一个低电压,高性能 8位,片内含8k bytes的可反复擦写的只读程序存储器和256 bytes的随机存取数据存储器(),器件采用的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,AT89C52单片机在电子行业中有着广泛的应用。AT89C52为8 位,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52 相同,其主要用于会聚调整时的功能控制。功能包括对会聚主IC 内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。主要管脚有:XTAL1(19 脚)和XTAL2(18 脚)为振荡器输入输出端口,外接12MHz 晶振。RST/Vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。VCC(40 脚)和VSS(20 脚)为供电端口,分别接+5V电源的正负端。P0P3 为可编程通用I/O 脚,其功能用途由软件定义,在本设计中,P0 端口(3239 脚)被定义为N1 功能控制端口,分别与N1的相应功能管脚相连接,13 脚定义为IR输入端,10 脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12 脚、27 脚及28 脚定义为握手信号功能端口,连接主板CPU 的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。 AT89C2051是美国公司生产的低电压、高性能 8位,片内含2k bytes的可反复擦写的只读程序存储器(PEROM)和128bytes的随机数据存储器(),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和存储单元,AT89C2051单片机在电子类产品中有广泛的应用。引脚图如下所示:引脚说明:1、VCC:电源电压。 2、GND:地。 3、P1口:P1口是一个8位双向I/O口。口引脚P1.2P1.7提供内部上拉电阻,P1.0和P1.1要求外部上拉电阻。P1.0和P1.1还分别作为片内精密模拟比较器的同相输入(ANI0)和反相输入(AIN1)。P1口输出缓冲器可吸收20mA电流并能直接驱动LED显示。当P!口引脚写入“1”时,其可用作输入端,当引脚P1.2P1.7用作输入并被外部拉低时,它们将因内部的写入“1”时,其可用作输入端。当引脚P1.2P1.7用作输入并被外部拉低时,它们将因内部的而流出电流。 4、P3口:P3口的P3.0P3.5、P3.7是带有内部上拉电阻 的七个双向I/O口引脚。P3.6用于固定输入片内比较器的输出信号并且它作为一通用I/O引脚而不可访问。P3品缓冲器可吸收20mA电流。当P3口写入“1”时,它们被内部上拉电阻拉高并可用作输入端。用作输入时,被外部时拉低的P3口脚将用上拉电阻而流出电流。 P3口还用于实现AT89C2051的各种第二功能,如下表所列: 引脚口功 能 P3.0RXD串行输入端口P3.1TXD串行输入端口P3.2INT0外中断0P3.3INT1外中断1P3.4T0定时器0外部输入P3.5 T1定时器1外部输入P3口还接收一些用于闪速存储器编程和程序校验的控制信号。 5、RST:复位输入。RST一旦变成高电平所有的I/O引脚就复位到“1”。当振荡器正在运行时,持续给出RST引脚两个机器周期的高电平便可完成复位。每一个机器周期需12个振荡器或时钟周期。 6、XTAL1:作为振荡器反相器的输入和内部时钟发生器的输入。 7、XTAL2:作为振荡器反相放大器的输出。 显示接口的选择单片机显示接口是控制系统实现实时自动地向操作人员提供必要的状态信息的途径,它及时向工作人员提供系统运行状态和对操作命令的响应,它是系统实现交互功能的一种途径。本控制器是采用共阴极8段LED数码管。A/D转换接口外部流量传感器反馈回来的电流信号(标准420mA)进入到A/D转换器以转换成单片机便于处理的数字信号。在该设计中,采用了美国Ti公司生产的TLC1549. 控制系统的软件程序设计软件设计是为了实现控制系统的各种功能。在满足基本功能要求的前提下,采用各种有效方式使操作灵活简便,增强系统的稳定性和可靠性,提高系统的抗干扰能力。根据以上原则,本软件总思路如下:当有键盘或外部的的信号输入时,由计算出步进电机所要走的步数,此时将串行通信标志位置1,程序转入串行通信子程序,将电机所要走的步数传送给,从而完成数据的输入和对电机的控制。程序的总体转入串行通信子程序传送标志位传送标志位开中断显示/键盘初始化AT89C52单片机系统初始化关中断开始流程图如图2所示。NY(图2)本系统将对泵的流量控制转化为对步进电机的控制。当 流量在泵容量内变化时,步进电机的脉冲数为60000(此时步进电机的步距角被细分为0.18)。这种控制的运算方式是相对的,控制系统从一次运行的基础上运行,将当前的数据与上一次的数据相减,经过转换得出步进电机所发的脉冲方向(加速-减速)。接近开关信号是丝杆的0位标志,AT89C2051上电初始化,电机正转;到达零位时,接近开关发出信号,触发AT89C2051的外部中断程序使电机停转。是否为自动状态开始本系统中所有数据的输入和命令的发送都是由键盘输入的,系统运作时对输入数据的一种相应。系统设计中 键盘和LED显示都是通过对其接口的不断扫描来实现的。所以,扫描定时器的中断程序设记必不可少,下图3为定时器的中断程序设计流程图键盘扫描对A/D接口采集新的设定值是否有键按下转入相应键处理程序LED显示子程序返回总流程(图3)本系统中涉及到流量数据与数据显示的转化问题。在编程时,用数组led3作为显示寄存器,分别储存十位个位和十分位的数据内容;用ss来储存流量数据。当显示数据向流量数据转换时程序进行如下的运算:将led2中的数据乘以100后语led1中的数据乘以10后相加,再加上led0中的数据,将加得的数送到ss中。从而得到流量数据。反之除以得到显示寄存器中的值。计算程序如下If (new_pos!=now_pos&auto_pos<=250)sewp.idata=new_pos-nou_pos;Now_pos=new_pos;Bsendto2051=1;Ti=now_pos;led2=ledtableti%10;ti/=10;led1=ledtableti%10;ti/=10;led0=ledtableti%10;else return;串口通信程序设计异步通信:它用一个起始位表示字符的开始,用停止位表示字符的结束。其每帧的格式如下:在一帧格式中,先是一个起始位0,然后是8个数据位,规定低位在前,高位在后,接下来是奇偶校验位(能省略),最后是停止位1。用这种格式表示字符,则字符能一个接一个地传送。 在异步通信中,CPU与外设之间必须有两项规定,即字符格式和波特率。字符格式的规定是双方能够在对同一种0和1的串理解成同一种意义。原则上字符格式能由通信的双方自由制定,但从通用、方便的角度出发,一般还是使用一些标准为好,如采用ASCII标准。 波特率即数据传送的速率,其定义是每秒钟传送的二进制数的位数。例如,数据传送的速率是120字符/s,而每个字符如上述规定包含10数位,则传送波特率为1200波特。同步通信:在同步通信中,每个字符要用起始位和停止位作为字符开始和结束的标志,占用了时间;所以在数据块传递时,为了提高速度,常去掉这些标志,采用同步传送。由于数据块传递开始要用同步字符来指示,同时要求由时钟来实现发送端与接收端之间的同步,故硬件较复杂。通信方向传送模式:在串行通信中,把通信接口只能发送或接收的单向传送办法叫单工传送;而把数据在甲乙两机之间的双向传递,称之为双工传送。在双工传送方式中又分为半双工传送和全双工传送。半双工传送是两机之间不能同时进行发送和接收,任一时该,只能发或者只能收信息。在串行通信中,收发双方接受的数据速率要有一定的约定,系统通过软件对AT89C52和AT89C2051串行口变成可约定四种工作方式:方式0,1,2,3,。本系统选择方式1。用定时器T1产生波特律时,波特率与T1的溢出率有关,本系统中采用22.1184MHZ的晶振,要产生19200b/s的波特率。在软件编程中。定时器T1的初始化如下;TMOD&=0X0F;TMOD!=0X20;TH1=0XED;TL1=TH1;ET1=0;TR1=1;AT89C52和AT89C2051程序中各设立一个标志位,分别为bsendto2051和rxdmew,将这两个值都初始化位0.将AT89C52和AT89C2051都初始化为串行方式1。AT89C52 的串口初始化程序为SCON |=0X50;PCON &=0X7F;EA = 0;TI = 0;AT89C2051的串口初始化程序为SCON |=0X50;PCON &=0X7F;RI = 0;ES = 0;步进电机控制程序设计由于步进电机在启动、运转和停止过程中,不能以一个恒定的速度来设计,需要一定的加速和减速,因此步进电机控制程序中,不仅要控制电机的正转反转,还要控制电机的转速;程序附后本控制系统采用AT89C52做主控单元,通过与AT89C2051的串口通信实现对步进电机的远程控制,硬件设计到软件设计,从而达到控制流量的目的。【参考文献】:单片机原理及接口技术 余锡存 曹国华 编著 西安电子科技大学出版社微型计算机原理与接口技术 冯博琴 吴宁 编著 清华大学出版社80C51单片机 原理、开发与应用实例 于晓东 主编 中国电力出版社51单片机及其C语言程序开发实例 戴仙金 主编 清华大学出版社步进电机控制程序设计 大致如下/*端口宏定义*/#define IN1_DAT GpioDataRegs.GPADAT.bit.GPIOA0#define IN1_DIR GpioMuxRegs.GPADIR.bit.GPIOA0#define IN2_DAT GpioDataRegs.GPADAT.bit.GPIOA2#define IN2_DIR GpioMuxRegs.GPADIR.bit.GPIOA2#define IN3_DAT GpioDataRegs.GPADAT.bit.GPIOA4#define IN3_DIR GpioMuxRegs.GPADIR.bit.GPIOA4#define IN4_DAT GpioDataRegs.GPADAT.bit.GPIOA6#define IN4_DIR GpioMuxRegs.GPADIR.bit.GPIOA6#define Up_Key GpioDataRegs.GPEDAT.bit.GPIOE2#define Down_Key GpioDataRegs.GPBDAT.bit.GPIOB8 /*常量宏定义*/ #define Period 40 /周期为Period*0.5mS=20mS/*全局变量定义*/*函数声明*/ void Init_Port(void);void Init_Timer0(void);void Delay_500uS(void);void Scan_Key(void);void Manage_Up(void);void Manage_Down(void);void Forward_Drive(void);void Reverse_Drive(void);/*-*/*形式参数:void */*返回值:void */*函数描述:主函数 */*-*/ void main(void) InitSysCtrl(); / 系统初始化子程序,在DSP28_sysctrl.c中 Init_Port(); Init_Timer0(); while(1) if(Up_Key=0)|(Down_Key=0)/扫描是否按键按下 Scan_Key(); /*-*/*形式参数:void */*返回值:void */*函数描述:初始化电机控制端口 */*-*/ void Init_Port(void) EALLOW; IN1_DIR=1; IN2_DIR=1; IN3_DIR=1; IN4_DIR=1; EDIS; IN1_DAT=0; IN2_DAT=0; IN3_DAT=0; IN4_DAT=0;/*-*/*形式参数:void */*返回值:void */*函数描述:初始化Timer0 */*-*/ void Init_Timer0(void) CpuTimer0Regs.PRD.all = 60000;/设置定时器周期 CpuTimer0Regs.TPR.all = 0; CpuTimer0Regs.TPRH.all = 0; CpuTimer0Regs.TCR.bit.TSS = 1;/停止定时器 /*-*/*形式参数:void */*返回值:void */*函数描述:延时0.5mS时间 */*-*/ void Delay_500uS(void) CpuTimer0Regs.TCR.bit.TRB = 1;/定时器重装 CpuTimer0Regs.TCR.bit.TSS = 0;/启动定时器 while(CpuTimer0Regs.TCR.bit.TIF !=1);/计数完成 CpuTimer0Regs.TCR.bit.TSS = 1;/停止定时器/*-*/*形式参数:void */*返回值:void */*函数描述:扫描键值 */*-*/void Scan_Key(void) unsigned int i; for(i=0;i<40;i+) /键盘消抖动,20mS Delay_500uS(); if(Up_Key=0) Manage_Up(); else if(Down_Key=0) Manage_Down(); while(Up_Key=0)|(Down_Key=0); /*-*/*形式参数:void */*返回值:void */*函数描述:按键的处理程序 */*-*/void Manage_Up(void) /正转 Forward_Drive();void Manage_Down(void)/反转 Reverse_Drive(); /*-*/*形式参数:void */*返回值:void */*函数描述:电机正转程序 */*-*/void Forward_Drive(void) unsigned char i; IN1_DAT=1; IN2_DAT=0; IN3_DAT=0; IN4_DAT=0; for(i=0;i<Period;i+) Delay_500uS(); IN1_DAT=0; IN2_DAT=0; IN3_DAT=1; IN4_DAT=0; for(i=0;i<Period;i+) Delay_500uS(); IN1_DAT=0; IN2_DAT=1; IN3_DAT=0; IN4_DAT=0; for(i=0;i<Period;i+) Delay_500uS(); IN1_DAT=0; IN2_DAT=0; IN3_DAT=0; IN4_DAT=1; for(i=0;i<Period;i+) Delay_500uS(); IN1_DAT=0; IN2_DAT=0; IN3_DAT=0; IN4_DAT=0;/*-*/*形式参数:void */*返回值:void */*函数描述:电机反转程序 */*-*/void Reverse_Drive(void) unsigned char i; IN1_DAT=0; IN2_DAT=0; IN3_DAT=0; IN4_DAT=1; for(i=0;i<Period;i+) Delay_500uS(); IN1_DAT=0; IN2_DAT=1; IN3_DAT=0; IN4_DAT=0; for(i=0;i<Period;i+) Delay_500uS(); IN1_DAT=0; IN2_DAT=0; IN3_DAT=1; IN4_DAT=0; for(i=0;i<Period;i+) Delay_500uS(); IN1_DAT=1; IN2_DAT=0; IN3_DAT=0; IN4_DAT=0; for(i=0;i<Period;i+) Delay_500uS(); IN1_DAT=0; IN2_DAT=0; IN3_DAT=0; IN4_DAT=0;专心-专注-专业