
ADC(Analog-to-Digital Converter,模数转换器)是一种将连续变化的模拟信号(如电压)转换为离散的数字信号的电子元件。在嵌入式系统中,我们经常需要读取各种传感器(如温度传感器、光敏电阻、电位器等)的模拟输出,这些传感器输出的是连续变化的电压值,而微处理器只能处理数字信号(0 和 1 组成的二进制数据),因此需要通过 ADC 来完成这种转换。
ADC 的转换过程主要包括以下步骤:
采样:按固定时间间隔测量模拟信号的瞬时值
量化:将采样得到的模拟值转换为最接近的离散值(数字量)
编码:将离散值转换为二进制代码
树莓派 Pico 的 RP2040 芯片内置了 3 个 12 位 ADC 通道,这意味着它可以将 0-3.3V 的模拟电压转换为 0-4095(2¹²-1)的数字值,转换精度为 3.3V/4096≈0.805mV
GP26(ADC0)
GP27(ADC1)
GP28(ADC2)
GP29(ADC3/Vsys)- 用于测量板载电压
要运行此示例,你需要:一个 10kΩ 电位器,将电位器的三个引脚分别连接到:
中间引脚 → GP26
一端引脚 → 3.3V
另一端引脚 → GND
当你旋转电位器时,会看到打印的 ADC 值和电压值随之变化,这直观地展示了模拟信号到数字信号的转换过程。
下面是一个使用树莓派 Pico 读取电位器(可变电阻)值的示例,电位器可以提供 0-3.3V 的可变电压,适合演示 ADC 功能。
from machine import Pin, ADC
import time
# 初始化ADC,连接到GP26引脚(ADC0)
adc = ADC(Pin(26))
while True:
# 读取ADC值(0-4095)
adc_value = adc.read_u16() >> 4 # read_u16()返回0-65535,右移4位得到0-4095
# 转换为电压值(0-3.3V)
voltage = adc_value * 3.3 / 4095
# 打印结果
print(f"ADC值: {adc_value}, 电压: {voltage:.2f}V")
# 延迟500ms
time.sleep(0.5)首先导入必要的模块:Pin用于引脚配置,ADC用于 ADC 操作,time用于延时
创建 ADC 对象,指定连接到 GP26 引脚(ADC0 通道)
在循环中:
使用read_u16()读取 16 位 ADC 值(0-65535),然后右移 4 位转换为 12 位值(0-4095)
将 ADC 值转换为对应的电压值(0-3.3V)
打印 ADC 值和对应的电压值
延时 500 毫秒后重复