两相步进电机控制系统设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

综合课程设计
题目两相步进电机
学院计信学院
专业10自动化
班级2班
学生姓名
指导教师文远熔
2012 年12 月28 日
两相步进电机课程设计报告
步进电机是一种进行精确步进运动的机电执行元件,它广泛应用于工业机械的数字控制,为使系统的可靠性、通用性、可维护性以及性价比最优,根据控制系统功能要求及步进电机应用环境,确定了设计系统硬件和软件的功能划分,从而实现了基于8051单片机的四相步进电机的开环控制系统。

控制系统通过单片机存储器、I/O 接口、中断、键盘、LED 显示器的扩展、步进电机的环形分频器、驱动及保护电路、人机接口电路、中断系统及复位电路、单电压驱动电路等的设计,实现了四相步进电机的正反转,急停等功能。

为实现单片机控制步进电机系统在数控机床上的应用,系统设计了两个外部中断,以实现步进电机在某段时间内的反复正反转功能,也即数控机床的刀架自动进给运动,随着单片机技术的不断发展,单片机在日用电子产品中的应用越来越广泛,自六十年代初期以来,步进电机的应用得到很大的提高。

人们用它来驱动时钟和其他采用指针的仪器,打印机、绘图仪,磁盘光盘驱动器、各种自动控制阀、各种工具,还有机器人等机械装置。

此外作为执行元件,步进电机是机电一体化的关键产品之一,被广泛应用在各种自动化控制系统中,随着微电子和计算机技术的发展,它的需要量与日俱增,在各个国民经济领域都有应用。

步进电机是机电数字控制系统中常用的执行元件,由于其精度高、体积小、控制方便灵活,因此在智能仪表和位置控制中得到了广泛的应用,大规模集成电路的发展以及单片机技术的迅速普及,为设计功能强,价格低的步进电机控制驱动器提供了先进的技术和充足的资源。

关键字: 步进电机单片机
1 设计内容
根据给定的任务要求选择合适的单片机和其他电子元件,进行系统硬件电路设计和软件编程,根据系统制作并调试电路板,使之实现任务要求。

两相步进电机,步距角为3度,编程实现下列功能:
(1) 按键,步进电机按一定速度正转。

(2) 按键,步进电机按一定速度反转。

(3) 任何时候按一下“STOP ”键,步进电机停止转动。

(4) 点动:按键,步进电机转过3度步距角;再按,再转过3度步距角…… (5) 用1602显示屏显示转过的角度。

(6) 用L298芯片驱动。

2 步进电机原理
2.1步进电机原理及控制技术
步进电机一般分为永磁式(PM)、反应式(VR)和混合式(HB)3种类型。

目前,二相混合式步进电机的应用最为广泛。

图5为二相六线式步进电机的工作原示意图。

由图可知,它有2个绕组,且每个绕组都有一个中间抽头。

因此,二相步进电机也就有了6根引线。

当电机中的绕组通电后,其定子磁极产生磁场,将转子吸合到相应的磁极处。

若绕组在控制脉冲的作用下,通电方向使定子在顺时针方向轮流产生磁场,则电机可顺时针转动;通电方向使定子在逆时针方向轮流产生磁场,则电机可逆时针转动。

控制脉冲每作用一次,通电方向就变化一次,使电机转动一步,即一个步距角。

脉冲频率越高,电机转动也就越快。

本次课设所使用的二相步进电机需要采用双极性的接法。

双极性则是指步进电机线圈中电流的流动方向不是单向的,即绕组线圈中的电流有时沿某一方向流动,有时按相反方向流动。

步进电机的双极性驱动电路如图2-5所示它使用8个晶体管来驱动2组相位。

双极性驱动电路可以同时驱动四线式或六线式的二相步进电机。

对于二相六线式步进电机而言, 2个绕组的中间抽头V dd1和V dd2都悬空。

根据步进电机的工作原理,当控制器给驱动器发出脉冲信号时,驱动器经过环形分配器和功率放大后,电机绕组通电的顺序为B B A A B B A A →→→,其4个状态按顺序周而复始进行变化,电机转动; 若通电时序就变为A A B B A A B B →→→时,电机就逆向转动。

步进电机运转时,当达林顿管Q1和Q4导通时,线圈中电流方
向为A→A;当林顿管Q2和Q3导通时,线圈中电流方向为A→A。

