Перейти к содержанию

АЦП AVR: частота, время преобразования и код напряжения

Выберите микроконтроллер, тактовую частоту и опорное напряжение — калькулятор проверит частоту АЦП, посчитает время преобразования и частоту выборок, переведёт напряжение в код АЦП или обратно и выдаст настройку регистров ADMUX и ADCSRA.

Исходные данные

МГц
В
Что считаем
В

Результат

Код АЦП
512 (0x200)
V_IN · 1024 / V_REF при V_REF = 5 В
Частота АЦП
125 кГцв окне 50–200 кГц для 10 бит
Время преобразования
104 мкс9615 преобразований в секунду
Младший разряд
4,883 мВV_REF / 1024

Код на C (avr-libc)

ADMUX = (1 << REFS0); /* reference, ADC0 */
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); /* enable, f_CPU / 128 */

uint16_t adc_read(void)
{
    ADCSRA |= (1 << ADSC);              /* start a conversion */
    while (ADCSRA & (1 << ADSC)) {}     /* wait for the end */
    return ADC;                         /* ADCL then ADCH */
}

Расчёт выполнен по формулам и данным из источников, приведённых на этой странице, и не заменяет проверку: параметры компонентов у разных производителей и даже партий различаются. Перед применением сверяйте результат с документацией на конкретные детали.

АЦП 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,525
Обычное1,513
С автозапуском213,5

Таблица одинакова у ATmega328P (таблица 24-1), ATmega2560 (таблица 26-1) и ATtiny85 (таблица 17-1). Отсюда время одного преобразования:

t=N⋅DfCPU,t = \frac{N \cdot D}{f_\text{CPU}},

где N — число тактов из таблицы, D — делитель. Ядро Arduino ставит делитель так, чтобы частота АЦП была 125 кГц: 128 при 16 МГц, 64 при 8 МГц (wiring.c). Тогда обычное преобразование занимает 104 мкс.

Код и опорное напряжение

Результат преобразования по даташиту:

ADC=VIN⋅1024VREF,ADC = \frac{V_\text{IN} \cdot 1024}{V_\text{REF}},

код 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
ATtiny85VCC1,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 В.

Источники

  1. 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 В (эталон тестов)
  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 В (эталон тестов)
  3. 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 В
  4. 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 В
  5. 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>

Обновлено .

Нашли ошибку в расчёте?