|
'''程序功能:实现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)
|
|