第7章 步进电机实验
第七章 步进电机实验
1. 步进电机介绍
28BYJ48 步进电机自带减速器, 为五线四相步进电机, 直径为 28mm, 实物如下所示:
28BYJ48 电机内部结构等效图如下所示:
步进电机旋转控制图:
28BYJ48 步进电机旋转驱动方式如下表:
28BYJ48 步进电机主要参数如下所示:
在上图中 28BYJ48 步进电机主要参数中可以看到有一个减速比: 1:64, 步进角为 5.625/64 度, 如果需要转动一圈, 那么需要 360/5.625*64=4096 个脉冲信号。
减速比这个和之前介绍的直流减速电机有点类似, 所以 28BYJ48 步进电机实际上是: 减速齿轮+步进电机组成, 28BYJ48 步进电机减速齿轮实物图如下所示:
减速齿轮计算方法如下所示:

2. 硬件设计
本实验使用到硬件资源如下:
-
ULN2003模块
-
ESP32 GPIO
-
28BYJ48
ULN2003模块电路如下所示:
该电路在直流电机实验章节已介绍, 此处不再重复。 本实验使用 J5 端子与28BYJ48 步进电机连接。 J3 端子的 IN1-IN4 与 ESP32 IO 连接。
本章实验使用 ESP32 的 IO15、 2、 0、 14 引脚, 接线如下所示:
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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步