步进电机的驱动

电机是获取动力的来源之一,在某些特殊的应用中,精确地控制电机的转动是控制的难点,例如想让电机转动三周半,这对于普通的直流电机来说是很难实现的,而步进电机只需要简单几个控制脉冲即可轻而易举地完成这个动作。的确,步进电机就是这样一种能“听话”的电机,它在微处理器的控制下,可以产生精确的角位移。也正是由于步进电机的这一特点,使其在诸如打印机、传真机等精密设备中都有广泛的应用。本章以28BYJ48型步进电机为例,介绍其原理和驱动方法。

1 步进电机的特点

我们常见的电机都是连续转动的,而步进电机的转动则是分步进行的,步进电机也因此而得名。步进电机是一种将电脉冲转化为角位移的执行机构,当步进驱动器接收到一个脉冲信号后,就会驱动电机按设定的方向转动一个固定的角度,通过控制脉冲的个数来控制角位移量,从而达到准确定位的目的。另外,通过控制驱动脉冲的频率,也可以控制电机转动的速度。

1.1 步进电机的分类

步进电机在构造上有三种主要类型,即反应式、永磁式和混合式。

1)反应式(VR):定子上有绕组、转子由软磁材料组成。反应式步进电机具有结构简单、成本低、步距角小的优点,但其动态性能差、效率低、发热量大,可靠性较难保证。

2)永磁式(PM):永磁式步进电机的转子用永磁材料制成,转子的极数与定子的极数相同。永磁式步进电机的特点是动态性能好、输出力矩大,但这种电机精度差,步矩角大,一般为7.5°或15°。

3)混合式(HS):混合式步进电机综合了反应式和永磁式的优点,其定子上有多相绕组、转子上采用永磁材料,转子和定子上均有多个小齿以提高步矩精度。混合式步进电机的特点是输出力矩大、动态性能好、步距角小,但其结构复杂、成本相对较高。

步进电机的静态技术指标主要有以下几项:

·相数:产生不同对N、S极磁场的激磁线圈的对数。

·拍数:完成一个磁场周期性变化所需脉冲数或转过一个齿距角所需脉冲数。

·步距角:单个脉冲信号驱动电机转子转动的角位移量。

1.2 步进电机的工作原理

图16-1是步进电机的内部结构示意图。这种电机的转子上有六个凸齿,但没有绕组缠绕,而定子上有八个凸齿,每一个凸齿上均绕有一组线圈。定子线圈绕组的连接方式是在对称齿上的两个线圈进行反相连接,八个齿构成四对,所以称为四相步进电机。

结合图片中的内容,我们来分析一下步进电机的工作原理:

1.当步进电机的A相绕组被激励时,磁通从定子的正相齿,经过软铁芯的转子,以最短的路径流向负相齿。为使磁通路径最短,在磁场力的作用下,转子被迫移动,使最近的一对齿与被激励的一相对准,其状态如图16-1 a所示。

2.在这个位置的基础上,驱动器再次对B相进行激励,这时离B相最接近的转子上的凸齿被吸引,转子会逆时针转动15°,其状态如图16-1 b所示。此时若是D相被激励,则转子会顺时针转动15°,其状态如图16-1 c所示。

3.按照驱动的顺序,当C相被激励时,转子会按照前一步的运动方向继续转动15°。

通过上面的介绍,我们对步进电机的驱动已经有一个基本的理解。通过控制不同相的驱动顺序,可以改变步进电机的转动方向,驱动脉冲的个数会决定电机转动的角度,而两个驱动脉冲的时间间隔决定了电机的转动速度。

1.3 步距角的计算方法

电机步距角(步长)是步进电机的主要性能指标之一,不同的应用场合,对步距角大小的要求不同,步距角越小,步进电机的转动控制就越精确。改变步进电机的相数(绕组数)或转子的极数(齿数)可以改变步距角的大小。它们之间的相互关系可由下式计算:

步距角=360÷(相数×齿数)

我们以图16-1中所示的步进电机为例,相数为4、齿数为6,经计算步距角为15°,电机转一圈需要24步。

2 28BYJ48型步进电机

28BYJ48型步进电机为四相八拍电机,工作电压为DC5V~12V,电机内部配有减速机构,减速比1∶64,其外形如图16-2所示。

2.1 28BYJ48电机性能指标

28BYJ48型步进电机的性能指标详见表16-1。

2.2 28BYJ48电机绕组结构

28BYJ48型步进电机的绕组接线情况如图16-3所示。从图中可以看出,电机共有四相绕组,每个线圈的一个端点连在一起作为公共端用红色线引出,另一个端点分别用橙、黄、粉、蓝四色线引出。要驱动步进电机转动,需要将红色线接+5V电源,再将步进电机的橙、黄、粉、蓝线依次置为低电平,步进电机就会逆时针旋转(输出轴面对自己);反之,如果将步进电机的蓝、粉、黄、橙依次置为低电平,步进电机就会顺时针旋转(输出轴面对自己)。改变两次驱动之间的时间间隔,就可以改变电机的转速。

3 步进电机的驱动

3.1 步进电机的励磁方式

按照步进电机各绕组通电的方式不同,可以将其划分为1相励磁、1–2相励磁等工作方式。

1)1相励磁。这种励磁方式也称为单4拍工作方式,是指在某一驱动瞬间,步进电机只有一相导通,驱动器每发送一个励磁信号,步进电机就旋转一个步距角。这种驱动方式的特点是电能消耗小,但输出转矩小,振动较大。1相励磁时序如表16-2所示。

