ESP32在MicroPython中仅while循环内GPIO引脚可激活问题求助
ESP32 + MicroPython控制TB6612FNG:循环外调用setPower无法维持电机激活状态
我正在使用ESP32搭配MicroPython控制TB6612FNG电机驱动器,已经实现了Motor类并通过setPower方法设置电机功率,但遇到了一个奇怪的问题:只有在while循环内调用setPower(1)时,控制电机的GPIO引脚才会保持高电平以激活电机;如果在循环外调用该方法,引脚无法维持激活状态。
我尝试过添加3秒延迟等待ESP32完成启动,但没有效果。测试代码如下:
from lib.Driver import * from time import sleep_ms as delay delay(3000) # 等待3秒让ESP32完成启动 p = Motor(PORT_1A) # 创建Motor实例 p2 = Motor(PORT_2A) driver = TB6612FNG(p, p2, STBY_A) print("Pin activated") driver.motorB.setPower(1) # 尝试在循环外设置功率为1 while True: delay(1000) # 等待1秒 print("Running...")
观测到的现象
- 在循环外调用
driver.motorB.setPower(1)时,电机无法激活; - 将该调用移至
while循环内,电机可正常激活运行; - 完全移除
while循环时,电机也能激活。
我曾怀疑ESP32无法维持引脚高电平,但即使在循环内设置10秒延迟,引脚也不会回到低电平。以下是可正常运行的代码版本:
from lib.Driver import * from time import sleep_ms as delay p = Motor(PORT_1A) p2 = Motor(PORT_2A) driver = TB6612FNG(p, p2, STBY_A); while True: driver.motorB.setPower(1)
我还尝试了MicroPython的两个最新固件版本(v1.24.1、v1.24.0),问题依旧存在。
以下是我用于控制TB6612FNG H桥的驱动代码:
from machine import Pin, PWM import time PORT_1A = [26,25,27] PORT_2A = [32,4,0] STBY_A = 33 PORT_1B = [15,16,2] PORT_2B = [18,19,23] STBY_B = 17 class Motor: def __init__(self, *args): if len(args)==1 and isinstance(args[0], list): p = args[0] in1 = p[0] in2 = p[1] pwm_pin = p[2] elif len(args)==3: in1 = args[0] in2 = args[1] pwm_pin = args[2] else: raise ValueError("需要3个参数或一个列表") """ 单个电机控制类。 :param in1: 方向控制引脚IN1。 :param in2: 方向控制引脚IN2。 :param pwm_pin: 速度控制PWM引脚。 """ self.in1 = Pin(in1, Pin.OUT) self.in2 = Pin(in2, Pin.OUT) self.pwm = PWM(Pin(pwm_pin), freq=1000) # 1kHz PWM self.direction = 1 # 默认方向 self.stop() # 安全起见,初始化时停止电机 def set_direction(self, direction): """ 设置电机方向。 :param direction: 'forward'为正转,'reverse'为反转。 """ if direction in ['forward', 'reverse']: self.direction = 1 if direction == "forward" else -1 else: raise ValueError("方向必须为'forward'或'reverse'。") def setPower(self, power): """控制电机速度与方向。 参数power范围:-1(最大倒车速度)到1(最大前进速度)。 """ power = max(min(1, power), -1) self.duty_cycle = abs(int(power * 1023)) # 转换为0-1023的PWM值 if power == 0: # 停止电机 self.in1.value(0) self.in2.value(0) self.pwm.duty(0) elif power * self.direction > 0: # 前进 self.in1.value(1) self.in2.value(0) self.pwm.duty(self.duty_cycle) else: # 后退 self.in1.value(0) self.in2.value(1) self.pwm.duty(self.duty_cycle) def stop(self): """ 停止电机。 """ self.in1.off() self.in2.off() self.pwm.duty(0) class TB6612FNG: def __init__(self, *args): if len(args)==1 and isinstance(args[0], list): p = args[0] if len(args[0])==7: ain1 = p[0] ain2 = p[1] pwma = p[2] bin1 = p[3] bin2 = p[4] pwmb = p[5] stby = p[6] else: raise ValueError("需要对应7个引脚的7个参数") elif len(args)==7: ain1 = args[0] ain2 = args[1] pwma = args[2] bin1 = args[3] bin2 = args[4] pwmb = args[5] stby = args[6] elif len(args)==3: self.motorA = args[0] self.motorB = args[1] self.stby = Pin(args[2], Pin.OUT) self.stby.on() else: raise ValueError("需要驱动器的7个引脚或包含所有引脚的列表") """ TB6612FNG双电机驱动器控制类。 :param ain1, ain2, pwma: 电机A的引脚。 :param bin1, bin2, pwmb: 电机B的引脚。 :param stby: 待机(启用)引脚。 """ if(self.motorA is None): self.stby = Pin(stby, Pin.OUT) self.stby.on() # 激活驱动器(退出待机) # 使用Motor类初始化两个电机 self.motorA = Motor(ain1, ain2, pwma) self.motorB = Motor(bin1, bin2, pwmb) def standby_on(self): """激活待机模式。""" self.stby.off() def standby_off(self): """退出待机模式。""" self.stby.on()
内容的提问来源于stack exchange,提问作者jesus
相关产品推荐
相关产品推荐

