1.步进电机
2.分类
- 反应式: 定子上有绕组、转子由软磁材料组成。结构简单、成本低、步距角小,
可达 1.2°、但动态性能差、效率低、发热大,可靠性难保证。 - 永磁式 永磁式步进电机的转子用永磁材料制成,转子的极数与定子的极数相同。其特点是动态性能好、输出力矩大,但这种电机精度差,步矩角大(一般为 7.5° 或 15°),价格较便宜。
- 混合式 混合式步进电机综合了反应式和永磁式的优点,其定子上有多相绕组、转子上采用永磁材料,转子和定子上均有多个小齿以提高步矩精度。其特点是输出力矩大、动态性能好,步距角小,但结构复杂、成本相对较高。
3.4 相步进电机
第一种转法
-
- ABCD 为定子
-
- 123456 为永磁铁称为转子
-
- B 闭合,B 相绕阻导通-> 磁性对定子齿轮产生强吸引力->B 对 6 吸引->B'对 3 吸引-> 形成上图初始状态
-
- 初始状态 A 和齿轮 1 有 15 度夹角,D 与 2 有 30 度夹角
-
- 然后断开 B,接上 A,那么 A 对 齿轮 1 有吸引力,此时 D 和 2 为 15 度夹角,C 和 3 有 30 度夹角,以此达成电机转起来的效果
-
- 经过四项依次闭合接通后(B-A-D-C)最多转 45 度,这个过程称为 4 节拍,转一圈 360 度需要 360/45=8 个四节拍
- 7.因此可以算出一个节拍旋转角度为 360/8/4 = 11.25 度
第二种转法
- 1.B 断开 A 闭合之间插入 AB 同时闭合 B-BA-A
- 2.此时 B 对 6,A 对 1 的磁力相同,此时 AB 各吸 6 和 1 的一半,也就是 11.25/2 = 5.625 度
- 3.这样算一下 360/5.625=64,就是 64 个节拍
3.电路图
-
- 驱动电机需要一定的电流,有两种驱动电路,一种使用三极管(放大作用),一种使用驱动芯片,我们用第二种
-
- 如图 使用 ULN2003AFWG 驱动直流电机
-
- U8 的 1-4 为输入端,连接着锁存器的 Q5-Q8
-
- Q5-Q8 连接着 P2.4~P2.7
-
- OUT1-OUT4 为 ULN2003AFWG 的输出端,连接着步进电机
该电机的参数表中有一个叫起动频率的参数,≥550 P.P.S,表示,在每秒 550 个脉冲的情况下,电机可以正常启动。相当于每个脉冲,即每个节拍的持续时间大于等于 1/550 = 1.8ms 的情况下,电机可以正常转动。按照上述学到的相关内容我们接下来就可以使直流电机转起来了。
4.废话不多说直接上代码
这里我们利用定时器来实现电机转动的功能,设置一个 2ms 的定时,每 2ms
执行一个节拍。根据上面的介绍 64 个节拍转动一周,一次,转动一周需要
2ms*64=128ms,那么可以得到 1s 可以转 7.8 周。编写代码如下:
/*
* @Author: cuihaonan
* @Email: devcui@outlook.com
* @Date: 2021-04-05 22:41:34
* @LastEditTime: 2021-04-05 22:44:57
* @LastEditors: cuihaonan
* @Description: Basic description
* @FilePath: /sdcc-include/src/step/main.c
* @LICENSE: NONE
*/
#include "../../include/STC89xx.h"
#include "../../include/mcs51/lint.h"
unsigned char 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()
{
// 锁存
P2 = 0x00;
DU = 1;
DU = 0;
// 定时器
TMOD = 0x01;
TL0 = T_2ms;
TH0 = T_2ms >> 8;
TR0 = 1;
ET0 = 1;
EA = 1;
while (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;
}
}
将程序下载到单片机中,连接好电机。电机转起来了,但是好像有点不对劲,
得 8s 左右才能转一圈,和我们预想的不一致。我们回过头来看电机参数表中有
一个减速比 1:64,速度减为原来的 1/64。把这个考虑进去就和我们的现象吻合
了。
下面我们写一个程序,让电机转动指定的角度,前面我们讲过转动一圈需要
64 个节拍,而减速比为 1:64,因此,电机实际转动一圈需要 64*64=4096 个节
拍。所以转动 angle 度所需的节拍数 beats = (angle *4096)/360。根据这个公式编
写程序如下:
#include "../../include/STC89xx.h"
#include "../../include/mcs51/lint.h"
unsigned char 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()
{
// 锁存
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)
;
}
void timmer0() __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--;
}
}