普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 675|回复: 0

28byj48-5线步进电机驱动程序,请高人指点

[复制链接]

3

主题

3

帖子

29

积分

新手上路

Rank: 1

积分
29
发表于 2023-11-25 17:23:35 | 显示全部楼层 |阅读模式
'''程序功能:实现5线步进电机驱动正转,反转,K1手动正转,K2手动反转
            K3自动正转,K4自动反转,K3K4同时按(复用)实现停止
   硬件资源:ESP32开发板
   软件资源:MicroPython
   编译时间:2023年11月25日
   版本号  :V1.1
   备   注 :
'''
# 导入模块
from machine import Pin
import time


# 定义按键控制对象
key1=Pin(14,Pin.IN, Pin.PULL_UP)
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)
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)


# 定义LED指示灯
led1 = Pin(13,Pin.OUT)
led2 = Pin(12,Pin.OUT)
led3 = Pin(33,Pin.OUT)
led4 = Pin(32,Pin.OUT)

# 定义全局变量flage
flage = 0

# 步进电机发送脉冲,逆时针转动函数
def motor_countclockwise_rotation (step):
    # 定义临时变量temp等于步数
    temp = step
    # 程序第一步A线圈得电
    if temp==1:
        motor_a.value(1)
        motor_b.value(0)
        motor_c.value(0)
        motor_d.value(0)
    # 第2步AB线圈得电
    elif temp==2:
        motor_a.value(1)
        motor_b.value(1)
        motor_c.value(0)
        motor_d.value(0)
    # 第3步B线圈得电
    elif temp==3:
        motor_a.value(0)
        motor_b.value(1)
        motor_c.value(0)
        motor_d.value(0)
    # 第4步BC线圈得电
    elif temp==4:
        motor_a.value(0)
        motor_b.value(1)
        motor_c.value(1)
        motor_d.value(0)
    # 第5步C线圈得电
    elif temp==5:
        motor_a.value(0)
        motor_b.value(0)
        motor_c.value(1)
        motor_d.value(0)
    # 第6步CD线圈得电
    elif temp==6:
        motor_a.value(0)
        motor_b.value(0)
        motor_c.value(1)
        motor_d.value(1)
    # 第7步D线圈得电
    elif temp==7:
        motor_a.value(0)
        motor_b.value(0)
        motor_c.value(0)
        motor_d.value(1)
    # 第8步AD线圈得电
    elif temp==8:
        motor_a.value(1)
        motor_b.value(0)
        motor_c.value(0)
        motor_d.value(1)
        
# 步进电机发送脉冲,顺时针转动函数
def motor_clockwise_rotation(run):
    temp = run
    # AD得电
    if temp==1:
        motor_a.value(1)
        motor_b.value(0)
        motor_c.value(0)
        motor_d.value(1)
    # D得电
    elif temp==2:
        motor_a.value(0)
        motor_b.value(0)
        motor_c.value(0)
        motor_d.value(1)
    # CD得电
    elif temp==3:
        motor_a.value(0)
        motor_b.value(0)
        motor_c.value(1)
        motor_d.value(1)
    # C得电
    elif temp==4:
        motor_a.value(0)
        motor_b.value(0)
        motor_c.value(1)
        motor_d.value(0)
    # BC得电
    elif temp==5:
        motor_a.value(0)
        motor_b.value(1)
        motor_c.value(1)
        motor_d.value(0)
    # B得电
    elif temp==6:
        motor_a.value(0)
        motor_b.value(1)
        motor_c.value(0)
        motor_d.value(0)
    # AB得电
    elif temp==7:
        motor_a.value(1)
        motor_b.value(1)
        motor_c.value(0)
        motor_d.value(0)
    # A得电
    elif temp==8:
        motor_a.value(1)
        motor_b.value(0)
        motor_c.value(0)
        motor_d.value(0)
   

# key3外部中断函数
def key3_irq(key3):
    # 局部函数引用全局变量要用global申明
    global flage
    # 如果KEY3按下,触发中断,置标志位为1
    flage = 1
   
# key4外部中断函数
def key4_irq(key4):
    # 局部函数引用全局变量要用global申明
    global flage
    # 如果KEY4按下,触发中断,置标志位为2
    flage = 2
   
               
# 主函数,控制步进电机转
if __name__ == "__main__":
    # 定义局部变量
    step1,step2,run1,run2=0,0,0,0
    #配置key3外部中断,下降沿触发
    key3.irq(key3_irq,Pin.IRQ_FALLING)
    #配置key4外部中断,下降沿触发
    key4.irq(key4_irq,Pin.IRQ_FALLING)  #配置key3外部中断
    # 程序大循环,防止程序出现意外,跑飞
    while True :
       # 如果按键K1一直按下,面向步进电机转轴,顺时针转动
        if key1.value()==0:
            #led1点亮
            led1.value(1)
            #进入手动顺转
            motor_clockwise_rotation(run1)
            #步数加1
            run1+=1
            #如果走了8步
            if run1>=9:
                # 步数归0
                run1=0
            # 延时1毫秒
            time.sleep_ms(1)
        # 否则
        else:
            #LED1熄灭
            led1.value(0)
      
       # 如果按键K2一直按下,面向步进电机转轴,逆时针转
        if key2.value()==0:
            # 点亮led2
            led2.value(1)
            # 进入反转子程序
            motor_countclockwise_rotation (step1)
            # 步数加1
            step1+=1
            # 如果走了8步
            if step1>= 9:
                # 步数归0
                step1=0
            # 延时1毫秒
            time.sleep_ms(1)
        # 否则
        else:
            # LED2指示灯熄灭
            led2.value(0)
        
        # 如果标志位为1,K3按下
        if flage==1:
            # 点亮LED3
            led3.value(1)
            # 进入步进电机正转子程序
            motor_clockwise_rotation(run2)
            # 单步加1,步进电机走第一步
            run2+=1
            # 如果走完第8步,步进电机转1圈(一个周期)
            if run2>=9:
                # 将步数置0,为下一周期做好准备
                run2=0
            # 间隔1毫秒,这是步进电机动作1步的时间
            time.sleep_ms(1)
            # 如果按键K3和K4同时按下
            if key3.value() and key4.value() == 0:
               # 标志位置0
               flage = 0
               # led3熄灭
               led3.value(0)
               # led4熄灭
               led4.value(0)
               
        # 如果标志位为2,表示K4按下
        if flage==2:
            # 点亮led4
            led4.value(1)
            # 进入步进电机反转子程序
            motor_countclockwise_rotation (step2)
            # 步数加1,走1步
            step2+=1
            # 如果步进电机走完8步
            if step2>=9:
                # 步数置0
                step2=0
            # 延时1毫秒
            time.sleep_ms(1)
   
        

        
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-29 03:29 , Processed in 0.094981 second(s), 30 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表