如何使用Raspberry Pi Pico精准生成指定长度/周期数的方波
树莓派Pico PIO精准输出指定周期数方波实现方案
核心思路
放弃CPU侧的time.sleep计时逻辑,将周期计数逻辑放到PIO硬件层实现:通过PIO的TX FIFO传入需要输出的周期数,PIO内部循环执行方波输出、自动减计数,计数耗尽后自动停止输出,全程无CPU参与,完全规避软件调度带来的误差。
可直接运行的代码实现
import rp2 from machine import Pin @rp2.asm_pio(set_init=rp2.PIO.OUT_LOW) def square_wave_fixed_length(): pull() # 从TX FIFO读取需要输出的方波周期数 mov(x, osr) # 将周期数存入X寄存器作为循环计数器 loop: set(pins, 1) # 输出高电平,占1个PIO时钟周期 set(pins, 0) # 输出低电平,占1个PIO时钟周期 jmp(x_dec, loop)# 计数器减1,非0则继续循环输出 # 20kHz方波配置:每个方波周期对应2个PIO时钟,因此PIO时钟频率设为 20000 * 2 = 40000 Hz sm = rp2.StateMachine(0, square_wave_fixed_length, freq=40000, set_base=Pin(26)) sm.active(1) # 输出100个周期的20kHz方波,执行以下语句即可 sm.put(100) # 若要输出时长恰好1ms的20kHz方波(20kHz对应每ms 20个周期),执行: # sm.put(20)
精度与使用说明
- 该方案所有输出逻辑由PIO硬件独立执行,不受CPU任务调度、其他中断影响,输出时长误差小于1个PIO时钟周期(本次配置下为25μs),完全满足高精度时序要求。
- 每次需要输出指定长度方波时,仅需调用
sm.put(周期数)即可触发,无需重复启停状态机。 - 若需要调整方波占空比,可在
set(pins, 1)后添加若干个nop()指令延长高电平时长,对应调整StateMachine的freq参数即可。
内容的提问来源于stack exchange,提问作者Chang
相关产品推荐
相关产品推荐