可见,步进电机线圈中的电流方向在运转过程中是不断改变的。

(1)
图4-21 二相步进电机原理图
(2)步进电机的速度控制
如果给步进电机发一个控制脉冲,它就转一步,再发一个脉冲,它会再转一步。

两个脉冲的间隔越短,步进电机就转得越快。

调整送给步进电机的脉冲频率,就可以对步进电机进行调试。

(3)步进电机的起停控制
步进电机由于其电气特性,运转时会有步进感。

为了使电机转动平滑,减小振动,可在步进电机控制脉冲的上升沿和下降沿采用细分的梯形波,可以减小步进电机的步进角,跳过电机运行的平稳性。

在步进电机停转时,为了防止因惯性而使电机轴产生顺滑,则需采用合适的锁定波形,产生锁定磁力矩,锁定步进电机的转轴,使步进电机转轴不能自由转动。

(4)步进电机的加减速控制
在步进电机控制系统中,通过实验发现,如果信号变化太快,步进电机由于leizi888 2010 惯性跟不上电信号的变化,这时就会产生堵转和失步现象。

所有步进电机在启动时,必须有加速过程,在停止时波形有减速过程。

理想的加速曲线一般为指数曲线,步进电机整个降速过程频率变化规律是整个加速过程频率变化规律的逆过程。

选定的曲线比较符合步进电机升降过程的运行规律,能充分利用步进电机的有效转矩,快速响应性好,缩短了升降速的时间,并可防止失步和过冲现象。

在一个实际的控制系统中,要根据负载的情况来选择步进电机。

步进电机能响应而不失步的最高步进频率称为“启动频率”,于此类似“停止频率”是指系统控制信号突然关断,步进电机不冲过目标位置的最高步进频率。

电机的启动频率、停止频率和输出转矩都要和负载的转动惯量相适应,有了这些数据,才能有效地对电机进行加减速控制。

加速过程有突然施加的脉冲启动频率f0。

步进电机的最高启动频率(突跳频率)一般为0.1 KHz 到3~4KHz ,而最高运行频率则可以达到N*102KHz ,以超过最高启动频率的频率直接启动,会产生堵转和失步的现象。

在一般的应用中,经过大量实践和反复验证,频率如按直线上升或下降,控制效果就可以满足常规的应用要求。

用PLC 实现步进电机的加P 减速控制,实践上就是控制发脉冲的频率。

加速时,使脉冲频率增高,减速则相反。

如果使用定时器来控制电机的速度,加减速控制就是不断改变定时中断的设定值。

速度从v1~v2 变化,如果是线性增加,则按给定的斜率加P 减速;如果是突变,则按阶梯加速处理。

在此过程中要处理好两个问题:
①速度转换时间应尽量短。

为了缩短速度转换的时间,可以采用建立数据表的方法。

结合各曲线段的频率和各段间的阶梯频率,就可以建立一个连续的数据表,并通过转换程序将其转换为定时初始表。

通过在不同的阶段调用相应的定时的初值,就可控制电机的运行。

定时初值的计算是在定时中断外实现的,并不占用中断时间,保证电机的高速运行。

②保证控制速度的精确性。

要从一个速度准确达到另一个速度,就要建立一个校验机制,以防超过或未达到所需速度。

(5)步进电机的换向控制
步进电机换向时,一定要在电机降速停止或降到突跳频率范围之内在换向,以免产生较大的冲击而损坏电机。

换向信号一定要在前一个方向的最后一个脉冲,结束后以及下一个方向的第一个脉冲前发出。

对于脉冲的设计主要要求其有一定的脉冲宽度、脉冲序列的均匀度及高低电平方式。

在某一高速下的正、反向切换实质包含了降速→换向→加速3 个过程。

步进电机有如下特点:
①步进电机的角位移与输入脉冲数严格成正比,因此当它转一转后,没有累计误差,具有良好的跟随性。

②由步进电机与驱动电路组成的开环数控系统,既非常方便、廉价,也非常可靠。

同时,它也可以有角度反馈环节组成高性能的闭环数控系统。

③步进电机的动态响应快,易于启停、正反转及变速。

④速度可在相当宽的范围内平滑调节,低速下仍能保证获得很大的转矩,因此一般可以不用减速器而直接驱动负载。

