ADC

ADC(模数转换)用于将模拟信号转换为数字信号。

  • 读取电位器、温度传感器、光线传感器等模拟信号
  • Raspberry Pi Pico 内置 3 个 12 位 ADC 通道(GP26-GP28)

基本用法

# ============ 接线 ============
# 模拟器件(如电位器抽头)→ GP26(ADC0)
# Pico 上只有 GP26 / GP27 / GP28 这三个脚能接模拟量
# =============================
from machine import ADC, Pin

# 创建 ADC 对象
adc = ADC(Pin(26))  # GP26 即 ADC0

# 读取 16 位值(0-65535)
value = adc.read_u16()
print(value)

# 读取原始值(12 位,0-4095)
# 注意:不同板子可能有不同实现
# value_12bit = adc.read()

电压计算

# 参考电压(通常为 3.3V)
VREF = 3.3

# 计算电压
value = adc.read_u16()
voltage = value * VREF / 65535
print(f'电压: {voltage:.2f}V')

读取电池电压

# 假设电池通过分压电路连接到 ADC
# 例如:10kΩ + 10kΩ 分压,测量点在中间

adc = ADC(Pin(26))

# 计算电池电压(分压后)
def read_battery():
    value = adc.read_u16()
    voltage_divided = value * 3.3 / 65535
    battery_voltage = voltage_divided * 2  # 分压比 1:2
    return battery_voltage

print(f'电池电压: {read_battery():.2f}V')

读取电位器

# ============ 接线 ============
# 电位器左端脚 → 3V3 | 右端脚 → GND | 中间脚 → GP26(ADC0)
# =============================
from machine import ADC, Pin
import time

adc = ADC(Pin(26))

while True:
    value = adc.read_u16()
    voltage = value * 3.3 / 65535
    percent = value / 65535 * 100
    print(f'值: {value}, 电压: {voltage:.2f}V, 百分比: {percent:.1f}%')
    time.sleep(0.5)

读取温度传感器

# ============ 接线 ============
# 不用接任何器件 —— 传感器在芯片内部(通道 4)
# =============================
from machine import ADC, Pin
import time

# 使用 Pico 内置温度传感器(RP2040 芯片内部)
# 注意:不同板子的实现可能不同

temp_sensor = ADC(4)  # 通道 4 = 芯片内部温度传感器,不对应任何 GPIO

# 温度转换函数
def read_temperature():
    # 参考:RP2040 数据手册
    value = temp_sensor.read_u16()
    voltage = value * 3.3 / 65535
    # 温度公式:T = 27 - (V - 0.706)/0.001721
    temperature = 27 - (voltage - 0.706) / 0.001721
    return temperature

while True:
    temp = read_temperature()
    print(f'温度: {temp:.1f}°C')
    time.sleep(1)

读取光线传感器

# ============ 接线 ============
# 光敏电阻与固定电阻分压,分压点 → GP26(ADC0)
# =============================
from machine import ADC, Pin
import time

# 假设使用光敏电阻 + 固定电阻的分压电路
adc = ADC(Pin(26))

while True:
    value = adc.read_u16()
    # 值越小,光线越强
    light_level = 100 - (value / 65535 * 100)
    print(f'光线强度: {light_level:.1f}%')
    time.sleep(1)

平滑滤波

# ============ 接线 ============
# 模拟器件 → GP26(ADC0),接法与「读取电位器」相同
# =============================
from machine import ADC, Pin
import time

adc = ADC(Pin(26))

# 移动平均滤波
def read_smoothed(samples=10):
    values = []
    for _ in range(samples):
        values.append(adc.read_u16())
        time.sleep_ms(10)
    return sum(values) / len(values)

while True:
    smooth_value = read_smoothed()
    voltage = smooth_value * 3.3 / 65535
    print(f'平滑值: {smooth_value:.0f}, 电压: {voltage:.2f}V')
    time.sleep(0.5)

注意事项

  • 输入电压范围:ADC 输入电压必须在 0V-3.3V 之间,超过会损坏芯片
  • 精度:Pico 的 ADC 是 12 位,但 read_u16() 返回 16 位值(高位补零)
  • 噪声:模拟信号容易受干扰,建议:
    • 使用屏蔽线
    • 增加滤波电容
    • 多次采样取平均值
  • 引脚:Pico 的 ADC 引脚为 GP26 (ADC0)、GP27 (ADC1)、GP28 (ADC2)