Как работает АЦП микроконтроллера?
Обновлено Редакция GAW
АЦП микроконтроллера — это компаратор, конденсатор выборки и регистр, который подбирает код. Он не «измеряет» напряжение напрямую: он запоминает его на конденсаторе и затем, бит за битом, сравнивает с долями опорного напряжения, пока не найдёт ближайший код. Поэтому такой преобразователь называют АЦП последовательного приближения — SAR. Разберём на ATmega328P, микроконтроллере Arduino Uno, а затем сравним с ESP32.
Шаг 1: выборка
Через мультиплексор выбранный вход подключается к конденсатору выборки-хранения. По даташиту ATmega328P выборка происходит через 1,5 такта АЦП после старта, и конденсатор должен успеть зарядиться: Microchip рекомендует источник сигнала с сопротивлением около 10 кОм и ниже, иначе время выборки растёт непредсказуемо. Делитель на 100 кОм даст заниженный результат — не потому, что АЦП плохой, а потому, что конденсатор не успел зарядиться. Как это считать — в словаре: время выборки.
Шаг 2: подбор кода
Дальше вход отключается, и логика подбирает код: сначала проверяет, больше ли напряжение половины опорного, потом четверти и так далее — по одному такту на бит. У ATmega328P обычное преобразование занимает 13 тактов АЦП, первое после включения — 25. Тактовая частота АЦП задаётся предделителем от 2 до 128 и для полного разрешения должна лежать в 50–200 кГц. В Arduino при 16 МГц стоит предделитель 128: 125 кГц, одно измерение — 13 тактов, 104 мкс (наш расчёт); калькулятор АЦП AVR посчитает другие варианты.
Шаг 3: опорное напряжение
Код — это доля опорного напряжения, а не вольты:
У ATmega328P опорным может быть AVCC, внутренний источник 1,1 В или внешнее напряжение на AREF. Если опорное — питание от USB, то «плавает» и результат; что с этим делать, разобрано в ответе «С какой точностью Arduino измеряет напряжение».
Точность и разрядность: ATmega328P против ESP32
| ATmega328P | ESP32 | |
|---|---|---|
| Разрядность | 10 бит | 12 бит |
| Каналов | 8 (6 в корпусе DIP) | до 18 |
| Скорость | до 15 kSPS при полном разрешении | 200 ksps (RTC), 2 Msps (DIG) |
| Опорное | AVCC, 1,1 В, AREF | внутреннее, диапазон задаёт ослабление входа (atten 0–3) |
| Нелинейность | INL 0,5 LSB, DNL 0,25 LSB | INL ±12 LSB, DNL ±7 LSB |
| Абсолютная точность | 2 LSB при 200 кГц | ±6 % между чипами; после калибровки ±23…±60 мВ |
Разрядность не равна точности. У ESP32 кодов в четыре раза больше, но по даташиту нелинейность достигает ±12 LSB, а без калибровки два чипа расходятся на ±6 %. Поэтому для ESP32 важнее не биты, а калибровка по eFuse и выбор ослабления под диапазон сигнала — об этом статья АЦП ESP32 и калькулятор.
Похожие вопросы
Почему АЦП AVR нельзя тактировать быстрее 200 кГц?
Можно, но с потерей точности: по даташиту для полного 10-битного разрешения тактовая частота АЦП должна лежать в 50–200 кГц. Таблица характеристик это подтверждает — абсолютная точность 2 LSB при 200 кГц и 4,5 LSB при 1 МГц. Если хватает 8 бит, предделитель уменьшают ради скорости.
Чем на практике 10 бит отличаются от 12 бит?
Числом ступеней: 1024 против 4096. При опорном 5 В шаг 10-битного АЦП ATmega328P — около 4,9 мВ (наш расчёт). Но разрядность не равна точности: у ESP32 12 бит, а интегральная нелинейность по даташиту достигает ±12 LSB, и без калибровки показания двух чипов расходятся на ±6 %.
Что покажет АЦП, если подать напряжение выше опорного?
Максимальный код: 0x3FF у ATmega328P — по даташиту он соответствует опорному напряжению минус один LSB, и всё, что выше, срезается. Вход при этом не должен выходить за 0–VCC. У ESP32 при максимальном ослаблении (atten = 3) выше примерно 2450 мВ (код 3000) точность падает, а на выводы нельзя подавать больше 3,6 В.
Источники
- Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B, 2020) — разд. 24.1–24.2 — 10-битный АЦП последовательного приближения, 8 входов через мультиплексор, выборка-хранение, время преобразования 13–260 мкс, до 15 kSPS при полном разрешении, опорное 1,1 В, AVCC или AREF, диапазон входа 0–VCC; разд. 24.4 — тактовая частота АЦП 50–200 кГц для полного разрешения, предделитель 2–128, обычное преобразование 13 тактов, первое после включения 25, выборка через 1,5 такта; табл. 24-1; разд. 24.6.1 — источник сигнала около 10 кОм и ниже; разд. 24.6.3 — смещение, усиление, INL, DNL, ошибка квантования ±0,5 LSB; разд. 24.7 — ADC = VIN · 1024 / VREF; табл. 29-15 — абсолютная точность 2 LSB при 200 кГц и 4,5 LSB при 1 МГц, INL 0,5 LSB, DNL 0,25 LSB
- Espressif. ESP32 Series Datasheet v5.3 — разд. 4.9.1 — два 12-битных SAR АЦП, до 18 каналов; табл. 4-3 — DNL ±7 LSB, INL ±12 LSB при внешнем конденсаторе 100 нФ и выключенном радио, частота выборки 200 ksps (RTC) и 2 Msps (DIG); разброс ±6 % между чипами; табл. 4-4 — после калибровки по eFuse Vref полная ошибка ±23 мВ (100–950 мВ), ±30 мВ (100–1250 мВ), ±40 мВ (150–1750 мВ), ±60 мВ (150–2450 мВ); выше 3000 кодов при atten = 3 точность хуже
Нашли ошибку? ·
Смотрите также
- АЦП последовательного приближенияВыборка и подбор кода бит за битом: такты, скорость, источник сигнала
- АЦП AVR: ADPS и кодЧастота АЦП, время преобразования, код по напряжению, ADMUX и ADCSRA
- АЦП ESP32Каналы ADC1 и ADC2, ослабление, калибровка, нелинейность, Wi-Fi и analogRead
- С какой точностью Arduino измеряет напряжение?АЦП — около 0,2 %, опорное — до 7–9 % без калибровки
- АЦП ESP32: ослабление и делительОслабление по напряжению, делитель, погрешность на входе, код Arduino и ESP-IDF
- Время выборки АЦПЗаряд конденсатора выборки и сопротивление источника