⑤步进电机只能通过脉冲电源供电才能运行,它不能直接用交流电源或直流电源。

3 硬件电路设计
3.1 系统总体设计框图
3.2 LCD1602显示器
3.2.1 液晶显示器各种图形的显示原理
线段的显示
点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,
每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。

例如屏的第一行的亮暗由RAM区的000H——00FH的16字节的内容决定,当(000H)=FFH 时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,……(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。

这就是LCD显示的基本原理。

字符的显示:
用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。

这样一来就组成某个字符。

但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD 上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。

汉字的显示:
汉字的显示一般采用图形的方式,事先从微机中提取要显示的汉字的点阵码(一般用字模提取软件),每个汉字占32B,分左右两半,各占16B,左边为1、3、5……右边为2、4、6……根据在LCD上开始显示的行列号及每行的列数可找出显示RAM对应的地址,设立光标,送上要显示的汉字的第一字节,光标位置加1,送第二个字节,换行按列对齐,送第三个字节……直到32B显示完就可以LCD上得到一个完整汉字
3.2.2`引脚功能说明
1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表
3.2.3其与单片机的连接如下图所示
3.3 80C51单片机
外部中断
计数器输入
3.4 时钟信号控制电路
如图3.3所示,89C51芯片内部有一个高增益反相放大器,用于构成振荡器。

反相放大器的输入端为XTAL1,输出端为XTAL2,两端跨接石英晶体及两个电容就可以构成稳定的自激振荡器。

电容C1和C2可以稳定频率并对振荡频率有微调作用。

振荡脉冲频率为0到24MHz。

振荡信号从XTAL2端输入到片内的时钟发生器上。

图 3.3 时钟信号控制电路
3.5 驱动电路
如图3.5所示,驱动电路用L298来驱动步进电机,L298 所出产的双全桥步进电机专用驱动芯片,内部包含4信道逻辑驱动电路,是一种二相和四相步进电机的专用驱动器,可同时驱动2个二相或1个四相步进电机,内含二个H-Bridge 的高电压、大电流双全桥式驱动器,接收标准TTL逻辑准位信号,可驱动46V、2A以下的步进电机,且可以直接透过电源来调节输出电压;此芯片可直接由单
片机的IO端口来提供模拟时序信号。

图 3.5 驱动电路引脚功能说明:
3.6显示电路
如图3.6所示,步进电机的转速显示是通过1602来实现的。

1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。

它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。

1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。

1602采用标准的16脚接口,其中:
第1脚:VSS为电源地
第2脚:VCC接5V电源正极
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。

第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。

第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。

第6脚:E(或EN)端为使能(enable)端。

第7~14脚:D0~D7为8位双向数据端。

第15~16脚:空脚或背灯电源。

15脚背光正极,16脚背光负极。

3.7键盘电路
本次设计要对步进电机实现正转、反转和点动等功能,所以设计了键盘按键分别进行步进电机的“正转”、“反转”、“点动”和“停止”。

4 软件系统设计
4.1 主程序流程图
如图4.1是主程序流程图,初始化程序后,有键按下该按键对应值为0,其他按键则为1来进行按键的处理,并且进行控制步进电机的正反转及点动以及停转。

在处理案件的过程中,如有其他键按下,则退出该键的循环改为进入更改过后的按键的处理程序然后调用显示程序显示转过的角度数。

如此进行旋转和显示。

4.2 键盘处理
共设置16键,
0~9数字键设置电机转动转速及相关参数。

EBTER/STOP 确认和暂停
DOP 点动
Z/F 控制电机正反转
BSELECT 设置位数选择
REST 复位键
5 Protues仿真平台简介
Protues软件是英国Labcenter electronics公司出版的EDA工具软件。

它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。

它是目前最好的仿真单片机及外围器件的工具。

虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用
的科技工作者的青睐,Protues是一个能仿真模拟和数字电路,特别是能够仿真单片机、ARM、DSP、FPGA等的软件,它还能和KEIL软件在同一台机子实现联调Protues可提供的仿真仪表资源:示波器、逻辑分析仪、虚拟终端、SP I调试器、I2C调试器、信号发生器、模式发生器、交直流电压表、交直流电流表。

理论上同一种仪器可以在一个电路中随意的调用PROTUES不仅可将许多单片机实例功能形象化,也可将许多单片机实例运行过程形象化。

前者可在相当程度上得到实物演示实验的效果,后者则是实物演示实验难以达到的效果。

它的元器件、连接线路等却和传统的单片机实验硬件高度对应。

这在相当程度上替代了传统的单片机实验教学的功能,例:元器件选择、电路连接、电路检测、电路修改、软件调试、运行结果等。

课程设计、毕业设计是学生走向就业的重要实践环节。

由于PROTUES提供了实验室无法相比的大量的元器件库,提供了修改电路设计的灵活性、提供了实验室在数量、质量上难以相比的虚拟仪器、仪表,因而也提供了培养学生实践精神、创造精神的平台。

因此在不具备实验前可以利用protues 进行仿真的检查。

6 仿真的电路图
7 课程设计总结
本系统主要研究了一种基于单片机的步进电机控制及驱动的电路设计。

设计采用AT89C51单片机作为控制模块的核心,利用单片机编程实现了对步进电机的控制。

由单片机产生的信号经ULN2003A芯片进行功率放大,驱动步进电机工作,同时由数码管同步显示预置数和所转角度,由相应的按键实现预置转速、控制、
清零功能。

系统能够实现:
(1)预设步进电机转速;
(2)启动停止、正转反转等功能的基本控制;
(3)同步显示转过角度;
(4)步进电机处于停止状态时可以对预置数进行清零操作。

在系统设计过程中,力求硬件电路简单,充分发挥软件部分的优势,编程灵活方便来满足系统的要求。

通过实际测试表明本设计系统的性能优于传统步进电机控制器,具有结构简单、可靠性高、实用性强、人机接口简单方便、性价比高等特点。

本设计作品,就是单片机在智能化仪表方面的具体应用,充分体现了单片机的优越之处。

本论文,从硬件设计到软件设计,根据硬件的工作原理及设计原理,对设计的设计方案做了仔细的分析。

8 程序源代码
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ink P3
#define LCDPORT P0
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
unsigned int buffer[32];
uchar buffer2[3];
uchar Point,KeyValue=16,NUM,s1,xc;
uchar code dc_s[9]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09,0x01};
unsigned char code ASCII[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
uint cnt,cnt1,dcc1;
uchar dc,a,dcs;
uint cnt,cnt1,an,dcc,dca,dcc1;
uint ge,shi,bai,qian,wan;
void DELAY(unsigned int N)
{
unsigned int i;
for(i=0;i<N;i++);
}
void WRITE_CMD(unsigned char CMD_BYTE)
{
LCDPORT=CMD_BYTE;
RS=0;
RW=0;
E=1;
_nop_();
E=0;
_nop_();
}
void WRITE_DAT(unsigned char DAT_BYTE)
{
LCDPORT=DAT_BYTE;
RS=1;
RW=0;
E=1;
_nop_();
E=0;
_nop_();
}
void INIT(void)
{
WRITE_CMD(0x38);
DELAY(1000);
WRITE_CMD(0x06);
DELAY(1000);
WRITE_CMD(0x0F);
DELAY(1000);
WRITE_CMD(0x0c);
DELAY(1000);
WRITE_CMD(0x01);
DELAY(1000);
}
void main(void)
{ TMOD=0x11;
TH1=0xFC; //1ms time constant@12M
TL1=0x18;
ET1=1;
TR1=1;
TH0=0xfc; //10ms time constant@12M TL0=0x18;
ET0=1;
TR0=1;
PT0=1;
EA=1;
buffer[3]=0x53;
buffer[4]=0x50;
buffer[5]=0x45;
buffer[6]=0x45;
buffer[7]=0x44;
buffer[9]=0x30;
buffer[10]=0x30;
buffer[11]=0x30;
buffer[12]=0x2f;
buffer[13]=0x4d;
buffer[14]=0x49;
buffer[15]=0x4e;
buffer[24]=0x30;
buffer[25]=0x30;
buffer[26]=0x30;
buffer[27]=0x30;
buffer[28]=0x30;
buffer[29]=0x30;
buffer[30]=0x30;
buffer[31]=0xdf;
INIT();
s1=5;
a=-1;
cnt1=100;
while(1)
{
if(KeyValue<10) // 输入值 { NUM=KeyValue;
KeyValue=16;
switch(s1)
{
case 1:
buffer[1]=ASCII[NUM];
break;
case 2:
buffer[2]=ASCII[NUM];
break;
case 3:
buffer[9]=ASCII[NUM];
break;
case 4:
buffer[10]=ASCII[NUM];
buffer2[1]=NUM;
break;
case 5:
buffer[11]=ASCII[NUM];
buffer2[2]=NUM;
break;
}
}
if(KeyValue==10) //位选
{
KeyValue=16;
s1--;
NUM=0;
}
if(s1==3) s1=5;
}
switch(KeyValue)
{case 15:if(a==-1)
{if(dc==0)
{ ++dcs;
if(dcs>3) dcs=0;
P1=dc_s[dcs];
dcc++;
}
else
{
--dcs;
if(dcs<0) dcs=3;
P1=dc_s[dcs];
dcc++;
}
KeyValue=16;
}
break;
}
}
//键盘中断扫描//
void T1_ISR(void) interrupt 3
{
static unsigned char i,k,in,n,m;
static unsigned char CNT=0,KeyCNT=0;
TH1=0xFC; //1ms time constant@12M
TL1=0x18;
ink=0xf0;
i++;
if(i==16)
{
WRITE_CMD(0xc0);
DELAY(1000);
}
if(i==32)
{
i=0;
WRITE_CMD(0x80);
DELAY(1000);
}
WRITE_DAT(buffer[i]);
if(CNT%5==0)//键盘扫描
{
if(((P3&0xf0)!=0xf0)&&(KeyCNT==0))
KeyCNT++;
switch(KeyCNT)
{case 0:
break;
case 1:if((P3&0xf0)!=0xf0)
{for(m=0;m<4;m++)
{
ink=~(0x01<<m);
for(n=0;n<4;n++)
{
in=ink;
in=in>>(4+n);
if((in&0x01)==0){k=n+m*4;}
}
}
KeyCNT++;
}
else
KeyCNT=0;
break;
case 2:if((P3&0xf0)==0xf0)
{ KeyValue=k;
KeyCNT=0;
}
break;
}
}
if(k==11)
{
buffer2[1]=0;
buffer2[2]=0;
buffer[10]=ASCII[0]; buffer[11]=ASCII[0]; buffer[30]=ASCII[0];
buffer[29]=ASCII[0];
buffer[28]=ASCII[0];
buffer[27]=ASCII[0];
buffer[26]=ASCII[0];
buffer[8]=0x30;
buffer[24]=0x30;
a=-1;
dc=0;
}
if(k==13)//显示切换
{
xc=~xc;
k=16;
}
if(k==14)//方向切换
{
dc=~dc;
dcc1=0;
if(dc==0)
{ buffer[8]=0x30;
buffer[24]=0x30;
}
else
{
buffer[8]=0x2d;
buffer[24]=0x2d;
}
k=16;
}
if(KeyValue==12)//转速计算
{
a=-a;
if(a==1)
{
dcc1=0;
cnt1=7500/(buffer2[2]+buffer2[1]*10); }
KeyValue=16;
}
if(k==15)
{
buffer2[1]=0;
buffer2[2]=0;
buffer[10]=ASCII[0];
buffer[11]=ASCII[0];
if(a==-1)
{if(dc==0)
{ ++dcs;
if(dcs>7) dcs=0;
P1=dc_s[dcs];
dcc1++;
}
else
{
--dcs;
if(dcs<1) dcs=8;
P1=dc_s[dcs];
dcc1++;
}
k=16;
}
}
CNT++;
}
//电机转速输出//
void T0_isr()interrupt 1 {
TH0=0xfc;
TL0=0x18;
if(++cnt<cnt1) return; cnt=0;
if(dc==0)
{
if(a==1)
{
++dcs;
if(dcs>7) dcs=0;
P1=dc_s[dcs];
dcc1++;
}
}
else
{
if(a==1)
{
--dcs;
if(dcs<1) dcs=8;
P1=dc_s[dcs];
dcc1++;
}
}
if(dca!=dcc1)
{ dca=dcc1;
an=45*dcc1;
wan=an/10000;
qian=an%10000/1000;
bai=an%1000/100;
shi=an%100/10;
ge=an%10;
buffer[30]=ASCII[ge];
buffer[29]=ASCII[shi];
buffer[28]=ASCII[bai];
buffer[27]=ASCII[qian];
buffer[26]=ASCII[wan];
}
}。

相关文档
最新文档