当时做的一个简单的步进电机驱动实验,仅供参考。
本章节主要对步进电机驱动实验的目的进行介绍,主要从实验内容和实验原理进行展开介绍。
1.1 实验内容
(1) 了解步进电机原理;
(2) 采用任意mcu设计步进电机驱动电路;
(3) 编制步进电机驱动(正反转)程序;
(4) 撰写报告。
本章主要对步进电机驱动实验的原理进行介绍。
步进电机是将电脉冲控制信号转变为角位移或线位移的一种常用的数字控制执行元件,又称为脉冲电机。在驱动电源的作用下,步进电机受到脉冲的控制,其转子的角位移量和速度严格地与输入脉冲的数量和脉冲频率成正比。步进电机每接收一个电脉冲,转子就转过一个相应的角度(步距角)。改变通电顺序可改变步进电动机的旋转方向;改变通电频率可改变步进电动机的转速。因此,通过控制输入电脉冲的数目、频率及电动机绕组的通电顺序就可以获得所需要的转角、转速及转向,利用单片机就可以很容易实现步进电机的开环数字控制。
传统的步进电机控制方法是由触发器产生控制脉冲来进行控制的,但此种控制方法工作方式单一而且难于实现人机交互,当步进电机的参数发生变化时,需要重新进行控制器的设计。因此适合于单片机控制,单片机通过向步进电机驱动电路发送控制信号就能实现对步进电机的控制。
步进电机内部实际产生了一个可以旋转的磁场,如图所示,当旋转磁场依次切换时,转子(rotor)就会随之转动相应的角度。当磁场旋转过快或者转子上所带负载的转动惯量太大时,转子无法跟上步伐,就会造成失步。
步进电机的磁极数量规格和接线规格很多,为简化问题,我们这里就先只以四相步进电机为例进行讨论。所谓四相,就是说电机内部有四对磁极,此外还有一个公共端(COM)接电源,ABCD是四线的接头。而四相电机可以向外引出六条线(两条COM共同接入Vcc),即GND和ABCD,也可以引出五条线,如图所示,所以有六线四相制和五线四相制。
(a)六线四相制 (b) 五线四相制
图2 四相步进电机接线规格
六线四相制和五线四相制控制方法类似。
• 一相励磁方式
下表中,1代表高电平,0代表低电平,我们以最简单的一相励磁方式来驱动步进电机。
表1 一相励磁方式
电机在每个瞬间只有一个线圈导通,消耗电力小,但在切换瞬间没有任何的电磁作用在转子上,容易造成振动,也容易因为惯性而失步。
• 二相励磁方式
这种方式输出的转矩较大且振动较少,切换过程中至少有一个线圈通电作用于转子,使得输出的转矩较大,振动较小,也比一相励磁较为平稳,不易失步。
• 一相二相励磁交替进行
综合上述两种驱动信号,下面提出一相励磁和二相励磁交替进行的方式,每传送一个励磁信号,步进电机前进半个歩距角。其特点是分标率高,运转更加平滑。
表3 一相二相励磁交替进行方式
图3 时序波形图
因为89C51单片机的数字I/O口通过的电流很小,所以89C51单片机的端口是不能直接驱动步进电机的。因此,可以使用晶体管进行放大(或使用专门的集成电路)。常用的方法有三种:
直接利用晶体管来驱动,这需要对电机和晶体管的详细参数有一定了解,才能选择恰当的参数去匹配他们。此外,还必须使用二极管来处理当电机内部线圈产生感应电动势逆向流入晶体管而对晶体管造成损害。
使用诸如ULN2003和L298N 这样的激励器,它实际上是内部集成好了放大功能的集成电路芯片,此外也无需额外添加二极管,因为它已经内置了。
使用光耦,在驱动芯片或者晶体管的前端再加入光耦合器,以加强隔离步进电机的反电动势,以免损害单片机。
图4 加入光耦合器的电路
本章节对步进电机驱动实验的软件部分进行设计。
将89C51单片机的四个输出端口用杜邦线分别链接驱动板的IN1,IN2,IN3,IN4,再用外置电源连接驱动板的5-12+接口,并把电源和单片机的地(GND)与驱动板的(-)共线。
电路连接如下图所示:
图6 步进电机实验电路设计方案
在电路中,步进电机采用了六线四相制连接。
该程序中,步进电机励磁方式采用一相二相励磁交替进行,程序实现了控制步进电机的正反转功能。
电机相序如表4所示:
表4 程序电机相序表
图7 电机驱动程序
电机驱动实验程序代码如下:
#include "reg51.h"
#define uchar unsigned char
#define uint unsigned int
#define out P2 // p2输出
sbit pos=P0^0; // 按键0控制正转
sbit neg=P0^1; // 按键1控制反转
void delayms(uint); // 延时函数
/*
采用一相二相励磁交替进行
相序:
0x02 00000010
0x06 00000110
0x04 00000100
0x0c 00001100
0x08 00001000
0x09 00001001
0x01 00000001
0x03 00000011
*/
uchar code turn[]={0x02,0x06,0x04,0x0c,0x08,0x09,0x01,0x03};
void main(void)
{
uchar i; // 默认值为0
out=0x03; // 初始化 00000011
while(1)
{
if(!pos) // 正转按键按下 pos为0
{
i = i < 8 ? i+1 : 0; // 顺序取出所有相位
out=turn[i];
delayms(50); // 延时,控制转速
} else if(!neg) // 正转按钮松开,反转按钮按下,pos为1,neg为0
{
i = i > 0 ? i-1 : 7; // 反序取出所有的相位
out=turn[i];
delayms(50); // 延时,控制转速
}
}
}
/* 延时函数
通过循环消耗时间
*/
void delayms(uint j)
{
uchar i;
for (;j>0;j--)
{
i=250;
while(--i);
i=249;
while(--i);
}
}
仿真及结果展示:
本实验通过KEIL把源代码编译成HEX文件,然后将HEX文件直接烧写进89C51芯片,然后使用Proteus电路仿真软件进行实验仿真。
仿真过程:
然后在工具栏上点击编译按钮,然后就生成了HEX文件。
2. 在Proteus中绘制步进电机实验电路。
仿真电路如下图所示:
图9 步进电机仿真电路
结果展示:
将HEX文件烧写进89C51芯片后,按下仿真启动按钮,开始仿真。如图11所示。
图11 步进电机仿真运行图
此时,按下D1开关,即可实现电机的正转,按下D2开关,即可实现电机的反转。