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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:51:01