'''
实验名称：PWM与按键控制控制42步进电机
版本：v1.0
作者：01Studio
实验平台：01Studio CanMV K230
说明：通过按键控制42步进电机的正反转，并在每次按下按键时改变方向，持续输出脉冲信号以实现360度转动。
'''

from machine import Pin, PWM
from machine import FPIOA
import time

# 配置引脚42为PWM0功能（step脉冲）
fpioa = FPIOA()
fpioa.set_function(42, FPIOA.PWM0)

# 配置引脚43为PWM1功能（dir方向）
fpioa.set_function(43, FPIOA.PWM1)

# 构建步进电机PWM对象，通道0，频率为2000Hz，占空比为50%，默认使能输出
Step = PWM(0, 2000, 50, enable=True)

# 构建方向控制PWM对象，通道1，频率为2000Hz，占空比为50%，默认使能输出
Dir = PWM(1, 20, 50, enable=True)

# 将GPIO52、GPIO21配置为普通GPIO模式
fpioa.set_function(52, FPIOA.GPIO52)  # LED
fpioa.set_function(21, FPIOA.GPIO21)  # KEY

LED = Pin(52, Pin.OUT)  # 构建LED对象, 开始熄灭
KEY = Pin(21, Pin.IN, Pin.PULL_UP)  # 构建KEY对象

state = 0  # LED引脚状态
direction = True  # 步进电机方向

while True:
    if KEY.value() == 0:  # 按键被按下
        time.sleep_ms(10)  # 消除抖动
        if KEY.value() == 0:  # 确认按键被按下
            state = not state  # 使用not语句而非~语句
            LED.value(state)  # LED状态翻转
            print('KEY')

            # 改变步进电机方向
            direction = not direction
            Dir.duty(50 if direction else 0)  # 设置方向

            while not KEY.value():  # 检测按键是否松开
                pass

    # 持续输出脉冲信号以实现360度转动
    Step.freq(2000)
    time.sleep_ms(10)  # 控制转动速度
