收藏

控制步进电机 28BYJ48五线四相步进电机 ULN2003驱动板

分类: 电子元件模块 >> 电机/舵机 发布于 2024-05-15 317次阅读0点赞0收藏

实验原理

与所有电机一样,步进电机也包括固定部分(定子)和活动部分(转子)。定子上有缠绕了线圈的齿轮状突起,而转子为永磁体或可变磁阻铁芯。稍后我们将更深入地介绍不同的转子结构。
步进电机的基本工作原理为:

  • 给一个或多个定子相位通电,线圈中通过的电流会产生磁场,而转子会与该磁场对齐;
  • 依次给不同的相位施加电压,转子将旋转特定的角度并最终到达需要的位置。
    下图显示了其工作原理。首先,线圈 A 通电并产生磁场,转子与该磁场对齐;线圈 B 通电后,转子顺时针旋转 60° 以与新的磁场对齐;线圈 C 通电后也会出现同样的情况。下图中定子小齿的颜色指示出定子绕组产生的磁场方向。

    我们今天用到的是 28BYJ-48 步进电机,

    28BYJ-48 含义:28 指的是电机最大外径,B 指的是步进式电机,Y 指的是永磁式电机,J 指的是减速型电机,48 表示可以四相八拍。换句话说,28BYJ-48 的含义为外径 28 毫米四相八拍式永磁减速型步进电机。

步进电机原理

ABCD为定子,上面绕有线圈,为四相,与之相对应的对面四个定子上面也有线圈,相对应的两个定子之间线圈是相互连接形成一个绕组。

单四拍模式:

如当前为初始状态,B相导通,对0的吸引力最大。
接下来B断开,C导通,1和C相之间夹角最小被吸引过去,被吸引过去之前2和D相之间夹角为1和C相之间夹角的2倍,1被吸引到C以后,2和D之间最近,此时0和A之间的夹角为2和D之间的2倍,
接下来C断开,D导通,2被吸引到D,此时0距离A最近
D断开A导通,0被吸引到A相,至此一个周期完成

双拍工作模式:

每次给两个线圈通电,通过改变通电的线圈从而使步进电机转动 五线四相步进电机:在双拍工作方式下,线圈的通电方式依次是:AB、BC、CD、DA 即单拍工作方式下,线圈的通电方式依次是:A、B、C、D

单双拍(八拍工作方式)

单双拍工作方式就是单拍工作方式和双拍工作方式交替进行。 五线四相步进电机:A、AB、B、BC、C、CD、D、DA;

电路连接

模块引脚 ESP32引脚
IN1 GPIO27
IN2 GPIO14
IN3 GPIO12
IN4 GPIO13
5V 5V(VIN)
GND GND

程序设计

我们先通过代码来了解,如何通过 ULN2003 驱动步进电机转动指定步数,我们已经知道八拍模式下,4096 个节拍转动一圈,那我们如果想要转动半周,也就是 180°,就需要 2048 拍,我们的代码,每次循环走每 8 拍(四拍模式下虽然走的是四拍,但是与八拍转动相同的角度)。因此,我们需要循环 2048/8=256 次,才能转动 180°。
那如果我们想要转动其他角度就可以通过这么一个公式 4096/8 * 角度/360 来计算。

import time
from machine import Pin


a = Pin(13, Pin.OUT)
b = Pin(12, Pin.OUT)
c = Pin(14, Pin.OUT)
d = Pin(27, Pin.OUT)


delay_time = 2 # 这个时间不能设置太小,否则电机来不及响应


print("单四拍模式")
for i in range (256):  # 顺时针转动180度
    a.value(1)
    b.value(0)
    c.value(0)
    d.value(0)
    time.sleep_ms(delay_time)

    a.value(0)
    b.value(1)
    c.value(0)
    d.value(0)
    time.sleep_ms(delay_time)

    a.value(0)
    b.value(0)
    c.value(1)
    d.value(0)
    time.sleep_ms(delay_time)

    a.value(0)
    b.value(0)
    c.value(0)
    d.value(1)
    time.sleep_ms(delay_time)

# 改变脉冲的顺序, 可以方便的改变转动的方向
for i in range (256):  # 逆时针转动转动180度
    a.value(0)
    b.value(0)
    c.value(0)
    d.value(1)
    time.sleep_ms(delay_time)

    a.value(0)
    b.value(0)
    c.value(1)
    d.value(0)
    time.sleep_ms(delay_time)

    a.value(0)
    b.value(1)
    c.value(0)
    d.value(0)
    time.sleep_ms(delay_time)

    a.value(1)
    b.value(0)
    c.value(0)
    d.value(0)
    time.sleep_ms(delay_time)

