RYMCU

第 18 章 步进电机实验

ronger 4 月前
# Nebula Pi # 步进电机

18.1 步进电机概念

步进电机是将电脉冲信号转变为角位移线位移的开环控制电机,是现代数字程序控制系统中的重要执行元件,应用极为广泛。在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度,称为"步距角",它的旋转是以固定的角度一步一步运行的。

可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的。同时可以通过控制脉冲频率来控制电机转动的速度加速度,从而达到调速的目的。

图 18-1 步进电机图

18.2 步进电机分类

步进电机从其结构形式上可分为反应式步进电机(Variable Reluctance, VR)、永磁式步进电机 (Permanent Magnet, PM)、混合式步进电机(Hybrid Stepping, HS)。

  1. 反应式:

定子上有绕组转子软磁材料组成。结构简单、成本低、步距角小,可达 1.2°、但动态性能差、效率低、发热大,可靠性难保证。

  1. 永磁式

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

  1. 混合式

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

image189.png

图 18-2 4 相步进电机原理图

4 相步进电机内部结构如上图所示,A,B,C,D 四相称为定子,内部 1,2,3,4,5,6 为永磁铁,称为转子。以转子逆时针旋转为例介绍电机的工作原理。

假设初始状态如上图所示,B 闭合,B 相绕阻导通,产生磁性将对定子齿轮产生强有力的吸引,使得 B 对 6 吸引,B'对 3 进行吸引,形成如上图所示的初始状态。而此时转子齿轮 1 将与定子齿轮 A 形成一个 15° 的夹角,2 与 D'之间形成一个 30° 的夹角。紧接着我们断开 B,闭合 A 相,A 对 1 产生最大的吸引力,A'对 4 产生最大的吸引力。最终,A 与 1 对齐,A'与 4 对齐。相当于转子逆时针转动了 15°。此时,2 与 D'之间的夹角由 30° 变成了 15°。紧接着断开 A,闭合 D,2 与 D'对齐,5 与 D 对齐,转子将逆时针再旋转 15°。接着断开 D,闭合 C,转子逆时针旋转 15°。因此可以总结为:经过 B-A-D-C 转子旋转了 45°。这个过程称为四节拍。旋转一圈 360° 需要 360° / 45°= 8 个四节拍。因此,可以计算出一个节拍旋转的角度为: 360°/(8*4)=11.25°。上述工作模式称为单四拍模式。

下面在上述的基础之上进行一下改进,假设在两个节拍之间插入一个新的节拍,例如在 B 断开,A 闭合之间插入一个 AB 同时闭合的节拍,即 B-BA-A。此时 B 对 6 与 A 对 1 具有相同的吸引力,最终将导致 6 和 1 之间的中心线将与 B 和 A 之间的中心线对齐,相当于转子转了 5.625°。 在每个节拍之间插入了一个节拍,即旋转 45° 由原来的 4 拍变成了 8 拍,B-AB-A-AD-D-DC-C-CB。因此,旋转一周 360° 需要 360° / 45°*8 = 64 个节拍,每个节拍旋转 5.625°。上述模式称为八拍模式,与四拍模式相比,由于增加了拍数使得电机扭矩更大,驱动力更强了,旋转精度提高了一倍。

表 18-1 相步进电机真值表

节拍 1 2 3 4 5 6 7 8
四相
B BA A AD D DC C CB
粉 B(P2.5) 闭合 闭合 闭合
蓝 A(P2.4) 闭合 闭合 闭合
橙 D(P2.7) 闭合 闭合 闭合
黄 C(P2.6) 闭合 闭合 闭合
红 VCC 5V 5V 5V 5V 5V 5V 5V 5V
P2 0xDF 0xCF 0xEF 0x5F 0x7F 0x3F 0xBF 0x9F

image190.png

图 18-3 步进电机驱动模块

驱动电机需要一定的驱动电流,一般有两种比较简单的驱动电路。一种为使用三极管驱动,一种为采用专用的驱动芯片,我们这里采用的是第二种方法。如上图所示,采用 ULN2003A 来驱动动直流电机,芯片 U8 的 1-4 为输入端,通过锁存器 U1 连接到单片机的 I/O 口 P2.4~P2.7OUT_A~OUT_D 为输出端连接到电机。输入端为高电平时,输出端为高电平,反之亦然。按照上表的时间顺序来驱动电机。那么这里有一个问题大家可能会问,每个节拍的持续时间是多少呢?理论上将节拍持续时间越小电机的转动速度越快。

表 18-2 相步进电机参数

供电电压 相数 相电阻 Ω 步进角度 减速比 起动频率 P.P.S 转矩 g.cm 噪声 dB 绝缘介电常数
5V 4 50±10% 5.625/64 1:64 ≥550 ≥300 ≤35 600VAC

