You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 13:11:04