RYMCU

NO17.步进电机实验-NEBULA-VSCODE

devcui 1 年前
# nebula-vscode

所属作品集

1.步进电机

image.png

2.分类

  1. 反应式: 定子上有绕组、转子由软磁材料组成。结构简单、成本低、步距角小,
    可达 1.2°、但动态性能差、效率低、发热大,可靠性难保证。
  2. 永磁式 永磁式步进电机的转子用永磁材料制成,转子的极数与定子的极数相同。其特点是动态性能好、输出力矩大,但这种电机精度差,步矩角大(一般为 7.5° 或 15°),价格较便宜。
  3. 混合式 混合式步进电机综合了反应式和永磁式的优点,其定子上有多相绕组、转子上采用永磁材料,转子和定子上均有多个小齿以提高步矩精度。其特点是输出力矩大、动态性能好,步距角小,但结构复杂、成本相对较高。

3.4 相步进电机

image.png

第一种转法

    1. ABCD 为定子
    1. 123456 为永磁铁称为转子
    1. B 闭合,B 相绕阻导通-> 磁性对定子齿轮产生强吸引力->B 对 6 吸引->B'对 3 吸引-> 形成上图初始状态
    1. 初始状态 A 和齿轮 1 有 15 度夹角,D 与 2 有 30 度夹角
    1. 然后断开 B,接上 A,那么 A 对 齿轮 1 有吸引力,此时 D 和 2 为 15 度夹角,C 和 3 有 30 度夹角,以此达成电机转起来的效果
    1. 经过四项依次闭合接通后(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.电路图

image.png

    1. 驱动电机需要一定的电流,有两种驱动电路,一种使用三极管(放大作用),一种使用驱动芯片,我们用第二种
    1. 如图 使用 ULN2003AFWG 驱动直流电机
    1. U8 的 1-4 为输入端,连接着锁存器的 Q5-Q8
    1. Q5-Q8 连接着 P2.4~P2.7
    1. OUT1-OUT4 为 ULN2003AFWG 的输出端,连接着步进电机

image.png

该电机的参数表中有一个叫起动频率的参数,≥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--;
    }
}

所属作品集

后发布评论