该电机的参数表中有一个叫起动频率的参数,≥ 550 P.P.S,表示,在每秒 550 个脉冲的情况下,电机可以正常启动。相当于每个脉冲,即每个节拍的持续时间大于等于 1 / 550 = 1.8ms 的情况下,电机可以正常转动。按照上述学到的相关内容我们接下来就可以使直流电机转起来了。

18.3 步进电机试验

这里我们利用定时器来实现电机转动的功能,设置一个 2ms 的定时,每 2ms 执行一个节拍。根据上面的介绍 64 个节拍转动一周,一次,转动一周需要 2ms * 64 =128ms,那么可以得到 1s 可以转 7.8 周。编写代码如下:

/*******************************************************************
*   步进电机转动试验
* ******************************************************************
* 【主芯片】:STC89SC52/STC12C5A60S2
* 【主频率】: 11.0592MHz
*
* 【版  本】: V1.0
* 【作  者】: stephenhugh
* 【网  站】:https://rymcu.taobao.com/
* 【邮  箱】:
*
* 【版  权】All Rights Reserved
* 【声  明】此程序仅用于学习与参考,引用请注明版权和作者信息!
         
*
*******************************************************************/
#include <reg52.h>  
#include <reg52.h>  
 
unsigned char code MotorCode[8]={0xDF,0xCF,0xEF,0x5F,0x7F,0x3F,0xBF,0x9F};
 
#define FOSC 11059200 // 单片机晶振频率  
#define T_2ms (65536 - FOSC/12*2/1000)  // 定时器初始值计算  
 
sbit DU = P0^6;// 数码管段选定义
 
void main(void)
{
       P2 = 0x00;// 关闭所有数码管
       DU = 1;
       DU = 0;// 锁存段
     
       TMOD = 0x01;  // 定时器工作模式配置
       TL0  = T_2ms;
       TH0  = T_2ms>>8;
     
       TR0  = 1;// 启动定时器
       ET0  = 1;// 允许定时器中断
       EA   = 1;// 开总中断
     
       while(1);
}
 
// 定时器1中断函数
void timer0() interrupt 1
{
   static unsigned char index = 0;
         
       TL0  = T_2ms;// 重装初始值
       TH0  = T_2ms>>8;
     
       P2 =MotorCode[index];
       index++;
       if(index >= 8) index = 0;
     
}

图 18-4 电机试验代码

电机连接及驱动芯片如下图所示:

image191.png

图 18-5 电机试验

将程序下载到单片机中,连接好电机。电机转起来了,但是好像有点不对劲,得 8s 左右才能转一圈,和我们预想的不一致。我们回过头来看电机参数表中有一个减速比 1:64,速度减为原来的 1/64。把这个考虑进去就和我们的现象吻合了。

下面我们写一个程序,让电机转动指定的角度,前面我们讲过转动一圈需要 64 个节拍,而减速比为 1:64 ,因此,电机实际转动一圈需要 64 * 64 = 4096 个节拍。所以转动 angle 度所需的节拍数 beats = (angle * 4096) / 360。根据这个公式编写程序如下:

/*******************************************************************
*   步进电机转动试验
* ******************************************************************
* 【主芯片】:STC89SC52/STC12C5A60S2
* 【主频率】: 11.0592MHz
*
* 【版  本】: V1.0
* 【作  者】: stephenhugh
* 【网  站】:https://rymcu.taobao.com/
* 【邮  箱】:
*
* 【版  权】All Rights Reserved
* 【声  明】此程序仅用于学习与参考,引用请注明版权和作者信息!
         
*
*******************************************************************/
#include <reg52.h>  
#include <reg52.h>  
 
unsigned char code MotorCode[8]={0xDF,0xCF,0xEF,0x5F,0x7F,0x3F,0xBF,0x9F};
 
#define FOSC 11059200 // 单片机晶振频率  
#define T_2ms (65536 - FOSC/12*2/1000)  // 定时器初始值计算  
 
sbit DU = P0^6;// 数码管段选定义
 
unsigned long angle  = 180;// 转动角度
unsigned long beats = 0; // 节拍初始值
 
void main(void)
{
       P2 = 0x00;// 关闭所有数码管
       DU = 1;
       DU = 0;// 锁存段
     
       beats = (angle*4096)/360; // 计算节拍数
     
       TMOD = 0x01;  // 定时器工作模式配置
       TL0  = T_2ms;
       TH0  = T_2ms>>8;
     
       TR0  = 1;// 启动定时器
       ET0  = 1;// 允许定时器中断
       EA   = 1;// 开总中断
     
       while(1);
}
 
// 定时器1中断函数
void timer0() interrupt 1
{
   static unsigned char index = 0;
         
       TL0  = T_2ms;// 重装初始值
       TH0  = T_2ms>>8;
       if(beats != 0)
       {
           P2 =MotorCode[index];
           index++;
           if(index >= 8) index = 0;
           beats--;
       }
}

图 18-6 任意角度程序代码

18.4 本章小结

本章学习了步进电机的驱动原理,并编写了驱动,后续可直接使用了。

后发布评论