注:输出轴方向逆时针旋转。

2)1–2相励磁。这种励磁方式也称为单双8拍工作方式,是指在某一驱动瞬间,步进电机的某一相或某两相交替导通,驱动器每发送一个励磁信号,步进电机只旋转半个步距角。这种驱动方式的特点是转动精度高、运行平稳,是大多数步进电机理想的工作方式。1–2相励磁时序如表16-3所示。

注:输出轴方向逆时针旋转。

3.2 步进电机的驱动电路

步进电机的驱动典型电路如图16-4所示。图中集成电路ULN2003是反相达林顿晶体管阵列,用于步进电机的相驱动。ULN2003输入和输出端反相,输出晶体管耐压50V,吸收电流可达500mA,有很强的低电平驱动能力,芯片内部集成有多个钳位二极管,可以避免输出管被感性负载的反向电动势所击穿。 


3.3 步进电机编程实例

按照图16-4所示的原理搭建硬件电路,使用AVR单片机的PD4–PD7端口驱动步进电机的四根相线。本书为简化过程,使用了由ULN2003构成的步进电机驱动模块来实现对步进电机的驱动,但其工作原理与图16-4所示电路完全相同。打开Atmel Studio 6.1软件,新建名为STEPMOTOR的项目,保存在chapter16文件夹中,软件会自动添加源文件STEPMOTOR.c到所建项目中,编辑STEPMOTOR.c源文件,具体代码详见代码清单16-1。程序的目的是通过AVR系统板上的两个按键控制步进电机的正反转,步进电机的转速可以由软件设定。

代码清单16-1 步进电机驱动
/** STEPMOTOR.c 
 * PD4 -PD7 步进电机驱动 S1 、S2 控制方向 
 * Created: 2013/10/28 20:11:25 
 * Author: GAO 
 */ 
#include <avr/io.h> // 包含AVR 头文件 
#define F_CPU 16000000UL // 定义系统时钟 
#include <util/delay.h> // 包含延时函数头文件 
#define beep_SET (PORTB|=0x01) // 置位PB0 (蜂鸣器) 
#define beep_CLR (PORTB&=0xFE) // 清零PB0 
#define uchar unsigned char
#define uint unsigned int uchar LRCTRL; // 左右控制
const uchar table_l[]={0x90,0x80,0xc0,0x40, 0x60,0x20,0x30,0x10}; // 半步工作(顺时针) 
const uchar table_r[]={0x10,0x30,0x20,0x60, 0x40,0xc0,0x80,0x90}; // 半步工作(逆时针) 
void beep_init(void); // 蜂鸣器初始化函数声明 
void step_motor_init(void); // 步进电机驱动初始化函数声明 
void step_motor_diver(void); // 步进电机驱动函数声明 
void single_key_init(void); // 独立按键初始化函数声明 
void key_scan(void); // 独立按键扫描函数声明 

/********** 主函数**********/ 
int main(void) 
{ 
    beep_init();
    single_key_init();
    step_motor_init();
    while(1) 
    { 
        step_motor_diver(); // 驱动步进电机 
        key_scan(); // 扫描按键 
        beep_CLR; // 按键终止后停止按键音 
    } 
} 

/********** 蜂鸣器初始化函数**********/ 
void beep_init(void) 
{ 
    DDRB|=0x01; 
} 

/********** 步进电机驱动初始化函数**********/ 
void step_motor_init(void) 
{ 
    DDRD|=0xF0; 
    LRCTRL=1; // 设定方向,1 为顺时针 
} 

/********** 步进电机驱动函数**********/ 
void step_motor_diver(void) 
{ 
    uchar x; if(LRCTRL==1) 
    { 
        for(x=0;x<8;x++) 
        { 
            PORTD=table_l[x]; 
            _delay_ms(1); // 改变延时时间软件设定转速 
        } 
    } 
    if(LRCTRL==0) 
    { 
        for(x=0;x<8;x++) 
        { 
             PORTD=table_r[x]; 
             _delay_ms(1); // 改变延时时间软件设定转速 
        } 
    } 
} 

/********** 按键初始化函数**********/ 
void single_key_init(void) 
{ 
    DDRD&=0xFC; // 将PD0 、PD1 设为输入 
} 

/********** 按键扫描函数**********/ 
void key_scan(void) 
{ 
    unsigned char KEYNUM; 
    KEYNUM=PIND; // 读PORTD 端口 
    KEYNUM&=0x03; // 保留PORTD 低两位 
    if(KEYNUM==0x02) //S1 按下 
    { 
        beep_SET; // 启动按键音 
        _delay_ms(10); 
        if(KEYNUM==0x02) 
        { 
            LRCTRL=0; // 逆时针转动 
        } 
    } 
    if(KEYNUM==0x01) //S2 按下 
    { 
        beep_SET; // 启动按键音 
        _delay_ms(10); 
        if(KEYNUM==0x01) 
        { 
            LRCTRL=1; // 顺时针转动 
        } 
    } 
} 
/********** 结束**********/

以上代码经编译后下载到AVR系统板上的单片机中,正确连接硬件电路,软件运行后可以看到步进电机已经开始转动,按S1、S2键即可以改变电机转动方向。AVR系统板驱动步进电机的情况如图16-5所示,本例中对步进电机的控制非常简单,如果你有更多的按键资源,也可以继续拓展功能,比如使用另外的按键来调整转速、用AVR系统板上的数码管显示步进电机当前的运行状态等。总之,尽可能地发挥你的想象力,你就会DIY出更多更好的作品出来。

 


评论: