АЦП: читаем потенциометр и аналоговые датчики

Учимся измерять плавные сигналы — поворот ручки, яркость света, температуру.

АЦП (аналого-цифровой преобразователь, ADC) превращает напряжение на выводе в число, понятное программе.

Цифровое против аналогового

Цифровой вход видит только 0 или 1. Но потенциометр, фоторезистор, термистор выдают плавное напряжение от 0 до 3.3 В. АЦП измеряет это напряжение и переводит в число — например, от 0 до 4095.

Разрядность и диапазон

АЦП ESP32 — 12-разрядный. Это значит, что напряжение делится на 2^12 = 4096 уровней: от 0 (0 В) до 4095 (около 3.3 В при максимальном затухании). Посмотрим, как отсчёты переводятся в вольты:

def raw_to_voltage(raw, vref=3.3, bits=12):
    max_value = (2 ** bits) - 1     # 4095
    return raw / max_value * vref

for raw in (0, 1024, 2048, 3072, 4095):
    v = raw_to_voltage(raw)
    print(f"отсчёт {raw:4d} -> {v:.2f} В")

Вывод:

отсчёт    0 -> 0.00 В
отсчёт 1024 -> 0.83 В
отсчёт 2048 -> 1.65 В
отсчёт 3072 -> 2.48 В
отсчёт 4095 -> 3.30 В

Код чтения на плате

from machine import Pin, ADC
import time

pot = ADC(Pin(34))
pot.atten(ADC.ATTN_11DB)   # расширяем диапазон до ~3.3 В
pot.width(ADC.WIDTH_12BIT) # 12 бит -> 0..4095

while True:
    raw = pot.read()
    voltage = raw / 4095 * 3.3
    print("отсчёт:", raw, " напряжение:", round(voltage, 2), "В")
    time.sleep(0.5)

Зачем atten (затухание)

Без настройки АЦП ESP32 измеряет лишь до ~1.1 В. Параметр atten(ADC.ATTN_11DB) добавляет внутреннее затухание, расширяя измеряемый диапазон примерно до 3.3 В. Это нужно почти всегда, иначе показания «упрутся» в потолок при низком напряжении.

Как работает под капотом

Внутри АЦП работает по принципу последовательного приближения: схема как бы «угадывает» напряжение, сравнивая его с эталонами и уточняя бит за битом — за 12 шагов получается 12-битное число. У ESP32 два блока АЦП, но ADC2 конфликтует с Wi-Fi — при включённой сети используйте выводы ADC1 (GPIO32–39). Точность АЦП ESP32 не идеальна: показания «шумят», и для аккуратных измерений их усредняют по нескольким отсчётам.

Частые ошибки

  • Забыть atten. Диапазон будет ~1.1 В, и значения «насытятся».
  • Брать вывод ADC2 при работающем Wi-Fi. Чтение зависнет или вернёт мусор — берите ADC1.
  • Доверять одному отсчёту. Усредняйте 8–16 чтений для стабильности.

Итог

  • АЦП превращает плавное напряжение в число (на ESP32 — 0–4095).
  • Напряжение = отсчёт / 4095 × опорное (≈3.3 В).
  • atten(ADC.ATTN_11DB) расширяет диапазон до полного.
  • При Wi-Fi используйте ADC1 (GPIO32–39) и усредняйте показания.
Проверьте себя
1. Что делает АЦП (ADC)?
AПревращает число в напряжение
BПревращает аналоговое напряжение на выводе в число
CУсиливает сигнал
DУправляет мотором
2. Какой диапазон значений даёт 12-разрядный АЦП ESP32?
A0–255
B0–1023
C0–4095
D0–65535
3. Почему при включённом Wi-Fi надо использовать выводы ADC1, а не ADC2?
AADC2 медленнее
BБлок ADC2 конфликтует с Wi-Fi и даёт мусор
CADC1 точнее в темноте
DADC2 не существует