步进电机及其控制.docx

上传人:b****6 文档编号:5949450 上传时间:2023-01-02 格式:DOCX 页数:15 大小:285.56KB
下载 相关 举报
步进电机及其控制.docx_第1页
第1页 / 共15页
步进电机及其控制.docx_第2页
第2页 / 共15页
步进电机及其控制.docx_第3页
第3页 / 共15页
步进电机及其控制.docx_第4页
第4页 / 共15页
步进电机及其控制.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

步进电机及其控制.docx

《步进电机及其控制.docx》由会员分享,可在线阅读,更多相关《步进电机及其控制.docx(15页珍藏版)》请在冰豆网上搜索。

步进电机及其控制.docx

步进电机及其控制

步进电机及其控制

【实验目的】

熟悉步进电机的结构和驱动方式

掌握用AT89S52来控制步进电机的方法

进一步熟悉EDA实验平台

【实验器材】

EDA实验箱、PC机、DB25-ISP下载线、USB转换线、USB-BLASTER编程器等

软件:

QuatusII、KeiluVision2、ISPlay等

【实验原理】

步进电机(steppingmotor)是一种以脉冲控制的转动设备,由于是以脉冲驱动,很适合以数字或微型计算机来控制,做一又把它当成是一种数字设备。

1、步进电机的结构:

步进电机与一般电机结构类似,除了托架、外壳之外,就是转子和定子,比较特殊的是其转子与定子上有许多细小的齿,如图1所示。

转子为永久磁铁,线圈绕在定子上。

根据线圈的配置,步进电机可以分为2相、4相、5相等,比较常用的是2相的步进电机。

其中包括两组具有中间抽头的线圈,A、com1、

为一组,B、com2、

为另一组。

两相5线式步进电机就是将其中的com1和com2连接。

2、步进电机步进角度的计算

顾名思义,步进电机就是一步步走的电机,其转子与定子的齿,决定了其每步的间距。

若转子上有N个齿,则其齿间距

为:

而步进角度

为:

以常用的2相式50齿步进电机为例,

=360°/50=7.2°

=7.2°/(2×2)=1.8°

3、步进电机的驱动:

步进电机的驱动是靠定子线圈激磁后,将邻近转子上相异磁极吸引过来实现的。

因此,线圈排列的顺序,以及激磁信号的顺序就很重要。

以2相式步进电机为例,其驱动信号有1相驱动、2相驱动和1-2相驱动三种。

 

图4:

步进电机的驱动方式:

1相驱动、2相驱动和1-2相驱动。

(1)、1相驱动:

任何一个时间,只有一组线圈被激磁,其他线圈在休息,因此产生的力矩较小,但这种激磁方式最简单,信号依次为:

1000-0100-0010-0001-1000……(正转)

0001-0010-0100-1000-0001……(反转)

有四种不同的信号呈现周期性的变化。

在AT89S52中产生这种信号,以正转为例,可以先输出“0001”,,经过一小段时间延迟后,让步进电机有足够的时间建立磁场及转动,再输出“0100”,延时…依次循环输出这四种信号即可。

(2)、2相驱动:

任何一个时间,有两组线圈同时被激磁,因此,产生的力矩比1相驱动要大。

其信号依次为:

1100-0110-0011-1001-1100……(正转)

1100-1001-0011-0110-1100……(反转)

信号输出方式与1相驱动类似。

(3)、1-2相驱动:

1-2相驱动的方式又称为“半步驱动”,每个驱动信号只驱动半步。

其驱动信号依次为:

1001-1000-1100-0100-0110-0010-0011-0001……(正转)

1001-0001-0011-0010-0110-0100-1100-1000……(反转)

共有8种信号成周期性的变化,仔细观察可以发现其中的信号是将1相驱动和2相驱动的信号混合而成的。

具体应用时根据不同型号的步进电机采用不同的驱动方式,本EDA实验箱中的步进电机采用1相驱动的方式进行驱动。

