步进电机及其控制Word文档格式.docx
《步进电机及其控制Word文档格式.docx》由会员分享,可在线阅读,更多相关《步进电机及其控制Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
/(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:
按键操作
反向旋转
暂停继续
加速旋转
减速旋转
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<
t;
i++)
for(j=0;
j<
10;
j++);
}
keyscan()
inti,j;
/////////////////////////////////////////////按键s1:
正向步进
if(s1==0)
{delay(1000);
while(s1==0);
for(i=0;
4;
{
p0=motorshun[i];
delay(400);
}
}
/////////////////////////////////////////////按键s2:
反向步进
if(s2==0)
while(s2==0);
p0=motorni[i];
/////////////////////////////////////////////按键s3:
正向旋转120度
if(s3==0)
while(s3==0);
for(j=0;
j++)//将这句改成重复4次,由于每次转动
//60度,所以可以实现正向转动240度
for(i=0;
{
p0=motorshun[i];
delay(400);
}
/////////////////////////////////////////////按键s4:
反向旋转2圈
if(s4==0)
while(s4==0);
12;
j++)
p0=motorni[i];
voidmain()
p0=0xff;
while
(1)
{
keyscan();
(2)阅读程序二.c,要实现系统初始化时,步进电机顺时针旋转,怎样修改程序?
//对应于按键K1反向
//对应于按键K5停止
//对应于按键K9加速
//对应于按键K13减速
unsignedcharmotorout[8];
motor()
inti;
if(id2==0)
for(i=0;
8;
p0=motorout[i];
delay(con);
elseif(id2==1)
反向
id1++;
if(id1==1)
motorout[i]=motorni[i];
elseif(id1==2)
{id1=0;
motorout[i]=motorshun[i];
停止继续
{delay(900);
id2=~id2;
加速
if(40<
con<
4100)
con=con/2;
if(con<
40)
con=4000;
减速
if(30<
2000)
con=con*2;
if(con>
4000)
con=40;
else{//当扫描按键时,没检测到按键时,
delay(1000);
//执行else语句,即正向旋转
motor();
(3)怎样实现步进电机转速的渐变,完成先递增,后递减?
写出程序代码或画出流程图。
unsignedcharmotorout[8]={0xF2,0xF1,0xF4,0xF8,0xF2,0xF1,0xF4,0xF8};
speedup()//定义一个加速函数,当转动单位时
//间con大于20时,做加速转动
while(con>
20)
{con=con/2;
speeddown()//定义一个减速函数,当转动单位时
//间con小于4100时,做减速转动
{
while(con<
{con=con*2;
voidmain()//最后在main函数中调用
//speedup和speeddown
speedup();
speeddown();
【实验体会】
(1)首先是对keil的使用不是太了解,没有设置环境变量,耽误了很长时间,由于上次人太多,没有亲自上手的机会,虽然耽误了很长时间,但是对软件使用印象更加深刻。
(2)前两个试验修改比较简单,没有遇到多大的困难,在最后一个实验时,没有定义motorout[8],导致在写好加速减速函数时,在main函数中调用没有观察到现象。
(3)实验对步进电机有了直观了解,了解如何通过编程实现对步进电机的控制。