АЦП AVR — 10-битный преобразователь последовательного приближения, общий для всех классических ATmega и ATtiny. Его тактовая частота получается из частоты процессора делителем ADPS, а время преобразования, разброс опорных напряжений и предельное сопротивление источника записаны в разделе ADC каждого даташита. Калькулятор собирает эти данные для четырёх популярных микроконтроллеров: ATmega328P (Arduino Uno и Nano), ATmega2560 (Arduino Mega), ATmega32U4 (Leonardo, Pro Micro) и ATtiny85.
Частота АЦП и время преобразования
Частота АЦП — частота процессора, делённая на 2, 4, 8, 16, 32, 64 или 128 (биты ADPS2:0 регистра ADCSRA). Для полного разрешения 10 бит она должна быть от 50 до 200 кГц; выше 200 кГц, до 1 МГц, преобразователь работает быстрее, но с меньшей точностью (ATmega328P, раздел 24.4; таблица 29-15).
| Преобразование | Выборка, такт от начала | Длительность, тактов АЦП |
|---|---|---|
| Первое после включения АЦП | 13,5 | 25 |
| Обычное | 1,5 | 13 |
| С автозапуском | 2 | 13,5 |
Таблица одинакова у ATmega328P (таблица 24-1), ATmega2560 (таблица 26-1) и ATtiny85 (таблица 17-1). Отсюда время одного преобразования:
где N — число тактов из таблицы, D — делитель. Ядро Arduino ставит делитель так, чтобы частота АЦП была 125 кГц: 128 при 16 МГц, 64 при 8 МГц (wiring.c). Тогда обычное преобразование занимает 104 мкс.
Код и опорное напряжение
Результат преобразования по даташиту:
код 0x000 соответствует нулю, 0x3FF — опорному напряжению минус один младший разряд (ATmega328P, раздел 24.7). Опорные напряжения у микроконтроллеров разные:
| Микроконтроллер | AVCC | Внутреннее 1,1 В | Внутреннее 2,56 В | Внешнее AREF |
|---|---|---|---|---|
| ATmega328P | есть | 1,0–1,1–1,2 В | нет | от 1,0 В до AVCC |
| ATmega2560 | есть | 1,0–1,1–1,2 В | 2,4–2,56–2,8 В | от 1,0 В до AVCC |
| ATmega32U4 | есть | нет | 2,4–2,56–2,8 В | от 2,56 В до AVCC |
| ATtiny85 | VCC | 1,0–1,1–1,2 В | 2,3–2,56–2,8 В, при VCC > 3 В | от 2,0 В до VCC |
Значения — из таблиц характеристик АЦП: 29-15 у ATmega328P, 31-9 у ATmega2560, 29-7 у ATmega32U4, 21-8 у ATtiny85. Разброс внутреннего опорного ±10 % напрямую переходит в результат, поэтому при измерении с ним абсолютного напряжения опорное калибруют по известному напряжению.
Источник сигнала
АЦП AVR рассчитан на источники с выходным сопротивлением до 10 кОм (раздел 24.6.1 даташита ATmega328P и такие же разделы остальных): за время выборки внутренний конденсатор должен успеть зарядиться. Делитель напряжения из резисторов по 100 кОм для него слишком высокоомный — либо уменьшите резисторы, либо поставьте конденсатор на вход АЦП, который будет отдавать заряд при выборке. Подобрать делитель поможет калькулятор делителя напряжения, принцип работы и параметры точности АЦП описаны в статье об АЦП.
Датчик температуры ATmega328P
У ATmega328P на канале ADC8 есть датчик температуры; измерять его нужно с внутренним опорным 1,1 В. Типичное напряжение датчика — 242 мВ при −45 °C, 314 мВ при 25 °C и 380 мВ при 85 °C, около 1 мВ на градус, а точность без калибровки — ±10 °C (раздел 24.8, таблица 24-2). Датчик подходит для контроля нагрева кристалла, а не для измерения температуры воздуха.
Частые вопросы
Сколько длится analogRead на Arduino Uno?
Ядро Arduino при 16 МГц ставит делитель 128, и АЦП работает на 125 кГц. Обычное преобразование занимает 13 тактов АЦП — 104 мкс, около 9600 преобразований в секунду. Первое преобразование после включения АЦП длится 25 тактов — 200 мкс.
Можно ли ускорить АЦП AVR?
Да, уменьшив делитель: даташит допускает частоту АЦП до 1 МГц, но полное разрешение 10 бит гарантируется только на 50–200 кГц. Абсолютная погрешность ATmega328P указана как 2 младших разряда при 200 кГц и 4,5 — при 1 МГц (таблица 29-15), поэтому при высокой скорости младшие биты обычно отбрасывают.
Как пересчитать код АЦП в напряжение?
По формуле из даташита ADC = V_IN · 1024 / V_REF: напряжение равно коду, умноженному на V_REF / 1024. При питании 5 В и опорном AVCC один младший разряд — 4,88 мВ, код 512 соответствует 2,5 В. Код 1023 — это V_REF минус один разряд, а не ровно V_REF.
Какое опорное напряжение выбрать?
AVCC — для датчиков, питаемых от того же напряжения (потенциометры, резистивные делители): тогда результат не зависит от нестабильности питания. Внутреннее 1,1 В (у ATmega328P, ATmega2560 и ATtiny85) — для малых сигналов и датчика температуры, но его разброс по даташиту от 1,0 до 1,2 В, поэтому для точных измерений его калибруют. ATmega32U4 вместо 1,1 В имеет 2,56 В.
Источники
- Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B) — 24.4 — частота АЦП 50–200 кГц для 10 бит, 13 и 25 тактов (таблица 24-1); 24.6.1 — источник до 10 кОм; 24.7 — ADC = V_IN · 1024 / V_REF; 24.8 — датчик температуры (таблица 24-2); таблицы 24-3 и 24-5 — опорные и ADPS; таблица 29-15 — 13–260 мкс, 50–1000 кГц, внутреннее опорное 1,0–1,2 В (эталон тестов)
- Microchip (Atmel). ATmega640/1280/1281/2560/2561 datasheet (2549Q) — таблица 26-1 — 13, 25 и 13,5 такта; таблица 26-3 — опорные 1,1 и 2,56 В; таблица 31-9 — 13–260 мкс, 50–1000 кГц, 2,56 В от 2,4 до 2,8 В (эталон тестов)
- Microchip (Atmel). ATmega16U4/32U4 datasheet (Atmel-7766J) — таблица 24-3 — опорные AVCC, AREF и 2,56 В (1,1 В нет); таблица 29-7 — 2,56 В от 2,4 до 2,8 В, внешнее опорное от 2,56 В
- Microchip (Atmel). ATtiny25/45/85 datasheet (2586Q) — таблица 17-1 — такты преобразования; таблица 17-3 — биты REFS2:0; таблица 21-8 — опорные 1,1 и 2,56 В (2,3–2,8 В), внешнее AREF от 2,0 В
- Arduino. ArduinoCore-avr, коммит 11b9130 (github.com/arduino/ArduinoCore-avr) — wiring.c, init(): делитель АЦП для 125 кГц — 128 при 16 МГц, 64 при 8 МГц
Где пригодится
Встроить калькулятор на свой сайт
Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах
<iframe src="https://gaw.ru/embed/avr-adc/" title="АЦП AVR: частота, время преобразования и код напряжения" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/avr-adc/">АЦП AVR: частота, время преобразования и код напряжения</a> — GAW.ru</p>Автоподстройка высоты рамки
Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.
<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>Обновлено .
Нашли ошибку в расчёте?