4、转速控制

控制步进电机的运行速度,实际上是控制系统发出时钟脉冲的频率或换相的周期,即在加速的过程中,使脉冲的输出频率增加;在减速过程中,使脉冲的输出频率减小。

脉冲信号的频率可以用软件延时来确定。

5、步进电机的驱动电路

AT89S52的输出电流很难驱动步进电机,必须另外设计驱动电路才行,在此我们将采用ULN2003(如图5)驱动步进电机。

一颗ULN2003系列IC包含7个开集极式输出的反相器,而在每个输出端都有一个连接到公共端(VCC)的二极管,作为放电保护电路,每组反相器的内部电路如图6.

图5:

ULN2003

图6:

内部电路

【实验内容】

原理图:

1、根据EDA步进电机步进角度,计算出该步进电机的齿间距和齿数,填入表1;

齿数

齿间距

步进角度

12

30°

15°

2、步进电机的步进和特定角度旋转

(1)将“桌面\EDA实验-51部分-步进电机实验\步进电机实验底层驱动”路径下“LCD1602.sof”文件烧入FPGA中。

具体步骤如下:

a)用USB转换线将USBBLASTER与PC机相连,USBBLASTER的另一端连接到FPGA核心板右下角J12口。

如果连接正常,USBBLASTER绿灯点亮。

b)双击“桌面\EDA实验-51部分-步进电机实验\步进电机实验底层驱动”路径下“LCD1602.qpf”文件,启动QuartusII;

c)单击菜单栏中Tools\Programmer,打开FPGA程序下载窗口;

d)单击界面右上角“HardwareSetup”,在“CurrentlyselectedHardware”下拉列表中选择“USB-Blaster[USB-0]”,激活USB-Blaster,单击“close”关闭;

e)单击“AddFile”,路径选择“桌面\EDA实验-51部分-步进电机实验\步进电机实验底层驱动”,选中文件“LCD1602.sof”,勾选Program/Configure;

f)给EDA主板供电,单击“start”,将底板驱动程序烧录到FPGA中。

g)烧录后不要断电,断电后程序会丢失,需要重新烧录。

(2)利用“程序一.c”代码,创建keil工程,生成“程序一.hex”文件

具体步骤如下:

a)单击“开始\程序”,启动KeiluVision2;

b)单击“Project\NewProject”,创建新工程;

c)新工程保存路径为“桌面\EDA实验-51部分-步进电机实验\程序一”,工程名设为“工程一”,单击“保存”;

d)在弹出的“器件选择窗口”中,

选择“Atmel\AT89S52”,单击“确定”;

e)右键单击窗口右边列表栏中“SourceGroup1”,选择“AddFiletoGroup‘SourceGroup1’”;

f)选中“桌面\EDA实验-51部分-步进电机实验\程序一”路径下“程序一.c”,单击“Add”,然后单击“close”;

g)双击“程序一.c”,打开该文件。

h)单击窗口左上角“BuildTarget”按键,编译程序一;

i)单击窗口左上角图标

,选中“output”面板,选中“CreativeHEX…”,单击“确定”

j)再次单击窗口左上角“BuildTarget”按键,将生成“程序二.Hex”文件;

k)在路径“桌面\EDA实验-51部分-步进电机实验\程序一”下,已经生成“程序二.Hex”文件。

(3)将程序一.hex烧入单片机

具体步骤如下:

a)用DB25-ISP下载线连接单片机ISP程序下载口(EDA主板右下角J15口)和PC机并口,EDA主板右下角S8拨码开关全部拨向ON;

b)在桌面双击图标,启动ISPlay;

c)单击“检测器件”,听到“嘀嘀嘀”,表示器件检测成功;

d)单击“文件”,选择“桌面\EDA实验-51部分-步进电机实验\程序一”路径下“程序一.hex”,单击“打开”;

e)单击“AUTORUN!

”,完成程序的下载;下载完成会听到“嘀嘀嘀”的响声。

完成表2:

