NodeMCU gpio.pulse模块loop与count参数含义及ESP8266步进电机驱动问询
理解NodeMCU gpio.pulse模块的count和loop参数(附步进电机应用示例)
我之前用这个模块做过双路步进电机驱动,太懂你盯着文档那段话一脸懵的感觉了!先把文档里的逻辑拆解成大白话,再结合实际代码例子,你绝对能秒懂。
核心逻辑拆解
首先明确几个关键点:
gpio.pulse的指令表(就是你说的表b)是以状态编号作为索引的,首个状态是状态1(对应表的索引1,Lua表默认从1开始计数)。- 只有当某个状态同时定义了
count和loop参数时,才会触发循环跳转逻辑,流程是:- 执行该状态的GPIO输出动作+延时。
- 把当前状态的
count值减1。 - 如果
count还没降到0,下一个要执行的状态直接跳转到loop指定的编号,而不是按顺序走下一个索引状态。 - 当
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,输出GPIO1高、GPIO2低,等待100us,
count从200减到199,因为count>0,跳回状态1重复执行,直到count减到0。 - 状态1的
count耗尽后,自动进入状态2,执行GPIO1低、GPIO2高,同样重复200次后,count耗尽进入状态3。
- 进入状态1,输出GPIO1高、GPIO2低,等待100us,
- 慢转阶段:
- 状态3和状态4的逻辑和快转一致,只是
delay改成200us(脉冲周期更长,转速更慢),各自重复100次后进入状态5。
- 状态3和状态4的逻辑和快转一致,只是
- 停止阶段:
- 状态5执行一次GPIO拉低动作,
count减到0后,因为loop为nil,整个脉冲序列结束。
- 状态5执行一次GPIO拉低动作,
额外测试小例子
如果还是有点模糊,先跑这个极简测试:
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
相关产品推荐
相关产品推荐

