PWM

PWM(脉冲宽度调制)是一种通过调节脉冲占空比来模拟模拟信号的技术。

  • 用于 LED 亮度调节、电机速度控制、舵机角度控制等
  • MicroPython 的 machine.PWM 提供硬件 PWM 支持

基本用法

# ============ 接线 ============
# 下面以 GP13 为例;接 LED 时长脚经 220Ω 电阻接 GP13、短脚接 GND
# =============================
from machine import Pin, PWM

# 创建 PWM 对象
pwm = PWM(Pin(13))  # 13 号脚

# 设置频率(Hz)
pwm.freq(1000)      # 1 kHz

# 设置占空比(0-65535,对应 0%-100%)
pwm.duty_u16(32768)  # 50% 占空比

# 关闭 PWM
pwm.deinit()

占空比控制

  • duty_u16(value): 16位精度,范围 0-65535
  • duty_ns(value): 纳秒级精度,范围 0-周期
# 占空比计算
max_duty = 65535
percent = 75  # 75%
duty = int(max_duty * percent / 100)
pwm.duty_u16(duty)

# 也可以直接写纳秒
period_ns = 1_000_000  # 1ms 周期(1kHz)
pwm.duty_ns(int(period_ns * 0.75))  # 75% 占空比

频率设置

# 常用频率
pwm.freq(50)    # 50 Hz - 适合舵机
pwm.freq(1000)   # 1 kHz - 适合 LED 调光
pwm.freq(5000)   # 5 kHz - 适合电机

# 读取当前频率
print(pwm.freq())

示例1:LED 呼吸灯

# ============ 接线 ============
# 用 Pico 板载 LED(GP25),不外接元件
# =============================
from machine import Pin, PWM
import time

pwm = PWM(Pin(25))  # Pico 板载 LED
pwm.freq(1000)

try:
    while True:
        # 亮度从 0 到 100%
        for i in range(65536):
            pwm.duty_u16(i)
            time.sleep_us(20)
        # 亮度从 100% 到 0
        for i in range(65535, -1, -1):
            pwm.duty_u16(i)
            time.sleep_us(20)
except KeyboardInterrupt:
    pwm.deinit()

示例2:舵机控制

# ============ 接线 ============
# 舵机 信号线 → GP15;电源与 GND 按模块标注接,注意与 Pico 共地
# =============================
from machine import Pin, PWM
import time

# 舵机频率通常为 50 Hz
pwm = PWM(Pin(15))
pwm.freq(50)

# 0°: 0.5ms 脉冲,90°: 1.5ms,180°: 2.5ms
def set_angle(angle):
    # 映射角度到占空比
    # 0° → 0.5ms, 180° → 2.5ms, 50Hz 周期 20ms
    pulse_ms = 0.5 + (angle / 180) * 2.0
    duty = int((pulse_ms / 20) * 65535)
    pwm.duty_u16(duty)

# 测试
set_angle(0)
print('0°')
time.sleep(1)

set_angle(90)
print('90°')
time.sleep(1)

set_angle(180)
print('180°')
time.sleep(1)

pwm.deinit()

示例3:电机速度控制

# ============ 接线 ============
# 电机控制端 → GP14,电机必须经驱动模块,GPIO 不能直接带动电机
# =============================
from machine import Pin, PWM
import time

# 假设电机控制引脚
pwm = PWM(Pin(14))
pwm.freq(1000)

def set_speed(percent):
    """设置电机速度 0-100%"""
    duty = int(65535 * percent / 100)
    pwm.duty_u16(duty)

# 测试不同速度
set_speed(0)    # 停止
print('停止')
time.sleep(1)

set_speed(25)   # 25%
print('25% 速度')
time.sleep(2)

set_speed(50)   # 50%
print('50% 速度')
time.sleep(2)

set_speed(100)  # 100%
print('100% 速度')
time.sleep(2)

set_speed(0)    # 停止
pwm.deinit()

注意事项

  • 频率选择:
    • LED 调光:1kHz-10kHz(人眼无闪烁)
    • 舵机:50Hz(标准)
    • 电机:1kHz-20kHz(高频噪音小)
  • 占空比范围:0-65535,对应 0%-100%
  • 硬件限制:不同引脚支持的频率范围可能不同
  • 功耗:高占空比会增加功耗,注意散热