操作

步进电机状态

开机

静止

单击按键K1

顺时针每次旋转60

单击按键K5

逆时针每次旋转60

单击按键K9

顺时针每次120

单击按键K13

逆时针旋转两圈

3、步进电机正、反、加速、减速转动控制

通过按键控制步进电机的正转、反转、加速、减速、停止和转动等动作。

(1)将“桌面\EDA实验-51部分-步进电机实验\步进电机实验底层驱动”路径下“LCD1602.sof”文件烧入FPGA中,若上步实验后系统未重启,此步可省略。

具体步骤见前。

(2)利用“程序一.c”代码,创建keil工程,生成程序一.hex文件。

具体步骤见前。

(3)将“桌面\EDA实验-51部分-步进电机实验\程序二”路径下“程序二.hex”烧入单片机。

具体步骤见前。

完成表3:

按键操作

步进电机状态

单击按键K1

反向旋转

单击按键K5

暂停继续

单击按键K9

加速旋转

单击按键K13

减速旋转

4、程序分析设计:

(1)阅读程序一.c,要使单击按键K9时,步进电机逆时针旋转240°,应该如何修改程序?

写出程序代码;

#include"AT89X52.h"

sfrp0=0x80;

sfrp1=0x90;

sfrp2=0xA0;

sfrp3=0xB0;

sbits1=p3^2;//正向步进

sbits2=p3^3;//反向步进

sbits3=p3^4;//正向旋转120°

sbits4=p3^5;//反向旋转2圈

intcon=800;

chardataid1=0,id2=0,id3=0,id4=0;//按键标志

unsignedcharmotorni[8]={0xF2,0xF8,0xF4,0xF1,0xF2,0xF8,0xF4,0xF1};//逆时针

unsignedcharmotorshun[8]={0xF2,0xF1,0xF4,0xF8,0xF2,0xF1,0xF4,0xF8};//顺时针

unsignedcharmotorout[8]={0,0,0,0,0,0,0,0};//电机输出

delay(intt)

