人若无名 便可潜心练剑.|

hazy1k

园龄:7个月粉丝:13关注:0

2024-08-21 13:05阅读: 58评论: 0推荐: 0

第7章 步进电机实验

第七章 步进电机实验

1. 步进电机介绍

28BYJ48 步进电机自带减速器, 为五线四相步进电机, 直径为 28mm, 实物如下所示:

屏幕截图 2024 08 05 125656

28BYJ48 电机内部结构等效图如下所示:

屏幕截图 2024 08 05 125728

步进电机旋转控制图:

屏幕截图 2024 08 05 125758

28BYJ48 步进电机旋转驱动方式如下表:

屏幕截图 2024 08 05 125850

28BYJ48 步进电机主要参数如下所示:

屏幕截图 2024 08 05 125948

在上图中 28BYJ48 步进电机主要参数中可以看到有一个减速比: 1:64, 步进角为 5.625/64 度, 如果需要转动一圈, 那么需要 360/5.625*64=4096 个脉冲信号。

减速比这个和之前介绍的直流减速电机有点类似, 所以 28BYJ48 步进电机实际上是: 减速齿轮+步进电机组成, 28BYJ48 步进电机减速齿轮实物图如下所示:

屏幕截图 2024 08 05 130029

减速齿轮计算方法如下所示:

![](file://C:\Users\qiu\AppData\Roaming\marktext\images\2024-08-05-13-01-15-image.png?msec=1724216490133)

2. 硬件设计

本实验使用到硬件资源如下:

  • ULN2003模块

  • ESP32 GPIO

  • 28BYJ48

ULN2003模块电路如下所示:

屏幕截图 2024 08 05 130221

该电路在直流电机实验章节已介绍, 此处不再重复。 本实验使用 J5 端子与28BYJ48 步进电机连接。 J3 端子的 IN1-IN4 与 ESP32 IO 连接。

本章实验使用 ESP32 的 IO15、 2、 0、 14 引脚, 接线如下所示:

屏幕截图 2024 08 05 130330

3. 软件设计

from machine import Pin
import time

# 定义按键控制对象
key1 = Pin(14, Pin.IN, Pin.PULL_UP) # 使用引脚14作为输入,并上拉电阻
key2 = Pin(27, Pin.IN, Pin.PULL_UP)
key3 = Pin(26, Pin.IN, Pin.PULL_UP)
key4 = Pin(25, Pin.IN, Pin.PULL_UP)

# 定义步进电机控制对象
motor_a = Pin(15, Pin.OUT, Pin.PULL_DOWN) # 使用引脚15作为输出,并下拉电阻
motor_b = Pin(2, Pin.OUT, Pin.PULL_DOWN)
motor_c = Pin(0, Pin.OUT, Pin.PULL_DOWN)
motor_d = Pin(4, Pin.OUT, Pin.PULL_DOWN)

# 定义按键键值
KEY1_PRESS,KEY2_PRESS,KEY3_PRESS,KEY4_PRESS = 1,2,3,4
key_en = 1
# 按键扫描函数(前面已经讲过啦)
def key_scan():
    global key_en
    if key_en == 1 and (key1.value() == 0 or key2.value() == 0 or key3.value() == 0 or key4.value() == 0)
    time.sleep_ms(10)
    key_en = 0
    if key1.value() == 0:
        return KEY1_PRESS
    elif key2.value() == 0:
        return KEY2_PRESS
    elif key3.value() == 0:
        return KEY3_PRESS
    elif key4.value() == 0:
        return KEY4_PRESS
    elif key1.value() == 1 and key2.value() == 1 and key3.value() == 1 and key4.value() == 1:
        key_en = 1
    return 0    

# 步进电机发送脉冲函数
def step_motor_send_pulse(step, fx): # step:步进值,fx:步进方向
    temp = step # 保存当前步进值
    if fx == 0: # 如果步进方向为正
        temp = 7 - step # 反转步进值
    # 步进值设定    
    if temp == 0: 
        motor_a.value(1)
        motor_b.value(0)
        motor_c.value(0)
        motor_d.value(0)
    elif temp == 1:
        motor_a.value(1)
        motor_b.value(1)
        motor_c.value(0)
        motor_d.value(0)
    elif temp == 2:
        motor_a.value(0)
        motor_b.value(1)
        motor_c.value(0)
        motor_d.value(0)
    elif temp == 3:
        motor_a.value(0)
        motor_b.value(1)
        motor_c.value(1)
        motor_d.value(0)  
    elif temp == 4:
        motor_a.value(0)
        motor_b.value(0)
        motor_c.value(1)
        motor_d.value(0)
    elif temp == 5:
        motor_a.value(0)
        motor_b.value(0)
        motor_c.value(1)
        motor_d.value(1)    
    elif temp == 6:
        motor_a.value(0)
        motor_b.value(0)
        motor_c.value(0)
        motor_d.value(1)      
    elif temp == 7:
        motor_a.value(1)
        motor_b.value(0)
        motor_c.value(0)
        motor_d.value(1)      

# 主函数
if __name__ == '__main__':
    key = 0 # 按键值初始化
    fx1 = 1 # 步进方向初始化,默认正方向
    STEM_MAX = 1 # 步进最大值
    STEM_MIN = 5 # 步进最小值
    speed1 = STEM_MAX # 步进速度初始化
    step1 = 0 # 步进值初始化
    while True:
        key = key_scan() # 扫描按键
        if key == KEY1_PRESS:
            fx1 =not fx1 # 切换步进方向
        elif key == KEY2_PRESS:
            if speed1 > STEM_MAX:
                speed1 -= 1
        elif key == KEY3_PRESS:
            if speed1 < STEM_MIN:
                speed1 += 1
        step_motor_send_pulse(step1, fx1) # 步进电机发送脉冲
        step1 += 1 # 步进值加1
        if step1 == 8: # 步进值到达最大值则归零
            step1 = 0  # 步进值归零      
        time.sleep_ms(speed1) # 步进速度控制,延时

可以按下KEY1 键调节电机旋转方向; 当按下 KEY2 键, 电机加速; 当按下 KEY3 键, 电机减速。


2024.8.21 第一次修订,后期不再维护

本文作者:hazy1k

本文链接:https://www.cnblogs.com/hazy1k/p/18371386

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   hazy1k  阅读(58)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起