步进电机及其控制.docx
- 文档编号:5949450
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:15
- 大小:285.56KB
步进电机及其控制.docx
《步进电机及其控制.docx》由会员分享,可在线阅读,更多相关《步进电机及其控制.docx(15页珍藏版)》请在冰豆网上搜索。
步进电机及其控制
步进电机及其控制
【实验目的】
熟悉步进电机的结构和驱动方式
掌握用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)实验对步进电机有了直观了解,了解如何通过编程实现对步进电机的控制。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 步进 电机 及其 控制