{

inti,j;

for(i=0;i

for(j=0;j<10;j++);

}

 

keyscan()

{

inti,j;

/////////////////////////////////////////////按键s1:

正向步进

if(s1==0)

{delay(1000);

while(s1==0);

for(i=0;i<4;i++)

{

p0=motorshun[i];

delay(400);

}

}

/////////////////////////////////////////////按键s2:

反向步进

if(s2==0)

{delay(1000);

while(s2==0);

for(i=0;i<4;i++)

{

p0=motorni[i];

delay(400);

}

}

/////////////////////////////////////////////按键s3:

正向旋转120度

if(s3==0)

{delay(1000);

while(s3==0);

for(j=0;j<4;j++)//将这句改成重复4次,由于每次转动

//60度,所以可以实现正向转动240度

{

for(i=0;i<4;i++)

{

p0=motorshun[i];

delay(400);

}

}

}

/////////////////////////////////////////////按键s4:

反向旋转2圈

if(s4==0)

{delay(1000);

while(s4==0);

for(j=0;j<12;j++)

{

for(i=0;i<4;i++)

{

p0=motorni[i];

delay(400);

}

}

}

}

voidmain()

{

p0=0xff;

while

(1)

{

keyscan();

}

}

 

(2)阅读程序二.c,要实现系统初始化时,步进电机顺时针旋转,怎样修改程序?

写出程序代码;

#include"AT89X52.h"

sfrp0=0x80;

sfrp1=0x90;

sfrp2=0xA0;

sfrp3=0xB0;

sbits1=p3^2;//对应于按键K1反向

sbits2=p3^3;//对应于按键K5停止

sbits3=p3^4;//对应于按键K9加速

sbits4=p3^5;//对应于按键K13减速

intcon=800;

chardataid1=0,id2=0,id3=0,id4=0;//按键标志

unsignedcharmotorni[8]={0xF2,0xF8,0xF4,0xF1,0xF2,0xF8,0xF4,0xF1};//逆时针

unsignedcharmotorshun[8]={0xF2,0xF1,0xF4,0xF8,0xF2,0xF1,0xF4,0xF8};//顺时针

unsignedcharmotorout[8];//电机输出

delay(intt)

{

inti,j;

for(i=0;i

for(j=0;j<10;j++);

}

motor()

{

inti;

if(id2==0)

for(i=0;i<8;i++)

{

p0=motorout[i];

delay(con);

}

elseif(id2==1)

p0=0xff;

}

 

keyscan()

{

inti;

/////////////////////////////////////////////按键s1:

反向

if(s1==0)

{delay(1000);

while(s1==0);

id1++;

if(id1==1)

for(i=0;i<8;i++)

motorout[i]=motorni[i];

elseif(id1==2)

{id1=0;

for(i=0;i<8;i++)

motorout[i]=motorshun[i];}

}

/////////////////////////////////////////////按键s2:

停止继续

if(s2==0)

{delay(900);

while(s2==0);

id2=~id2;

}

/////////////////////////////////////////////按键s3:

加速

if(s3==0)

{delay(900);

while(s3==0);

if(40

con=con/2;

if(con<40)

con=4000;

}

/////////////////////////////////////////////按键s4:

减速

if(s4==0)

{delay(900);

while(s4==0);

if(30

con=con*2;

if(con>4000)

con=40;

}

else{//当扫描按键时,没检测到按键时,

delay(1000);//执行else语句,即正向旋转

for(i=0;i<8;i++)

motorout[i]=motorshun[i];

}

}

voidmain()

{

p0=0xff;

while

(1)

{

keyscan();

motor();

}

}

(3)怎样实现步进电机转速的渐变,完成先递增,后递减?

写出程序代码或画出流程图。

#include"AT89X52.h"

sfrp0=0x80;

sfrp1=0x90;

sfrp2=0xA0;

sfrp3=0xB0;

sbits1=p3^2;//对应于按键K1反向

sbits2=p3^3;//对应于按键K5停止

sbits3=p3^4;//对应于按键K9加速

sbits4=p3^5;//对应于按键K13减速

intcon=800;

chardataid1=0,id2=0,id3=0,id4=0;//按键标志

unsignedcharmotorni[8]={0xF2,0xF8,0xF4,0xF1,0xF2,0xF8,0xF4,0xF1};//逆时针

unsignedcharmotorshun[8]={0xF2,0xF1,0xF4,0xF8,0xF2,0xF1,0xF4,0xF8};//顺时针

unsignedcharmotorout[8]={0xF2,0xF1,0xF4,0xF8,0xF2,0xF1,0xF4,0xF8};//电机输出

delay(intt)

{

inti,j;

for(i=0;i

for(j=0;j<10;j++);

}

motor()

{

inti;

if(id2==0)

for(i=0;i<8;i++)

{

p0=motorout[i];

delay(con);

}

elseif(id2==1)

p0=0xff;

}

speedup()//定义一个加速函数,当转动单位时

//间con大于20时,做加速转动

{

while(con>20)

{con=con/2;

motor();

}

}

speeddown()//定义一个减速函数,当转动单位时

//间con小于4100时,做减速转动

{

while(con<4100)

{con=con*2;

motor();

}

}

voidmain()//最后在main函数中调用

//speedup和speeddown

{

p0=0xff;

while

(1)

{

speedup();

speeddown();

}

}

 

【实验体会】

(1)首先是对keil的使用不是太了解,没有设置环境变量,耽误了很长时间,由于上次人太多,没有亲自上手的机会,虽然耽误了很长时间,但是对软件使用印象更加深刻。

(2)前两个试验修改比较简单,没有遇到多大的困难,在最后一个实验时,没有定义motorout[8],导致在写好加速减速函数时,在main函数中调用没有观察到现象。

(3)实验对步进电机有了直观了解,了解如何通过编程实现对步进电机的控制。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1