# 双四拍模式
print("双四拍模式")
for i in range (256):  # 顺时针转动 180 度
    a.value(1)
    b.value(1)
    c.value(0)
    d.value(0)
    time.sleep_ms(delay_time)

    a.value(0)
    b.value(1)
    c.value(1)
    d.value(0)
    time.sleep_ms(delay_time)

    a.value(0)
    b.value(0)
    c.value(1)
    d.value(1)
    time.sleep_ms(delay_time)

    a.value(1)
    b.value(0)
    c.value(0)
    d.value(1)
    time.sleep_ms(delay_time)

print('八拍模式')
for i in range(256):
    a.value(1)
    b.value(0)
    c.value(0)
    d.value(0)
    time.sleep_ms(delay_time)

    a.value(1)
    b.value(1)
    c.value(0)
    d.value(0)
    time.sleep_ms(delay_time)

    a.value(0)
    b.value(1)
    c.value(0)
    d.value(0)
    time.sleep_ms(delay_time)

    a.value(0)
    b.value(1)
    c.value(1)
    d.value(0)
    time.sleep_ms(delay_time)

    a.value(0)
    b.value(0)
    c.value(1)
    d.value(0)
    time.sleep_ms(delay_time)

    a.value(0)
    b.value(0)
    c.value(1)
    d.value(1)
    time.sleep_ms(delay_time)

    a.value(0)
    b.value(0)
    c.value(0)
    d.value(1)
    time.sleep_ms(delay_time)

    a.value(1)
    b.value(0)
    c.value(0)
    d.value(1)
    time.sleep_ms(delay_time)


# 步进电机停止后需要使四个相位引脚都为低电平,否则步进电机会发热
a.value(0)
b.value(0)
c.value(0)
d.value(0)

结果演示

使用第三方模块驱动步进电机

我们也可以使用 ULN2003 的第三方模块驱动步进电机,把代码上传保存 uln2003.py 文件中。

# uln2003.py

import time

# only test for uln2003
class Uln2003:
    FULL_ROTATION = int(4075.7728395061727 / 8)

    HALF_STEP = [
        [1, 0, 0, 0],
        [1, 1, 0, 0],
        [0, 1, 0, 0],
        [0, 1, 1, 0],
        [0, 0, 1, 0],
        [0, 0, 1, 1],
        [0, 0, 0, 1],
        [1, 0, 0, 1],
    ]

    FULL_STEP = [
        [1, 1, 0, 0],
        [0, 1, 1, 0],
        [0, 0, 1, 1],
        [1, 0, 0, 1]
    ]

    def __init__(self, pin1, pin2, pin3, pin4, delay, mode='FULL_STEP'):
        if mode == 'FULL_STEP':
            self.mode = self.FULL_STEP
        else:
            self.mode = self.HALF_STEP
        self.pin1 = pin1
        self.pin2 = pin2
        self.pin3 = pin3
        self.pin4 = pin4
        self.delay = delay  # Recommend 10+ for FULL_STEP, 1 is OK for HALF_STEP

        # Initialize all to 0
        self.reset()

    def step(self, count, direction=1):
        """Rotate count steps. direction = -1 means backwards"""
        if count < 0:
            direction = -1
            count = -count
        for x in range(count):
            for bit in self.mode[::direction]:
                self.pin1(bit[0])
                self.pin2(bit[1])
                self.pin3(bit[2])
                self.pin4(bit[3])
                time.sleep_ms(self.delay)
        self.reset()

    def angle(self, r, direction=1):
        self.step(int(self.FULL_ROTATION * r / 360), direction)

    def reset(self):
        # Reset to 0, no holding, these are geared, you can't move them
        self.pin1(0)
        self.pin2(0)
        self.pin3(0)
        self.pin4(0)

接着在其他程序中调用 Uln2003 这个类即可,代码如下:

from machine import Pin
from uln2003 import Uln2003

motor = Uln2003(pin1=Pin(13), pin2=Pin(12), pin3=Pin(14), pin4=Pin(27), delay=2, mode='HALF_STEP')
motor.angle(180, -1)

结果演示

VIP
购买
建议
意见
联系
客服
在线咨询

您可以与在线客服进行沟通获得帮助

工作日:8:00~22:00节假日:9:00~20:00

微信号: mpyos01

Q Q号: 1401211620

免费
福利
0.027726s