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

NodeMCU gpio.pulse模块loop与count参数含义及ESP8266步进电机驱动问询

理解NodeMCU gpio.pulse模块的count和loop参数(附步进电机应用示例)

我之前用这个模块做过双路步进电机驱动,太懂你盯着文档那段话一脸懵的感觉了!先把文档里的逻辑拆解成大白话,再结合实际代码例子,你绝对能秒懂。

核心逻辑拆解

首先明确几个关键点:

  • gpio.pulse的指令表(就是你说的表b)是以状态编号作为索引的,首个状态是状态1(对应表的索引1,Lua表默认从1开始计数)。
  • 只有当某个状态同时定义了count和loop参数时,才会触发循环跳转逻辑,流程是:
    1. 执行该状态的GPIO输出动作+延时。
    2. 把当前状态的count值减1。
    3. 如果count还没降到0,下一个要执行的状态直接跳转到loop指定的编号,而不是按顺序走下一个索引状态。
    4. 当count减到0后,才会按顺序执行当前状态的下一个索引状态。

步进电机变频脉冲示例

假设你要用GPIO1和GPIO2驱动一对两相步进电机,需求是:先快转100步(对应200个脉冲周期,因为两相电机一步需要两个相位切换),再慢转50步,最后停止。直接看代码:

-- 定义双路脉冲序列,状态1开始
local step_seq = {
    -- 状态1:快转相位A,GPIO1高、GPIO2低,脉冲周期100us,重复200次,跳回自身
    [1] = {
        gpio = {[1] = 1, [2] = 0},
        delay = 100,
        count = 200,
        loop = 1
    },
    -- 状态2:快转相位B,GPIO1低、GPIO2高,脉冲周期100us,重复200次,跳回自身
    [2] = {
        gpio = {[1] = 0, [2] = 1},
        delay = 100,
        count = 200,
        loop = 2
    },
    -- 状态3:慢转相位A,GPIO1高、GPIO2低,脉冲周期200us,重复100次,跳回自身
    [3] = {
        gpio = {[1] = 1, [2] = 0},
        delay = 200,
        count = 100,
        loop = 3
    },
    -- 状态4:慢转相位B,GPIO1低、GPIO2高,脉冲周期200us,重复100次,跳回自身
    [4] = {
        gpio = {[1] = 0, [2] = 1},
        delay = 200,
        count = 100,
        loop = 4
    },
    -- 状态5:停止,所有GPIO拉低,执行1次后结束
    [5] = {
        gpio = {[1] = 0, [2] = 0},
        delay = 0,
        count = 1,
        loop = nil
    }
}

-- 初始化GPIO为输出模式
gpio.mode(1, gpio.OUTPUT)
gpio.mode(2, gpio.OUTPUT)

-- 启动脉冲序列,从状态1开始执行
gpio.pulse(step_seq, 1)

执行流程详解

  1. 快转阶段:
    • 进入状态1,输出GPIO1高、GPIO2低,等待100us,count从200减到199,因为count>0,跳回状态1重复执行,直到count减到0。
    • 状态1的count耗尽后,自动进入状态2,执行GPIO1低、GPIO2高,同样重复200次后,count耗尽进入状态3。
  2. 慢转阶段:
    • 状态3和状态4的逻辑和快转一致,只是delay改成200us(脉冲周期更长,转速更慢),各自重复100次后进入状态5。
  3. 停止阶段:
    • 状态5执行一次GPIO拉低动作,count减到0后,因为loop为nil,整个脉冲序列结束。

额外测试小例子

如果还是有点模糊,先跑这个极简测试:

local test_seq = {
    -- GPIO4输出高电平,持续100ms,重复3次
    [1] = {gpio={[4]=1}, delay=100000, count=3, loop=1},
    -- GPIO4输出低电平,持续500ms,执行1次
    [2] = {gpio={[4]=0}, delay=500000, count=1, loop=nil}
}

gpio.mode(4, gpio.OUTPUT)
gpio.pulse(test_seq, 1)

你会看到GPIO4连续亮3次100ms,然后灭500ms,完美对应count和loop的逻辑。

内容的提问来源于stack exchange,提问作者Adrian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:25:09