PWM(脉冲宽度调制)是一种通过调节脉冲占空比来模拟模拟信号的技术。
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-65535duty_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())
# ============ 接线 ============
# 用 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()
# ============ 接线 ============
# 舵机 信号线 → 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()
# ============ 接线 ============
# 电机控制端 → 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()